Skip to content

Commit

Permalink
[SCEV] Make sure starting block is marked as visited when recursively…
Browse files Browse the repository at this point in the history
… collecting loop guards. (llvm#120749)

When `collectFromBlock` is called without a predecessor (in particular
for loops that don't have a unique predecessor outside the loop) we
never start climbing the predecessor chain, and thus don't mark the
starting block as visited.

Fixes llvm#120615.
  • Loading branch information
juliannagele authored Dec 31, 2024
1 parent e3fe41c commit f035351
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
1 change: 1 addition & 0 deletions llvm/lib/Analysis/ScalarEvolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15765,6 +15765,7 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
// original header.
// TODO: share this logic with isLoopEntryGuardedByCond.
unsigned NumCollectedConditions = 0;
VisitedBlocks.insert(Block);
std::pair<const BasicBlock *, const BasicBlock *> Pair(Pred, Block);
for (; Pair.first;
Pair = SE.getPredecessorWithUniqueSuccessorForBB(Pair.first)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,3 +310,29 @@ inner.header:
exit:
ret void
}

; Checks correct traversal for loops without a unique predecessor
; outside the loop.
define void @pr120615() {
; CHECK-LABEL: pr120615
; CHECK-NEXT: Determining loop execution counts for: @pr120615
; CHECK-NEXT: Loop %header: backedge-taken count is i32 0
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 0
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is i32 0
; CHECK-NEXT: Loop %header: Trip multiple is 1
entry:
br label %header

bb:
br label %header

header:
%0 = phi i32 [ %1, %header ], [ 0, %bb ], [ 0, %entry ]
%1 = add i32 %0, 1
%icmp = icmp slt i32 %0, 0
br i1 %icmp, label %header, label %exit

exit:
ret void

}

0 comments on commit f035351

Please sign in to comment.