aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/InlineFunction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/InlineFunction.cpp85
1 files changed, 38 insertions, 47 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 340fe61..75ffb40 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -771,14 +771,16 @@ static void HandleInlinedEHPad(InvokeInst *II, BasicBlock *FirstNewBlock,
UnwindDest->removePredecessor(InvokeBB);
}
-/// When inlining a call site that has !llvm.mem.parallel_loop_access or
-/// llvm.access.group metadata, that metadata should be propagated to all
-/// memory-accessing cloned instructions.
-static void PropagateParallelLoopAccessMetadata(CallBase &CB,
- ValueToValueMapTy &VMap) {
- MDNode *M = CB.getMetadata(LLVMContext::MD_mem_parallel_loop_access);
- MDNode *CallAccessGroup = CB.getMetadata(LLVMContext::MD_access_group);
- if (!M && !CallAccessGroup)
+/// When inlining a call site that has !llvm.mem.parallel_loop_access,
+/// !llvm.access.group, !alias.scope or !noalias metadata, that metadata should
+/// be propagated to all memory-accessing cloned instructions.
+static void PropagateCallSiteMetadata(CallBase &CB, ValueToValueMapTy &VMap) {
+ MDNode *MemParallelLoopAccess =
+ CB.getMetadata(LLVMContext::MD_mem_parallel_loop_access);
+ MDNode *AccessGroup = CB.getMetadata(LLVMContext::MD_access_group);
+ MDNode *AliasScope = CB.getMetadata(LLVMContext::MD_alias_scope);
+ MDNode *NoAlias = CB.getMetadata(LLVMContext::MD_noalias);
+ if (!MemParallelLoopAccess && !AccessGroup && !AliasScope && !NoAlias)
return;
for (ValueToValueMapTy::iterator VMI = VMap.begin(), VMIE = VMap.end();
@@ -790,21 +792,30 @@ static void PropagateParallelLoopAccessMetadata(CallBase &CB,
if (!NI)
continue;
- if (M) {
- if (MDNode *PM =
- NI->getMetadata(LLVMContext::MD_mem_parallel_loop_access)) {
- M = MDNode::concatenate(PM, M);
- NI->setMetadata(LLVMContext::MD_mem_parallel_loop_access, M);
- } else if (NI->mayReadOrWriteMemory()) {
- NI->setMetadata(LLVMContext::MD_mem_parallel_loop_access, M);
- }
- }
+ // This metadata is only relevant for instructions that access memory.
+ if (!NI->mayReadOrWriteMemory())
+ continue;
- if (NI->mayReadOrWriteMemory()) {
- MDNode *UnitedAccGroups = uniteAccessGroups(
- NI->getMetadata(LLVMContext::MD_access_group), CallAccessGroup);
- NI->setMetadata(LLVMContext::MD_access_group, UnitedAccGroups);
+ if (MemParallelLoopAccess) {
+ // TODO: This probably should not overwrite MemParalleLoopAccess.
+ MemParallelLoopAccess = MDNode::concatenate(
+ NI->getMetadata(LLVMContext::MD_mem_parallel_loop_access),
+ MemParallelLoopAccess);
+ NI->setMetadata(LLVMContext::MD_mem_parallel_loop_access,
+ MemParallelLoopAccess);
}
+
+ if (AccessGroup)
+ NI->setMetadata(LLVMContext::MD_access_group, uniteAccessGroups(
+ NI->getMetadata(LLVMContext::MD_access_group), AccessGroup));
+
+ if (AliasScope)
+ NI->setMetadata(LLVMContext::MD_alias_scope, MDNode::concatenate(
+ NI->getMetadata(LLVMContext::MD_alias_scope), AliasScope));
+
+ if (NoAlias)
+ NI->setMetadata(LLVMContext::MD_noalias, MDNode::concatenate(
+ NI->getMetadata(LLVMContext::MD_noalias), NoAlias));
}
}
@@ -886,31 +897,11 @@ static void CloneAliasScopeMetadata(CallBase &CB, ValueToValueMapTy &VMap) {
if (!NI)
continue;
- if (MDNode *M = NI->getMetadata(LLVMContext::MD_alias_scope)) {
- MDNode *NewMD = MDMap[M];
- // If the call site also had alias scope metadata (a list of scopes to
- // which instructions inside it might belong), propagate those scopes to
- // the inlined instructions.
- if (MDNode *CSM = CB.getMetadata(LLVMContext::MD_alias_scope))
- NewMD = MDNode::concatenate(NewMD, CSM);
- NI->setMetadata(LLVMContext::MD_alias_scope, NewMD);
- } else if (NI->mayReadOrWriteMemory()) {
- if (MDNode *M = CB.getMetadata(LLVMContext::MD_alias_scope))
- NI->setMetadata(LLVMContext::MD_alias_scope, M);
- }
+ if (MDNode *M = NI->getMetadata(LLVMContext::MD_alias_scope))
+ NI->setMetadata(LLVMContext::MD_alias_scope, MDMap[M]);
- if (MDNode *M = NI->getMetadata(LLVMContext::MD_noalias)) {
- MDNode *NewMD = MDMap[M];
- // If the call site also had noalias metadata (a list of scopes with
- // which instructions inside it don't alias), propagate those scopes to
- // the inlined instructions.
- if (MDNode *CSM = CB.getMetadata(LLVMContext::MD_noalias))
- NewMD = MDNode::concatenate(NewMD, CSM);
- NI->setMetadata(LLVMContext::MD_noalias, NewMD);
- } else if (NI->mayReadOrWriteMemory()) {
- if (MDNode *M = CB.getMetadata(LLVMContext::MD_noalias))
- NI->setMetadata(LLVMContext::MD_noalias, M);
- }
+ if (MDNode *M = NI->getMetadata(LLVMContext::MD_noalias))
+ NI->setMetadata(LLVMContext::MD_noalias, MDMap[M]);
}
}
@@ -1911,8 +1902,8 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
// function which feed into its return value.
AddReturnAttributes(CB, VMap);
- // Propagate llvm.mem.parallel_loop_access if necessary.
- PropagateParallelLoopAccessMetadata(CB, VMap);
+ // Propagate metadata on the callsite if necessary.
+ PropagateCallSiteMetadata(CB, VMap);
// Register any cloned assumptions.
if (IFI.GetAssumptionCache)