Skip to content

Commit

Permalink
[SCEV] Fix isImpliedViaMerge() with values from previous iteration (P…
Browse files Browse the repository at this point in the history
…R56242)

When trying to prove an implied condition on a phi by proving it
for all incoming values, we need to be careful about values coming
from a backedge, as these may refer to a previous loop iteration.
A variant of this issue was fixed in D101829, but the dominance
condition used there isn't quite right: It checks that the value
dominates the incoming block, which doesn't exclude backedges
(values defined in a loop will usually dominate the loop latch,
which is the incoming block of the backedge).

Instead, we should be checking for domination of the phi block.
Any values defined inside the loop will not dominate the loop
header phi.

Fixes llvm#56242.

Differential Revision: https://reviews.llvm.org/D128640

(cherry picked from commit e4d1d0c)
  • Loading branch information
nikic committed Jul 5, 2022
1 parent f14a034 commit 3317cfe
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 9 deletions.
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/ScalarEvolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11463,7 +11463,7 @@ bool ScalarEvolution::isImpliedViaMerge(ICmpInst::Predicate Pred,
const SCEV *L = getSCEV(LPhi->getIncomingValueForBlock(IncBB));
// Make sure L does not refer to a value from a potentially previous
// iteration of a loop.
if (!properlyDominates(L, IncBB))
if (!properlyDominates(L, LBB))
return false;
if (!ProvedEasily(L, RHS))
return false;
Expand Down
11 changes: 5 additions & 6 deletions llvm/test/Transforms/IRCE/decrementing-loop.ll
Original file line number Diff line number Diff line change
Expand Up @@ -210,17 +210,16 @@ exit:
ret void
}

; TODO: we need to be more careful when trying to look through phi nodes in
; cycles, because the condition to prove may reference the previous value of
; the phi. So we currently fail to optimize this case.
; Check that we can figure out that IV is non-negative via implication through
; two Phi nodes, one being AddRec.
define void @test_05(i32* %a, i32* %a_len_ptr, i1 %cond) {

; CHECK-LABEL: test_05
; CHECK: entry:
; CHECK: br label %merge
; CHECK-NOT: mainloop
; CHECK: mainloop:
; CHECK-NEXT: br label %loop
; CHECK: loop:
; CHECK: br i1 true, label %in.bounds, label %out.of.bounds
; CHECK: loop.preloop:

entry:
%len.a = load i32, i32* %a_len_ptr, !range !0
Expand Down
6 changes: 4 additions & 2 deletions llvm/test/Transforms/IndVarSimplify/pr56242.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ define void @test(ptr %arr) {
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
; CHECK: loop.header:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_INC:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
; CHECK-NEXT: [[PREV:%.*]] = phi i32 [ [[V:%.*]], [[LOOP_LATCH]] ], [ 0, [[ENTRY]] ]
; CHECK-NEXT: [[PTR:%.*]] = getelementptr inbounds i32, ptr [[ARR:%.*]], i64 [[IV]]
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[PTR]], align 4
; CHECK-NEXT: [[V]] = load i32, ptr [[PTR]], align 4
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[V]], 0
; CHECK-NEXT: br i1 [[CMP1]], label [[IF:%.*]], label [[LOOP_LATCH]]
; CHECK: if:
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[PREV]], 0
; CHECK-NEXT: call void @use(i1 [[CMP2]])
; CHECK-NEXT: br label [[LOOP_LATCH]]
; CHECK: loop.latch:
; CHECK-NEXT: [[IV_INC]] = add nuw nsw i64 [[IV]], 1
Expand Down

0 comments on commit 3317cfe

Please sign in to comment.