From 156a97438097d6f913cfb4a8c2834273c33ed89c Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Mon, 19 Jun 2017 10:19:29 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@305675 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGeneration.cpp | 7 +++++-- lib/CodeGen/IRBuilder.cpp | 4 +++- test/Isl/CodeGen/MemAccess/create_arrays.ll | 12 ++++++++++++ test/ScheduleOptimizer/pattern-matching-based-opts_10.ll | 16 ++++++++-------- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/lib/CodeGen/CodeGeneration.cpp b/lib/CodeGen/CodeGeneration.cpp index b60cc7cd..55693789 100644 --- a/lib/CodeGen/CodeGeneration.cpp +++ b/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/lib/CodeGen/IRBuilder.cpp b/lib/CodeGen/IRBuilder.cpp index a8fb1fdf..7e8c3ad8 100644 --- a/lib/CodeGen/IRBuilder.cpp +++ b/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/test/Isl/CodeGen/MemAccess/create_arrays.ll b/test/Isl/CodeGen/MemAccess/create_arrays.ll index 1ee647a0..0de34769 100644 --- a/test/Isl/CodeGen/MemAccess/create_arrays.ll +++ b/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/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll b/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll index a3b06330..7863f584 100644 --- a/test/ScheduleOptimizer/pattern-matching-based-opts_10.ll +++ b/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" -- 2.11.4.GIT