summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2015-11-06 13:51:24 +0000
committerMichael Kruse <llvm@meinersbur.de>2015-11-06 13:51:24 +0000
commitddb6528ba613b801de8cfb60e48ca6b3fb06b0f2 (patch)
treea4e48f8ec51234826c61def7ce622c3049bacd58
parentb20b70687a8defb529053da579df95f881e3b078 (diff)
downloadbcm5719-llvm-ddb6528ba613b801de8cfb60e48ca6b3fb06b0f2.tar.gz
bcm5719-llvm-ddb6528ba613b801de8cfb60e48ca6b3fb06b0f2.zip
Fix reuse of non-dominating synthesized value in subregion exit
We were adding all generated values in non-affine subregions to be used for the subregions generated exit block. The thought was that only values that are dominating the original exit block can be used there. But it is possible for synthesizable values to be expanded in any block. If the same values is also used for implicit writes, it would try to reuse already synthesized values even if not dominating the exit block. The fix is to only add values to the list of values usable in the exit block only if it is dominating the exit block. This fixes llvm.org/PR25412. llvm-svn: 252301
-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