Avoid unnecessay .s2a write access when used only in PHIs

Accesses for exit node phis will be handled separately by 
buildPHIAccesses if there is more than one exiting edge, 
buildScalarDependences does not need to create additional SCALAR 
accesses.

This is a corrected version of r250517, which was reverted in r250607.

Differential Revision: http://reviews.llvm.org/D13848

llvm-svn: 250622
This commit is contained in:
Michael Kruse 2015-10-17 21:07:08 +00:00
parent 924f6db21d
commit 01cb379fed
4 changed files with 66 additions and 6 deletions

View File

@ -3271,6 +3271,23 @@ bool ScopInfo::buildScalarDependences(Instruction *Inst, Region *R,
if (NonAffineSubRegion && NonAffineSubRegion->contains(UseParent))
continue;
// Check for PHI nodes in the region exit and skip them, if they will be
// modeled
// as PHI nodes.
//
// PHI nodes in the region exit that have more than two incoming edges need
// to
// be modeled as PHI-Nodes to correctly model the fact that depending on the
// control flow a different value will be assigned to the PHI node. In case
// this
// is the case, there is no need to create an additional normal scalar
// dependence.
// Hence bail out, before we register an "out-of-region" use for this
// definition.
if (isa<PHINode>(UI) && UI->getParent() == R->getExit() &&
!R->getExitingBlock())
continue;
// Check whether or not the use is in the SCoP.
if (!R->contains(UseParent)) {
AnyCrossStmtUse = true;

View File

@ -0,0 +1,47 @@
; RUN: opt %loadPolly -analyze -polly-scops %s | FileCheck %s
; CHECK-LABEL: Function: foo
; CHECK: Statements {
; CHECK-NEXT: Stmt_body
; CHECK-NEXT: Domain :=
; CHECK-NEXT: { Stmt_body[i0] : i0 <= 100 and i0 >= 0 };
; CHECK-NEXT: Schedule :=
; CHECK-NEXT: { Stmt_body[i0] -> [i0] };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_body[i0] -> MemRef_sum__phi[] };
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_body[i0] -> MemRef_sum__phi[] };
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_body[i0] -> MemRef_A[i0] };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_body[i0] -> MemRef_sum_next[] };
; CHECK-NEXT: }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
define float @foo(float* %A) {
entry:
br label %header
header:
fence seq_cst
br i1 true, label %body, label %exit
body:
%i = phi i64 [ 0, %header ], [ %next, %body ]
%sum = phi float [ 0.0, %header ], [ %sum.next, %body ]
%arrayidx = getelementptr float, float* %A, i64 %i
%scalar = fadd float 0.0, 0.0
%next = add nuw nsw i64 %i, 1
%val = load float, float* %arrayidx
%sum.next = fadd float %sum, %val
%cond = icmp ne i64 %i, 100
br i1 %cond, label %body, label %after
after:
br label %exit
exit:
%phi = phi float [%sum.next, %after], [0.0, %header]
ret float %phi
}

View File

@ -1,11 +1,9 @@
; RUN: opt %loadPolly -analyze -polly-scops %s | FileCheck %s
; Check that PHI nodes only create PHI access and nothing else (e.g. unnecessary
; SCALAR accesses)In this case, for a PHI in the exit node, hence there is no
; SCALAR accesses). In this case, for a PHI in the exit node, hence there is no
; PHI ReadAccess.
; XFAIL: *
; CHECK-LABEL: Function: foo
; CHECK: Statements {
; CHECK-NEXT: Stmt_header
@ -22,7 +20,7 @@
; CHECK-NEXT: { Stmt_body[i0] -> [1, i0] };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_body[i0] -> MemRef_phi[] };
; CHECK-NEXT: }
; CHECK-NEXT: }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

View File

@ -27,8 +27,6 @@
; CHECK: { Stmt_bb1[i0] -> MemRef_phisum__phi[] };
; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK: { Stmt_bb1[i0] -> MemRef_phisum__phi[] };
; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK: { Stmt_bb1[i0] -> MemRef_phisum[] };
; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK: { Stmt_bb1[i0] -> MemRef_A[i0] };