diff options
-rw-r--r-- | polly/lib/CodeGen/BlockGenerators.cpp | 3 | ||||
-rw-r--r-- | polly/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll | 30 |
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 <S, 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 +} |