summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2017-06-19 10:19:29 +0000
committerMichael Kruse <llvm@meinersbur.de>2017-06-19 10:19:29 +0000
commit214deb7960ade0817276733cbe55f63b51fa44f7 (patch)
tree1adbd68bb8eb444cdeb4f05a8a8f2cc854020e0e
parent4aac459ca6642f21b685dc18e3b70039339e8036 (diff)
downloadbcm5719-llvm-214deb7960ade0817276733cbe55f63b51fa44f7.tar.gz
bcm5719-llvm-214deb7960ade0817276733cbe55f63b51fa44f7.zip
[CodeGen] Emit aliasing metadata for new arrays.
Ensure that all array base pointers are assigned before generating aliasing metadata by allocating new arrays beforehand. Before this patch, getBasePtr() returned nullptr for new arrays because the arrays were created at a later point. Nullptr did not match to any array after the created array base pointers have been assigned and when the loads/stores are generated. llvm-svn: 305675
-rw-r--r--polly/lib/CodeGen/CodeGeneration.cpp7
-rw-r--r--polly/lib/CodeGen/IRBuilder.cpp4
-rw-r--r--polly/test/Isl/CodeGen/MemAccess/create_arrays.ll12
-rw-r--r--polly/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll16
4 files changed, 28 insertions, 11 deletions
diff --git a/polly/lib/CodeGen/CodeGeneration.cpp b/polly/lib/CodeGen/CodeGeneration.cpp
index b60cc7cd246..5569378982f 100644
--- a/polly/lib/CodeGen/CodeGeneration.cpp
+++ b/polly/lib/CodeGen/CodeGeneration.cpp
@@ -162,7 +162,6 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
assert(!R->isTopLevelRegion() && "Top level regions are not supported");
ScopAnnotator Annotator;
- Annotator.buildAliasScopes(S);
simplifyRegion(R, &DT, &LI, &RI);
assert(R->isSimple());
@@ -183,6 +182,11 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
IslNodeBuilder NodeBuilder(Builder, Annotator, DL, LI, SE, DT, S, StartBlock);
+ // All arrays must have their base pointers known before
+ // ScopAnnotator::buildAliasScopes.
+ NodeBuilder.allocateNewArrays();
+ Annotator.buildAliasScopes(S);
+
if (PerfMonitoring) {
PerfMonitor P(S, EnteringBB->getParent()->getParent());
P.initialize();
@@ -224,7 +228,6 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
isl_ast_node_free(AstRoot);
} else {
- NodeBuilder.allocateNewArrays();
NodeBuilder.addParameters(S.getContext());
Value *RTC = NodeBuilder.createRTC(AI.getRunCondition());
diff --git a/polly/lib/CodeGen/IRBuilder.cpp b/polly/lib/CodeGen/IRBuilder.cpp
index a8fb1fdf281..7e8c3ad84d9 100644
--- a/polly/lib/CodeGen/IRBuilder.cpp
+++ b/polly/lib/CodeGen/IRBuilder.cpp
@@ -67,10 +67,12 @@ void ScopAnnotator::buildAliasScopes(Scop &S) {
return;
std::string AliasScopeStr = "polly.alias.scope.";
- for (const ScopArrayInfo *Array : S.arrays())
+ for (const ScopArrayInfo *Array : S.arrays()) {
+ assert(Array->getBasePtr() && "Base pointer must be present");
AliasScopeMap[Array->getBasePtr()] =
getID(Ctx, AliasScopeDomain,
MDString::get(Ctx, (AliasScopeStr + Array->getName()).c_str()));
+ }
for (const ScopArrayInfo *Array : S.arrays()) {
MDNode *AliasScopeList = MDNode::get(Ctx, {});
diff --git a/polly/test/Isl/CodeGen/MemAccess/create_arrays.ll b/polly/test/Isl/CodeGen/MemAccess/create_arrays.ll
index 1ee647a0ea6..0de347694cc 100644
--- a/polly/test/Isl/CodeGen/MemAccess/create_arrays.ll
+++ b/polly/test/Isl/CodeGen/MemAccess/create_arrays.ll
@@ -29,6 +29,18 @@
; CODEGEN: %polly.access.cast.E = bitcast [270336 x [200000 x double]]* %E to double*
; CODEGEN: %polly.access.mul.E = mul nsw i64 %polly.indvar33, 200000
; CODEGEN: %polly.access.add.E = add nsw i64 %polly.access.mul.E, %polly.indvar
+; CODEGEN: {{%.*}} = load double, double* %polly.access.E, align 8, !alias.scope [[TAG0:![0-9]+]], !noalias [[TAG2:![0-9]+]]
+; CODEGEN: store double {{%.*}}, double* %scevgep36, align 8, !alias.scope [[TAG5:![0-9]+]], !noalias [[TAG8:![0-9]+]]
+;
+; CODEGEN-DAG: [[TAG0]] = distinct !{[[TAG0]], [[TAG1:![0-9]+]], !"polly.alias.scope.E"}
+; CODEGEN-DAG: [[TAG1]] = distinct !{[[TAG1]], !"polly.alias.scope.domain"}
+; CODEGEN-DAG: [[TAG2]] = !{[[TAG3:![0-9]+]], [[TAG4:![0-9]+]], [[TAG5:![0-9]+]], [[TAG6:![0-9]+]], [[TAG7:![0-9]+]]}
+; CODEGEN-DAG: [[TAG3]] = distinct !{[[TAG3]], [[TAG1]], !"polly.alias.scope.MemRef_B"}
+; CODEGEN-DAG: [[TAG4]] = distinct !{[[TAG4]], [[TAG1]], !"polly.alias.scope.MemRef_beta"}
+; CODEGEN-DAG: [[TAG5]] = distinct !{[[TAG5]], [[TAG1]], !"polly.alias.scope.MemRef_A"}
+; CODEGEN-DAG: [[TAG6]] = distinct !{[[TAG6]], [[TAG1]], !"polly.alias.scope.D"}
+; CODEGEN-DAG: [[TAG7]] = distinct !{[[TAG7]], [[TAG1]], !"polly.alias.scope.F"}
+; CODEGEN-DAG: [[TAG8]] = !{[[TAG3]], [[TAG4]], [[TAG6]], [[TAG0]], [[TAG7]]}
;
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-unknown"
diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll
index a3b0633062d..7863f58414a 100644
--- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll
+++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll
@@ -12,14 +12,14 @@
; This test case checks whether Polly generates second level alias metadata
; to distinguish the specific accesses in case of the ublas gemm kernel.
;
-; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N0:[a-z_0-9]*]], align 8, !alias.scope !10, !noalias !2
-; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N0]], align 8, !alias.scope !10, !noalias !2
-; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N1:[a-z_0-9]*]], align 8, !alias.scope !11, !noalias !12
-; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N1]], align 8, !alias.scope !11, !noalias !12
-; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N2:[a-z_0-9]*]], align 8, !alias.scope !13, !noalias !14
-; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N2]], align 8, !alias.scope !13, !noalias !14
-; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N3:[a-z_0-9]*]], align 8, !alias.scope !15, !noalias !16
-; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N3]], align 8, !alias.scope !15, !noalias !16
+; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N0:[a-z_0-9]*]], align 8
+; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N0]], align 8
+; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N1:[a-z_0-9]*]], align 8
+; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N1]], align 8
+; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N2:[a-z_0-9]*]], align 8
+; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N2]], align 8
+; CHECK: %tmp22_p_scalar_{{[0-9]*}} = load double, double* %scevgep[[N3:[a-z_0-9]*]], align 8
+; CHECK: store double %p_tmp23{{[0-9]*}}, double* %scevgep[[N3]], align 8
;
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-unknown"
OpenPOWER on IntegriCloud