summaryrefslogtreecommitdiffstats
path: root/polly/lib/CodeGen/IRBuilder.cpp
diff options
context:
space:
mode:
authorRoman Gareev <gareevroman@gmail.com>2017-03-22 14:25:24 +0000
committerRoman Gareev <gareevroman@gmail.com>2017-03-22 14:25:24 +0000
commitcdfb57dc469bd7bc807a7d8a92106d0b0d367313 (patch)
treec6f5321bc70999d11fa2dbf15fa0aca5857b4a53 /polly/lib/CodeGen/IRBuilder.cpp
parented00beba12989eec8496aa9ac732ac1638628c9a (diff)
downloadbcm5719-llvm-cdfb57dc469bd7bc807a7d8a92106d0b0d367313.tar.gz
bcm5719-llvm-cdfb57dc469bd7bc807a7d8a92106d0b0d367313.zip
Introduce another level of metadata to distinguish non-aliasing accesses
Introduce another level of alias metadata to distinguish the individual non-aliasing accesses that have inter iteration alias-free base pointers marked with "Inter iteration alias-free" mark nodes. It can be used to, for example, distinguish different stores (loads) produced by unrolling of the innermost loops and, subsequently, sink (hoist) them by LICM. Reviewed-by: Tobias Grosser <tobias@grosser.es> Differential Revision: https://reviews.llvm.org/D30606 llvm-svn: 298510
Diffstat (limited to 'polly/lib/CodeGen/IRBuilder.cpp')
-rw-r--r--polly/lib/CodeGen/IRBuilder.cpp61
1 files changed, 56 insertions, 5 deletions
diff --git a/polly/lib/CodeGen/IRBuilder.cpp b/polly/lib/CodeGen/IRBuilder.cpp
index 9b3602d0138..10775156595 100644
--- a/polly/lib/CodeGen/IRBuilder.cpp
+++ b/polly/lib/CodeGen/IRBuilder.cpp
@@ -115,6 +115,49 @@ void ScopAnnotator::annotateLoopLatch(BranchInst *B, Loop *L,
B->setMetadata("llvm.loop", Id);
}
+/// Get the pointer operand
+///
+/// @param Inst The instruction to be analyzed.
+/// @return the pointer operand in case @p Inst is a memory access
+/// instruction and nullptr otherwise.
+static llvm::Value *getMemAccInstPointerOperand(Instruction *Inst) {
+ auto MemInst = MemAccInst::dyn_cast(Inst);
+ if (!MemInst)
+ return nullptr;
+
+ return MemInst.getPointerOperand();
+}
+
+void ScopAnnotator::annotateSecondLevel(llvm::Instruction *Inst,
+ llvm::Value *BasePtr) {
+ auto *Ptr = getMemAccInstPointerOperand(Inst);
+ if (!Ptr)
+ return;
+ auto SecondLevelAliasScope = SecondLevelAliasScopeMap.lookup(Ptr);
+ auto SecondLevelOtherAliasScopeList =
+ SecondLevelOtherAliasScopeListMap.lookup(Ptr);
+ if (!SecondLevelAliasScope) {
+ auto AliasScope = AliasScopeMap.lookup(BasePtr);
+ if (!AliasScope)
+ return;
+ LLVMContext &Ctx = SE->getContext();
+ SecondLevelAliasScope = getID(
+ Ctx, AliasScope, MDString::get(Ctx, "second level alias metadata"));
+ SecondLevelAliasScopeMap[Ptr] = SecondLevelAliasScope;
+ Metadata *Args = {SecondLevelAliasScope};
+ auto SecondLevelBasePtrAliasScopeList =
+ SecondLevelAliasScopeMap.lookup(BasePtr);
+ SecondLevelAliasScopeMap[BasePtr] = MDNode::concatenate(
+ SecondLevelBasePtrAliasScopeList, MDNode::get(Ctx, Args));
+ auto OtherAliasScopeList = OtherAliasScopeListMap.lookup(BasePtr);
+ SecondLevelOtherAliasScopeList = MDNode::concatenate(
+ OtherAliasScopeList, SecondLevelBasePtrAliasScopeList);
+ SecondLevelOtherAliasScopeListMap[Ptr] = SecondLevelOtherAliasScopeList;
+ }
+ Inst->setMetadata("alias.scope", SecondLevelAliasScope);
+ Inst->setMetadata("noalias", SecondLevelOtherAliasScopeList);
+}
+
void ScopAnnotator::annotate(Instruction *Inst) {
if (!Inst->mayReadOrWriteMemory())
return;
@@ -126,11 +169,7 @@ void ScopAnnotator::annotate(Instruction *Inst) {
if (!AliasScopeDomain)
return;
- auto MemInst = MemAccInst::dyn_cast(Inst);
- if (!MemInst)
- return;
-
- auto *Ptr = MemInst.getPointerOperand();
+ auto *Ptr = getMemAccInstPointerOperand(Inst);
if (!Ptr)
return;
@@ -162,6 +201,18 @@ void ScopAnnotator::annotate(Instruction *Inst) {
"BasePtr either expected in AliasScopeMap and OtherAlias...Map");
auto *OtherAliasScopeList = OtherAliasScopeListMap[BasePtr];
+ if (InterIterationAliasFreeBasePtrs.count(BasePtr)) {
+ annotateSecondLevel(Inst, BasePtr);
+ return;
+ }
+
Inst->setMetadata("alias.scope", AliasScope);
Inst->setMetadata("noalias", OtherAliasScopeList);
}
+
+void ScopAnnotator::addInterIterationAliasFreeBasePtr(llvm::Value *BasePtr) {
+ if (!BasePtr)
+ return;
+
+ InterIterationAliasFreeBasePtrs.insert(BasePtr);
+}
OpenPOWER on IntegriCloud