forked from OSchip/llvm-project
[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
This commit is contained in:
parent
4aac459ca6
commit
214deb7960
|
|
@ -162,7 +162,6 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
|
||||||
assert(!R->isTopLevelRegion() && "Top level regions are not supported");
|
assert(!R->isTopLevelRegion() && "Top level regions are not supported");
|
||||||
|
|
||||||
ScopAnnotator Annotator;
|
ScopAnnotator Annotator;
|
||||||
Annotator.buildAliasScopes(S);
|
|
||||||
|
|
||||||
simplifyRegion(R, &DT, &LI, &RI);
|
simplifyRegion(R, &DT, &LI, &RI);
|
||||||
assert(R->isSimple());
|
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);
|
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) {
|
if (PerfMonitoring) {
|
||||||
PerfMonitor P(S, EnteringBB->getParent()->getParent());
|
PerfMonitor P(S, EnteringBB->getParent()->getParent());
|
||||||
P.initialize();
|
P.initialize();
|
||||||
|
|
@ -224,7 +228,6 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
|
||||||
|
|
||||||
isl_ast_node_free(AstRoot);
|
isl_ast_node_free(AstRoot);
|
||||||
} else {
|
} else {
|
||||||
NodeBuilder.allocateNewArrays();
|
|
||||||
NodeBuilder.addParameters(S.getContext());
|
NodeBuilder.addParameters(S.getContext());
|
||||||
Value *RTC = NodeBuilder.createRTC(AI.getRunCondition());
|
Value *RTC = NodeBuilder.createRTC(AI.getRunCondition());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,10 +67,12 @@ void ScopAnnotator::buildAliasScopes(Scop &S) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::string AliasScopeStr = "polly.alias.scope.";
|
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()] =
|
AliasScopeMap[Array->getBasePtr()] =
|
||||||
getID(Ctx, AliasScopeDomain,
|
getID(Ctx, AliasScopeDomain,
|
||||||
MDString::get(Ctx, (AliasScopeStr + Array->getName()).c_str()));
|
MDString::get(Ctx, (AliasScopeStr + Array->getName()).c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
for (const ScopArrayInfo *Array : S.arrays()) {
|
for (const ScopArrayInfo *Array : S.arrays()) {
|
||||||
MDNode *AliasScopeList = MDNode::get(Ctx, {});
|
MDNode *AliasScopeList = MDNode::get(Ctx, {});
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,18 @@
|
||||||
; CODEGEN: %polly.access.cast.E = bitcast [270336 x [200000 x double]]* %E to double*
|
; 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.mul.E = mul nsw i64 %polly.indvar33, 200000
|
||||||
; CODEGEN: %polly.access.add.E = add nsw i64 %polly.access.mul.E, %polly.indvar
|
; 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 datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
target triple = "x86_64-unknown-unknown"
|
target triple = "x86_64-unknown-unknown"
|
||||||
|
|
|
||||||
|
|
@ -12,14 +12,14 @@
|
||||||
; This test case checks whether Polly generates second level alias metadata
|
; This test case checks whether Polly generates second level alias metadata
|
||||||
; to distinguish the specific accesses in case of the ublas gemm kernel.
|
; 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: %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, !alias.scope !10, !noalias !2
|
; 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, !alias.scope !11, !noalias !12
|
; 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, !alias.scope !11, !noalias !12
|
; 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, !alias.scope !13, !noalias !14
|
; 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, !alias.scope !13, !noalias !14
|
; 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, !alias.scope !15, !noalias !16
|
; 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, !alias.scope !15, !noalias !16
|
; 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 datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
target triple = "x86_64-unknown-unknown"
|
target triple = "x86_64-unknown-unknown"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue