Skip to content

Commit 3282a05

Browse files
committed
[SCEV] Check whether the start is non-zero in ScalarEvolution::howFarToZero
1 parent ddb05e7 commit 3282a05

File tree

3 files changed

+24
-40
lines changed

3 files changed

+24
-40
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10635,10 +10635,11 @@ ScalarEvolution::ExitLimit ScalarEvolution::howFarToZero(const SCEV *V,
1063510635
if (ControlsOnlyExit && AddRec->hasNoSelfWrap() &&
1063610636
loopHasNoAbnormalExits(AddRec->getLoop())) {
1063710637

10638-
// If the stride is zero, the loop must be infinite. In C++, most loops
10639-
// are finite by assumption, in which case the step being zero implies
10640-
// UB must execute if the loop is entered.
10641-
if (!loopIsFiniteByAssumption(L) && !isKnownNonZero(StepWLG))
10638+
// If the stride is zero and the start is non-zero, the loop must be
10639+
// infinite. In C++, most loops are finite by assumption, in which case the
10640+
// step being zero implies UB must execute if the loop is entered.
10641+
if (!(loopIsFiniteByAssumption(L) && isKnownNonZero(Start)) &&
10642+
!isKnownNonZero(StepWLG))
1064210643
return getCouldNotCompute();
1064310644

1064410645
const SCEV *Exact =

llvm/test/Analysis/ScalarEvolution/trip-count-unknown-stride.ll

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -329,10 +329,9 @@ define void @ne_nsw_nonneg_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {
329329
;
330330
; CHECK-LABEL: 'ne_nsw_nonneg_step'
331331
; CHECK-NEXT: Determining loop execution counts for: @ne_nsw_nonneg_step
332-
; CHECK-NEXT: Loop %for.body: backedge-taken count is (((-1 * %s) + %n) /u %s)
333-
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1
334-
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((-1 * %s) + %n) /u %s)
335-
; CHECK-NEXT: Loop %for.body: Trip multiple is 1
332+
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
333+
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
334+
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
336335
;
337336
entry:
338337
%nonneg_step = icmp sge i32 %s, 0
@@ -442,10 +441,9 @@ define void @ne_nuw_nonneg_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {
442441
;
443442
; CHECK-LABEL: 'ne_nuw_nonneg_step'
444443
; CHECK-NEXT: Determining loop execution counts for: @ne_nuw_nonneg_step
445-
; CHECK-NEXT: Loop %for.body: backedge-taken count is (((-1 * %s) + %n) /u %s)
446-
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1
447-
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((-1 * %s) + %n) /u %s)
448-
; CHECK-NEXT: Loop %for.body: Trip multiple is 1
444+
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
445+
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
446+
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
449447
;
450448
entry:
451449
%nonneg_step = icmp sge i32 %s, 0
@@ -496,10 +494,9 @@ for.end: ; preds = %for.body, %entry
496494
define i32 @pr131465(i1 %x) mustprogress {
497495
; CHECK-LABEL: 'pr131465'
498496
; CHECK-NEXT: Determining loop execution counts for: @pr131465
499-
; CHECK-NEXT: Loop %for.body: backedge-taken count is ((-1 * (zext i1 %x to i32))<nuw><nsw> /u (zext i1 %x to i32))
500-
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1
501-
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((-1 * (zext i1 %x to i32))<nuw><nsw> /u (zext i1 %x to i32))
502-
; CHECK-NEXT: Loop %for.body: Trip multiple is 1
497+
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
498+
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
499+
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
503500
;
504501
entry:
505502
%inc = zext i1 %x to i32

llvm/test/Transforms/LoopUnroll/pr131465.ll

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,18 @@
44
define i32 @pr131465(i1 %x) mustprogress {
55
; CHECK-LABEL: define i32 @pr131465(
66
; CHECK-SAME: i1 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
7-
; CHECK-NEXT: [[ENTRY:.*:]]
7+
; CHECK-NEXT: [[ENTRY:.*]]:
88
; CHECK-NEXT: [[INC:%.*]] = zext i1 [[X]] to i32
9-
; CHECK-NEXT: [[TMP0:%.*]] = sub i32 0, [[INC]]
10-
; CHECK-NEXT: [[TMP1:%.*]] = udiv i32 [[TMP0]], [[INC]]
11-
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1
12-
; CHECK-NEXT: [[XTRAITER:%.*]] = and i32 [[TMP2]], 1
13-
; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP1]], 1
14-
; CHECK-NEXT: br i1 [[TMP3]], label %[[FOR_END_UNR_LCSSA:.*]], label %[[ENTRY_NEW:.*]]
15-
; CHECK: [[ENTRY_NEW]]:
16-
; CHECK-NEXT: [[UNROLL_ITER:%.*]] = sub i32 [[TMP2]], [[XTRAITER]]
179
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
1810
; CHECK: [[FOR_BODY]]:
19-
; CHECK-NEXT: [[INDVAR:%.*]] = phi i32 [ 2, %[[ENTRY_NEW]] ], [ [[NEXT_1:%.*]], %[[FOR_BODY]] ]
20-
; CHECK-NEXT: [[NITER:%.*]] = phi i32 [ 0, %[[ENTRY_NEW]] ], [ [[NITER_NEXT_1:%.*]], %[[FOR_BODY]] ]
11+
; CHECK-NEXT: [[INDVAR:%.*]] = phi i32 [ 2, %[[ENTRY]] ], [ [[NEXT_1:%.*]], %[[FOR_BODY_1:.*]] ]
2112
; CHECK-NEXT: [[NEXT:%.*]] = add nsw i32 [[INDVAR]], [[INC]]
13+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[NEXT]], 2
14+
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[FOR_END:.*]], label %[[FOR_BODY_1]], !llvm.loop [[LOOP0:![0-9]+]]
15+
; CHECK: [[FOR_BODY_1]]:
2216
; CHECK-NEXT: [[NEXT_1]] = add nsw i32 [[NEXT]], [[INC]]
23-
; CHECK-NEXT: [[NITER_NEXT_1]] = add i32 [[NITER]], 2
24-
; CHECK-NEXT: [[NITER_NCMP_1:%.*]] = icmp eq i32 [[NITER_NEXT_1]], [[UNROLL_ITER]]
25-
; CHECK-NEXT: br i1 [[NITER_NCMP_1]], label %[[FOR_END_UNR_LCSSA_LOOPEXIT:.*]], label %[[FOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
26-
; CHECK: [[FOR_END_UNR_LCSSA_LOOPEXIT]]:
27-
; CHECK-NEXT: br label %[[FOR_END_UNR_LCSSA]]
28-
; CHECK: [[FOR_END_UNR_LCSSA]]:
29-
; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i32 [[XTRAITER]], 0
30-
; CHECK-NEXT: br i1 [[LCMP_MOD]], label %[[FOR_BODY_EPIL_PREHEADER:.*]], label %[[FOR_END:.*]]
31-
; CHECK: [[FOR_BODY_EPIL_PREHEADER]]:
32-
; CHECK-NEXT: br label %[[FOR_BODY_EPIL:.*]]
33-
; CHECK: [[FOR_BODY_EPIL]]:
34-
; CHECK-NEXT: br label %[[FOR_END]]
17+
; CHECK-NEXT: [[EXITCOND_1:%.*]] = icmp eq i32 [[NEXT_1]], 2
18+
; CHECK-NEXT: br i1 [[EXITCOND_1]], label %[[FOR_END]], label %[[FOR_BODY]], !llvm.loop [[LOOP2:![0-9]+]]
3519
; CHECK: [[FOR_END]]:
3620
; CHECK-NEXT: ret i32 0
3721
;
@@ -53,5 +37,7 @@ for.end:
5337
!0 = !{!0, !{!"llvm.loop.unroll.count", i32 2}}
5438
;.
5539
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]]}
56-
; CHECK: [[META1]] = !{!"llvm.loop.unroll.disable"}
40+
; CHECK: [[META1]] = !{!"llvm.loop.unroll.count", i32 2}
41+
; CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[META3:![0-9]+]]}
42+
; CHECK: [[META3]] = !{!"llvm.loop.unroll.disable"}
5743
;.

0 commit comments

Comments
 (0)