summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/lib/CodeGen/BlockGenerators.cpp3
-rw-r--r--polly/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll30
2 files changed, 32 insertions, 1 deletions
diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp
index f53ab75c315..f51d2a441f3 100644
--- a/polly/lib/CodeGen/BlockGenerators.cpp
+++ b/polly/lib/CodeGen/BlockGenerators.cpp
@@ -1074,7 +1074,8 @@ void RegionGenerator::copyStmt(ScopStmt &Stmt, LoopToScevMapT &LTS,
Blocks.push_back(*SI);
// Remember value in case it is visible after this subregion.
- ValueMap.insert(RegionMap.begin(), RegionMap.end());
+ 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.
diff --git a/polly/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll b/polly/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll
new file mode 100644
index 00000000000..26164f66c34
--- /dev/null
+++ b/polly/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll
@@ -0,0 +1,30 @@
+; RUN: opt -polly-process-unprofitable -polly-codegen -S < %s | FileCheck %s
+;
+; llvm.org/PR25412
+; %synthgep caused %gep to be synthesized in subregion_if which was reused for
+; %retval in subregion_exit, even though it is not dominating subregion_exit.
+;
+; CHECK-LABEL: polly.stmt.polly.merge_new_and_old.exit:
+; CHECK: %scevgep[[R1:[0-9]*]] = getelementptr %struct.hoge, %struct.hoge* %arg, i64 0, i32 2
+; CHECK: store double* %scevgep[[R1]], double** %gep.s2a
+; CHECK: br label
+
+%struct.hoge = type { double, double, double }
+
+define double @func(%struct.hoge* %arg) {
+entry:
+ br label %subregion_entry
+
+subregion_entry:
+ %gep = getelementptr inbounds %struct.hoge, %struct.hoge* %arg, i64 0, i32 2
+ %cond = fcmp ogt double undef, undef
+ br i1 %cond, label %subregion_if, label %subregion_exit
+
+subregion_if:
+ %synthgep = load double, double* %gep
+ br label %subregion_exit
+
+subregion_exit:
+ %retval = load double, double* %gep
+ ret double %retval
+}
OpenPOWER on IntegriCloud