forked from OSchip/llvm-project
Fix non-affine generated entering node not being recognized as dominating
Scalar reloads in the generated entering block were not recognized as dominating the subregions locks when there were multiple entering nodes. This resulted in values defined in there not being copied. As a fix, we unconditionally add the BBMap of the generated entering node to the generated entry. This fixes part of llvm.org/PR25439. This reverts 252449 and reapplies r252445. Its test was failing indeterministically due to r252375 which was reverted in r252522. llvm-svn: 252540
This commit is contained in:
parent
533c10c651
commit
c993739e0d
|
@ -1033,7 +1033,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))
|
||||
|
@ -1067,11 +1068,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());
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue