Skip to content

Commit e5b0132

Browse files
authored
SCEV: add samesign tests for exit-limit computation (#124304)
As the tests demonstrate, computeExitLimitFromICmp needs no additional changes to compute exit limits from an icmp with samesign.
1 parent 5e65f43 commit e5b0132

File tree

1 file changed

+235
-0
lines changed

1 file changed

+235
-0
lines changed

llvm/test/Analysis/ScalarEvolution/exit-count-non-strict.ll

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,35 @@ exit:
3030
ret void
3131
}
3232

33+
define void @le_from_zero(i32 %M, i32 %N) {
34+
; CHECK-LABEL: 'le_from_zero'
35+
; CHECK-NEXT: Determining loop execution counts for: @le_from_zero
36+
; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
37+
; CHECK-NEXT: exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
38+
; CHECK-NEXT: exit count for latch: %N
39+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295
40+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
41+
; CHECK-NEXT: symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
42+
; CHECK-NEXT: symbolic max exit count for latch: %N
43+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
44+
;
45+
entry:
46+
br label %loop
47+
48+
loop:
49+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
50+
%cmp1 = icmp samesign ule i32 %iv, %M
51+
br i1 %cmp1, label %latch, label %exit
52+
53+
latch:
54+
%iv.next = add nuw i32 %iv, 1
55+
%exitcond.not = icmp eq i32 %iv, %N
56+
br i1 %exitcond.not, label %exit, label %loop
57+
58+
exit:
59+
ret void
60+
}
61+
3362
define void @ule_from_one(i32 %M, i32 %N) {
3463
; CHECK-LABEL: 'ule_from_one'
3564
; CHECK-NEXT: Determining loop execution counts for: @ule_from_one
@@ -59,6 +88,35 @@ exit:
5988
ret void
6089
}
6190

91+
define void @le_from_one(i32 %M, i32 %N) {
92+
; CHECK-LABEL: 'le_from_one'
93+
; CHECK-NEXT: Determining loop execution counts for: @le_from_one
94+
; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N))
95+
; CHECK-NEXT: exit count for loop: %M
96+
; CHECK-NEXT: exit count for latch: (-1 + %N)
97+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
98+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N))
99+
; CHECK-NEXT: symbolic max exit count for loop: %M
100+
; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N)
101+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
102+
;
103+
entry:
104+
br label %loop
105+
106+
loop:
107+
%iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ]
108+
%cmp1 = icmp samesign ule i32 %iv, %M
109+
br i1 %cmp1, label %latch, label %exit
110+
111+
latch:
112+
%iv.next = add nuw i32 %iv, 1
113+
%exitcond.not = icmp eq i32 %iv, %N
114+
br i1 %exitcond.not, label %exit, label %loop
115+
116+
exit:
117+
ret void
118+
}
119+
62120
define void @ule_from_unknown(i32 %M, i32 %N, i32 %S) {
63121
; CHECK-LABEL: 'ule_from_unknown'
64122
; CHECK-NEXT: Determining loop execution counts for: @ule_from_unknown
@@ -133,6 +191,51 @@ exit:
133191
ret void
134192
}
135193

194+
define void @le_from_zero_no_nuw(i32 %M, i32 %N) {
195+
; CHECK-LABEL: 'le_from_zero_no_nuw'
196+
; CHECK-NEXT: Determining loop execution counts for: @le_from_zero_no_nuw
197+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
198+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
199+
; CHECK-NEXT: predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
200+
; CHECK-NEXT: Predicates:
201+
; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>
202+
; CHECK-EMPTY:
203+
; CHECK-NEXT: exit count for latch: %N
204+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
205+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N
206+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
207+
; CHECK-NEXT: predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
208+
; CHECK-NEXT: Predicates:
209+
; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>
210+
; CHECK-EMPTY:
211+
; CHECK-NEXT: symbolic max exit count for latch: %N
212+
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
213+
; CHECK-NEXT: Predicates:
214+
; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>
215+
; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295
216+
; CHECK-NEXT: Predicates:
217+
; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>
218+
; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
219+
; CHECK-NEXT: Predicates:
220+
; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>
221+
;
222+
entry:
223+
br label %loop
224+
225+
loop:
226+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
227+
%cmp1 = icmp samesign ule i32 %iv, %M
228+
br i1 %cmp1, label %latch, label %exit
229+
230+
latch:
231+
%iv.next = add i32 %iv, 1
232+
%exitcond.not = icmp eq i32 %iv, %N
233+
br i1 %exitcond.not, label %exit, label %loop
234+
235+
exit:
236+
ret void
237+
}
238+
136239
define void @sle_from_int_min(i32 %M, i32 %N) {
137240
; CHECK-LABEL: 'sle_from_int_min'
138241
; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min
@@ -162,6 +265,35 @@ exit:
162265
ret void
163266
}
164267

