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 +}  | 

