[Simplify] Count PHINodes in simplifiable exit nodes as escaping use.

After region exit simplification, the incoming block of a phi node in
the SCoP region's exit block lands outside of the region. Since we
treat SCoPs as if this already happened, we need to account for that
when looking for outside uses of scalars (i.e. escaping scalars).

llvm-svn: 309271
This commit is contained in:
Michael Kruse 2017-07-27 14:09:31 +00:00
parent 88202be1f0
commit 8a8aca4299
2 changed files with 44 additions and 0 deletions

View File

@ -170,6 +170,13 @@ static bool isEscaping(Scop *S, Instruction *ComputingInst) {
BasicBlock *UserBB = getUseBlock(Use);
if (!S->contains(UserBB))
return true;
// When the SCoP region exit needs to be simplified, PHIs in the region exit
// move to a new basic block such that its incoming blocks are not in the
// scop anymore.
if (S->hasSingleExitEdge() && isa<PHINode>(Use.getUser()) &&
S->isExit(cast<PHINode>(Use.getUser())->getParent()))
return true;
}
return false;
}

View File

@ -0,0 +1,37 @@
; RUN: opt %loadPolly -polly-scops -polly-simplify -analyze < %s | FileCheck %s
;
; The use of %sum.next by %phi counts as an escaping use.
; Don't remove the scalar write of %sum.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
%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
}
; CHECK: Statistics {
; CHECK: Dead accesses removed: 0
; CHECK: }