diff --git a/polly/lib/Support/VirtualInstruction.cpp b/polly/lib/Support/VirtualInstruction.cpp index 1235a0540c3f..33538c78dab3 100644 --- a/polly/lib/Support/VirtualInstruction.cpp +++ b/polly/lib/Support/VirtualInstruction.cpp @@ -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(Use.getUser()) && + S->isExit(cast(Use.getUser())->getParent())) + return true; } return false; } diff --git a/polly/test/Simplify/exit_phi_accesses-2.ll b/polly/test/Simplify/exit_phi_accesses-2.ll new file mode 100644 index 000000000000..fde3d01d9a2a --- /dev/null +++ b/polly/test/Simplify/exit_phi_accesses-2.ll @@ -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: }