diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-04-14 21:41:27 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-06-22 18:20:56 +0000 |
commit | bdd1243df58e60e85101c09001d9812a789b6bc4 (patch) | |
tree | a1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp | |
parent | 781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff) | |
parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp | 28 |
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; |