[ScopInfo] Make scalars used by PHIs in non-affine regions available

Normally this is ensured when adding PHI nodes, but as PHI node dependences
do not need to be added in case all incoming blocks are within the same
non-affine region, this was missed.

This corrects an issue visible in LNT's sqlite3, in case invariant load hoisting
was disabled.

llvm-svn: 278792
This commit is contained in:
Tobias Grosser
2016-08-16 11:44:48 +00:00
parent 80c1c9f6d8
commit b143e31164
2 changed files with 68 additions and 2 deletions

View File

@@ -68,9 +68,14 @@ void ScopBuilder::buildPHIAccesses(PHINode *PHI, Region *NonAffineSubRegion,
Value *Op = PHI->getIncomingValue(u);
BasicBlock *OpBB = PHI->getIncomingBlock(u);
// Do not build scalar dependences inside a non-affine subregion.
if (NonAffineSubRegion && NonAffineSubRegion->contains(OpBB))
// Do not build PHI dependences inside a non-affine subregion, but make
// sure that the necessary scalar values are still made available.
if (NonAffineSubRegion && NonAffineSubRegion->contains(OpBB)) {
auto *OpInst = dyn_cast<Instruction>(Op);
if (!OpInst || !NonAffineSubRegion->contains(OpInst))
ensureValueRead(Op, OpBB);
continue;
}
OnlyNonAffineSubRegionOperands = false;
ensurePHIWrite(PHI, OpBB, Op, IsExitBlock);

View File

@@ -0,0 +1,61 @@
; RUN: opt %loadPolly -analyze -polly-scops < %s | FileCheck %s
; Verify that 'tmp' is stored in bb1 and read by bb3, as it is needed as
; incoming value for the tmp11 PHI node.
; CHECK: Stmt_bb1
; CHECK-NEXT: Domain :=
; CHECK-NEXT: { Stmt_bb1[] };
; CHECK-NEXT: Schedule :=
; CHECK-NEXT: { Stmt_bb1[] -> [0] };
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_bb1[] -> MemRef_global[0] };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_bb1[] -> MemRef_tmp[] };
; CHECK-NEXT: Stmt_bb3__TO__bb10
; CHECK-NEXT: Domain :=
; CHECK-NEXT: { Stmt_bb3__TO__bb10[] };
; CHECK-NEXT: Schedule :=
; CHECK-NEXT: { Stmt_bb3__TO__bb10[] -> [1] };
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_bb3__TO__bb10[] -> MemRef_tmp[] };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_bb3__TO__bb10[] -> MemRef_tmp11[] };
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%struct.hoge = type { double, double, i8, i8, i8 }
@global = external local_unnamed_addr global %struct.hoge, align 8
define void @widget() local_unnamed_addr {
bb:
br label %bb1
bb1: ; preds = %bb
%tmp = load double, double* getelementptr inbounds (%struct.hoge, %struct.hoge* @global, i64 0, i32 0), align 8
br i1 false, label %bb3, label %bb2
bb2: ; preds = %bb1
br label %bb3
bb3: ; preds = %bb2, %bb1
br i1 false, label %bb8, label %bb4
bb4: ; preds = %bb3
br label %bb5
bb5: ; preds = %bb4
%tmp6 = and i32 undef, 16711680
%tmp7 = icmp eq i32 %tmp6, 0
br i1 %tmp7, label %bb8, label %bb10
bb8: ; preds = %bb5, %bb3
%tmp9 = phi double [ %tmp, %bb3 ], [ undef, %bb5 ]
br label %bb10
bb10: ; preds = %bb8, %bb5
%tmp11 = phi double [ undef, %bb5 ], [ %tmp9, %bb8 ]
ret void
}