summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/CloneFunction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Utils/CloneFunction.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/CloneFunction.cpp22
1 files changed, 9 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneFunction.cpp b/llvm/lib/Transforms/Utils/CloneFunction.cpp
index f4803028f3c..60b988e880b 100644
--- a/llvm/lib/Transforms/Utils/CloneFunction.cpp
+++ b/llvm/lib/Transforms/Utils/CloneFunction.cpp
@@ -103,25 +103,21 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges,
TypeMapper, Materializer));
- SmallVector<std::pair<unsigned, AttributeSetNode*>, 4> AttrVec;
AttributeList OldAttrs = OldFunc->getAttributes();
-
- // Copy the return attributes.
- if (auto *RetAttrs = OldAttrs.getRetAttributes())
- AttrVec.emplace_back(AttributeList::ReturnIndex, RetAttrs);
-
// Clone any argument attributes that are present in the VMap.
for (const Argument &OldArg : OldFunc->args())
if (Argument *NewArg = dyn_cast<Argument>(VMap[&OldArg])) {
- if (auto *ParmAttrs = OldAttrs.getParamAttributes(OldArg.getArgNo() + 1))
- AttrVec.emplace_back(NewArg->getArgNo() + 1, ParmAttrs);
+ AttributeList attrs = OldAttrs.getParamAttributes(OldArg.getArgNo() + 1);
+ if (attrs.getNumSlots() > 0)
+ NewArg->addAttr(attrs);
}
- // Copy any function attributes.
- if (auto *FnAttrs = OldAttrs.getFnAttributes())
- AttrVec.emplace_back(AttributeList::FunctionIndex, FnAttrs);
-
- NewFunc->setAttributes(AttributeList::get(NewFunc->getContext(), AttrVec));
+ NewFunc->setAttributes(
+ NewFunc->getAttributes()
+ .addAttributes(NewFunc->getContext(), AttributeList::ReturnIndex,
+ OldAttrs.getRetAttributes())
+ .addAttributes(NewFunc->getContext(), AttributeList::FunctionIndex,
+ OldAttrs.getFnAttributes()));
SmallVector<std::pair<unsigned, MDNode *>, 1> MDs;
OldFunc->getAllMetadata(MDs);
OpenPOWER on IntegriCloud