diff options
| -rw-r--r-- | polly/lib/CodeGen/BlockGenerators.cpp | 20 | ||||
| -rw-r--r-- | polly/test/Isl/CodeGen/non-affine-dominance-generated-entering.ll | 44 |
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 <S, 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 <S, // 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 +} |

