summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2015-11-07 00:36:50 +0000
committerMichael Kruse <llvm@meinersbur.de>2015-11-07 00:36:50 +0000
commit0651480b979fc4921e8a370cfbd302321c4e150f (patch)
treebad6b828ad142cd704518610a2feed89b7950364
parent26f34fb6df5f52a6f8dd8b9659509e2f3a99c4cd (diff)
downloadbcm5719-llvm-0651480b979fc4921e8a370cfbd302321c4e150f.tar.gz
bcm5719-llvm-0651480b979fc4921e8a370cfbd302321c4e150f.zip
Fix non-affine region dominance of implicitely stored values
After loop versioning, a dominance check of a non-affine subregion's exit node causes the dominance check to always fail on any block in the subregion if it shares the same exit block with the scop. The subregion's exit block has become polly_merge_new_and_old, which also receives the control flow of the generated code. This would cause that any value for implicit stores is assumed to be not from the scop. We check dominance with the generated exit node instead. This fixes llvm.org/PR25438 llvm-svn: 252375
-rw-r--r--polly/lib/CodeGen/BlockGenerators.cpp10
-rw-r--r--polly/test/Isl/CodeGen/non-affine-region-implicit-store.ll48
2 files changed, 54 insertions, 4 deletions
diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp
index 40e83acc1fa..6e01c948edb 100644
--- a/polly/lib/CodeGen/BlockGenerators.cpp
+++ b/polly/lib/CodeGen/BlockGenerators.cpp
@@ -1072,10 +1072,6 @@ void RegionGenerator::copyStmt(ScopStmt &Stmt, LoopToScevMapT &LTS,
for (auto SI = succ_begin(BB), SE = succ_end(BB); SI != SE; SI++)
if (R->contains(*SI) && SeenBlocks.insert(*SI).second)
Blocks.push_back(*SI);
-
- // Remember value in case it is visible after this subregion.
- if (DT.dominates(BB, R->getExit()))
- ValueMap.insert(RegionMap.begin(), RegionMap.end());
}
// Now create a new dedicated region exit block and add it to the region map.
@@ -1086,6 +1082,12 @@ void RegionGenerator::copyStmt(ScopStmt &Stmt, LoopToScevMapT &LTS,
repairDominance(R->getExit(), ExitBBCopy);
+ // Remember value in case it is visible after this subregion. Only values that
+ // dominate the exit node can be visible.
+ for (auto &Pair : RegionMaps)
+ if (DT.properlyDominates(Pair.first, ExitBBCopy))
+ ValueMap.insert(Pair.second.begin(), Pair.second.end());
+
// As the block generator doesn't handle control flow we need to add the
// region control flow by hand after all blocks have been copied.
for (BasicBlock *BB : SeenBlocks) {
diff --git a/polly/test/Isl/CodeGen/non-affine-region-implicit-store.ll b/polly/test/Isl/CodeGen/non-affine-region-implicit-store.ll
new file mode 100644
index 00000000000..d0983e36d29
--- /dev/null
+++ b/polly/test/Isl/CodeGen/non-affine-region-implicit-store.ll
@@ -0,0 +1,48 @@
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
+;
+; llvm.org/PR25438
+; After loop versioning, a dominance check of a non-affine subregion's exit node
+; causes the dominance check to always fail any block in the scop. The
+; subregion's exit block has become polly_merge_new_and_old, which also receives
+; the control flow of the generated code. This would cause that any value for
+; implicit stores is assumed to be not from the scop.
+;
+; This checks that the stored value is indeed from the generated code.
+;
+; CHECK-LABEL: polly.stmt.do.body.entry:
+; CHECK: a.phiops.reload = load i32, i32* %a.phiops
+;
+; CHECK-LABEL: polly.stmt.polly.merge_new_and_old.exit:
+; CHECK: store i32 %a.phiops.reload, i32* %a.s2a
+
+define void @func() {
+entry:
+ br label %while.body
+
+while.body:
+ br label %do.body
+
+do.body:
+ %a = phi i32 [ undef, %while.body ], [ %b, %end_b ]
+ %cond = or i1 undef, undef
+ br i1 %cond, label %end_a, label %if_a
+
+if_a:
+ br label %end_a
+
+end_a:
+ br i1 undef, label %if_b, label %end_b
+
+if_b:
+ br label %end_b
+
+end_b:
+ %b = phi i32 [ undef, %if_b ], [ %a, %end_a ]
+ br i1 false, label %do.body, label %do.end
+
+do.end:
+ br label %return
+
+return:
+ ret void
+}
OpenPOWER on IntegriCloud