aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-04-14 21:41:27 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-06-22 18:20:56 +0000
commitbdd1243df58e60e85101c09001d9812a789b6bc4 (patch)
treea1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp
parent781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff)
parente3b557809604d036af6e00c60f012c2025b59a5e (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp b/contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp
index b850591b4aa6..590f62ca58dd 100644
--- a/contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp
+++ b/contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp
@@ -215,7 +215,7 @@ private:
if (LHS.getHash() != RHS.getHash())
return LHS.getHash() < RHS.getHash();
FunctionComparator FCmp(LHS.getFunc(), RHS.getFunc(), GlobalNumbers);
- return FCmp.compare() == -1;
+ return FCmp.compare() < 0;
}
};
using FnTreeType = std::set<FunctionNode, FunctionNodeCmp>;
@@ -493,12 +493,11 @@ static Value *createCast(IRBuilder<> &Builder, Value *V, Type *DestTy) {
assert(SrcTy->getStructNumElements() == DestTy->getStructNumElements());
Value *Result = PoisonValue::get(DestTy);
for (unsigned int I = 0, E = SrcTy->getStructNumElements(); I < E; ++I) {
- Value *Element = createCast(
- Builder, Builder.CreateExtractValue(V, makeArrayRef(I)),
- DestTy->getStructElementType(I));
+ Value *Element =
+ createCast(Builder, Builder.CreateExtractValue(V, ArrayRef(I)),
+ DestTy->getStructElementType(I));
- Result =
- Builder.CreateInsertValue(Result, Element, makeArrayRef(I));
+ Result = Builder.CreateInsertValue(Result, Element, ArrayRef(I));
}
return Result;
}
@@ -775,7 +774,12 @@ void MergeFunctions::writeAlias(Function *F, Function *G) {
auto *GA = GlobalAlias::create(G->getValueType(), PtrType->getAddressSpace(),
G->getLinkage(), "", BitcastF, G->getParent());
- F->setAlignment(MaybeAlign(std::max(F->getAlignment(), G->getAlignment())));
+ const MaybeAlign FAlign = F->getAlign();
+ const MaybeAlign GAlign = G->getAlign();
+ if (FAlign || GAlign)
+ F->setAlignment(std::max(FAlign.valueOrOne(), GAlign.valueOrOne()));
+ else
+ F->setAlignment(std::nullopt);
GA->takeName(G);
GA->setVisibility(G->getVisibility());
GA->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
@@ -822,12 +826,18 @@ void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
removeUsers(F);
F->replaceAllUsesWith(NewF);
- MaybeAlign MaxAlignment(std::max(G->getAlignment(), NewF->getAlignment()));
+ // We collect alignment before writeThunkOrAlias that overwrites NewF and
+ // G's content.
+ const MaybeAlign NewFAlign = NewF->getAlign();
+ const MaybeAlign GAlign = G->getAlign();
writeThunkOrAlias(F, G);
writeThunkOrAlias(F, NewF);
- F->setAlignment(MaxAlignment);
+ if (NewFAlign || GAlign)
+ F->setAlignment(std::max(NewFAlign.valueOrOne(), GAlign.valueOrOne()));
+ else
+ F->setAlignment(std::nullopt);
F->setLinkage(GlobalValue::PrivateLinkage);
++NumDoubleWeak;
++NumFunctionsMerged;