summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/lib/CodeGen/BlockGenerators.cpp20
-rw-r--r--polly/test/Isl/CodeGen/non-affine-dominance-generated-entering.ll44
2 files changed, 58 insertions, 6 deletions
diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp
index ace05a3038e..ecfb857aab2 100644
--- a/polly/lib/CodeGen/BlockGenerators.cpp
+++ b/polly/lib/CodeGen/BlockGenerators.cpp
@@ -1031,7 +1031,8 @@ void RegionGenerator::copyStmt(ScopStmt &Stmt, LoopToScevMapT &LTS,
EntryBBCopy->setName("polly.stmt." + EntryBB->getName() + ".entry");
Builder.SetInsertPoint(&EntryBBCopy->front());
- generateScalarLoads(Stmt, RegionMaps[EntryBBCopy]);
+ ValueMapT &EntryBBMap = RegionMaps[EntryBBCopy];
+ generateScalarLoads(Stmt, EntryBBMap);
for (auto PI = pred_begin(EntryBB), PE = pred_end(EntryBB); PI != PE; ++PI)
if (!R->contains(*PI))
@@ -1054,11 +1055,18 @@ void RegionGenerator::copyStmt(ScopStmt &Stmt, LoopToScevMapT &LTS,
// In order to remap PHI nodes we store also basic block mappings.
BlockMap[BB] = BBCopy;
- // Get the mapping for this block and initialize it with the mapping
- // available at its immediate dominator (in the new region).
- ValueMapT &RegionMap = RegionMaps[BBCopy];
- if (BBCopy != EntryBBCopy)
- RegionMap = RegionMaps[BBCopyIDom];
+ // Get the mapping for this block and initialize it with either the scalar
+ // loads from the generated entering block (which dominates all blocks of
+ // this subregion) or the maps of the immediate dominator, if part of the
+ // subregion. The latter necessarily includes the former.
+ ValueMapT *InitBBMap;
+ if (BBCopyIDom) {
+ assert(RegionMaps.count(BBCopyIDom));
+ InitBBMap = &RegionMaps[BBCopyIDom];
+ } else
+ InitBBMap = &EntryBBMap;
+ auto Inserted = RegionMaps.insert(std::make_pair(BBCopy, *InitBBMap));
+ ValueMapT &RegionMap = Inserted.first->second;
// Copy the block with the BlockGenerator.
Builder.SetInsertPoint(&BBCopy->front());
diff --git a/polly/test/Isl/CodeGen/non-affine-dominance-generated-entering.ll b/polly/test/Isl/CodeGen/non-affine-dominance-generated-entering.ll
new file mode 100644
index 00000000000..4ca7d7b36eb
--- /dev/null
+++ b/polly/test/Isl/CodeGen/non-affine-dominance-generated-entering.ll
@@ -0,0 +1,44 @@
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
+;
+; llvm.org/PR25439
+; Scalar reloads in the generated entering block were not recognized as
+; dominating the subregion blocks when there were multiple entering nodes. This
+; resulted in values defined in there (here: %cond used in subregionB_entry) not
+; being copied. We check whether it is reusing the reloaded scalar.
+;
+; CHECK-LABEL: polly.stmt.subregionB_entry.exit:
+; CHECK: store i1 %polly.cond, i1* %cond.s2a
+;
+; CHECK-LABEL: polly.stmt.subregionB_entry.entry:
+; CHECK: %cond.s2a.reload = load i1, i1* %cond.s2a
+;
+; CHECK-LABEL: polly.stmt.subregionB_entry:
+; CHECK: br i1 %cond.s2a.reload
+
+define void @func(i32* %A) {
+entry:
+ br label %subregionA_entry
+
+subregionA_entry:
+ %cond = phi i1 [ false, %entry ], [ true, %subregionB_exit ]
+ br i1 %cond, label %subregionA_if, label %subregionA_else
+
+subregionA_if:
+ br label %subregionB_entry
+
+subregionA_else:
+ br label %subregionB_entry
+
+subregionB_entry:
+ store i32 0, i32* %A
+ br i1 %cond, label %subregionB_if, label %subregionB_exit
+
+subregionB_if:
+ br label %subregionB_exit
+
+subregionB_exit:
+ br i1 false, label %subregionA_entry, label %return
+
+return:
+ ret void
+}
OpenPOWER on IntegriCloud