268+
define void @le_from_int_min(i32 %M, i32 %N) {
269+
; CHECK-LABEL: 'le_from_int_min'
270+
; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min
271+
; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N))
272+
; CHECK-NEXT: exit count for loop: (-2147483647 + (2147483647 umax %M))
273+
; CHECK-NEXT: exit count for latch: (-2147483648 + %N)
274+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -2147483648
275+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N))
276+
; CHECK-NEXT: symbolic max exit count for loop: (-2147483647 + (2147483647 umax %M))
277+
; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)
278+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
279+
;
280+
entry:
281+
br label %loop
282+
283+
loop:
284+
%iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
285+
%cmp1 = icmp samesign ule i32 %iv, %M
286+
br i1 %cmp1, label %latch, label %exit
287+
288+
latch:
289+
%iv.next = add nuw nsw i32 %iv, 1
290+
%exitcond.not = icmp eq i32 %iv, %N
291+
br i1 %exitcond.not, label %exit, label %loop
292+
293+
exit:
294+
ret void
295+
}
296+
165297
define void @sle_from_int_min_plus_one(i32 %M, i32 %N) {
166298
; CHECK-LABEL: 'sle_from_int_min_plus_one'
167299
; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_plus_one
@@ -191,6 +323,35 @@ exit:
191323
ret void
192324
}
193325

326+
define void @le_from_int_min_plus_one(i32 %M, i32 %N) {
327+
; CHECK-LABEL: 'le_from_int_min_plus_one'
328+
; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_plus_one
329+
; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N))
330+
; CHECK-NEXT: exit count for loop: (-2147483648 + (-2147483648 umax %M))
331+
; CHECK-NEXT: exit count for latch: (2147483647 + %N)
332+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483647
333+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N))
334+
; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + (-2147483648 umax %M))
335+
; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N)
336+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
337+
;
338+
entry:
339+
br label %loop
340+
341+
loop:
342+
%iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ]
343+
%cmp1 = icmp samesign ule i32 %iv, %M
344+
br i1 %cmp1, label %latch, label %exit
345+
346+
latch:
347+
%iv.next = add nuw nsw i32 %iv, 1
348+
%exitcond.not = icmp eq i32 %iv, %N
349+
br i1 %exitcond.not, label %exit, label %loop
350+
351+
exit:
352+
ret void
353+
}
354+
194355
define void @sle_from_unknown(i32 %M, i32 %N, i32 %S) {
195356
; CHECK-LABEL: 'sle_from_unknown'
196357
; CHECK-NEXT: Determining loop execution counts for: @sle_from_unknown
@@ -220,6 +381,35 @@ exit:
220381
ret void
221382
}
222383

384+
define void @le_from_unknown(i32 %M, i32 %N, i32 %S) {
385+
; CHECK-LABEL: 'le_from_unknown'
386+
; CHECK-NEXT: Determining loop execution counts for: @le_from_unknown
387+
; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))
388+
; CHECK-NEXT: exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>))
389+
; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N)
390+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295
391+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))
392+
; CHECK-NEXT: symbolic max exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>))
393+
; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N)
394+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
395+
;
396+
entry:
397+
br label %loop
398+
399+
loop:
400+
%iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
401+
%cmp1 = icmp samesign ule i32 %iv, %M
402+
br i1 %cmp1, label %latch, label %exit
403+
404+
latch:
405+
%iv.next = add nuw nsw i32 %iv, 1
406+
%exitcond.not = icmp eq i32 %iv, %N
407+
br i1 %exitcond.not, label %exit, label %loop
408+
409+
exit:
410+
ret void
411+
}
412+
223413
define void @sle_from_int_min_no_nsw(i32 %M, i32 %N) {
224414
; CHECK-LABEL: 'sle_from_int_min_no_nsw'
225415
; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_no_nsw
@@ -264,3 +454,48 @@ latch:
264454
exit:
265455
ret void
266456
}
457+
458+
define void @le_from_int_min_no_nuw_nsw(i32 %M, i32 %N) {
459+
; CHECK-LABEL: 'le_from_int_min_no_nuw_nsw'
460+
; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_no_nuw_nsw
461+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
462+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
463+
; CHECK-NEXT: predicated exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw>
464+
; CHECK-NEXT: Predicates:
465+
; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>
466+
; CHECK-EMPTY:
467+
; CHECK-NEXT: exit count for latch: (-2147483648 + %N)
468+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
469+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)
470+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
471+
; CHECK-NEXT: predicated symbolic max exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw>
472+
; CHECK-NEXT: Predicates:
473+
; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>
474+
; CHECK-EMPTY:
475+
; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)
476+
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> umin_seq (zext i32 (-2147483648 + %N) to i64))
477+
; CHECK-NEXT: Predicates:
478+
; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>
479+
; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2147483648
480+
; CHECK-NEXT: Predicates:
481+
; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>
482+
; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> umin_seq (zext i32 (-2147483648 + %N) to i64))
483+
; CHECK-NEXT: Predicates:
484+
; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>
485+
;
486+
entry:
487+
br label %loop
488+
489+
loop:
490+
%iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
491+
%cmp1 = icmp samesign ule i32 %iv, %M
492+
br i1 %cmp1, label %latch, label %exit
493+
494+
latch:
495+
%iv.next = add i32 %iv, 1
496+
%exitcond.not = icmp eq i32 %iv, %N
497+
br i1 %exitcond.not, label %exit, label %loop
498+
499+
exit:
500+
ret void
501+
}

0 commit comments

Comments
 (0)