xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/exit-count-non-strict.ll (revision e5b0132d157ad4c9a502dc8c4a61a3a3c83646c2)
16642cc60SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
26642cc60SNikita Popov; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s
36642cc60SNikita Popov
46642cc60SNikita Popovdefine void @ule_from_zero(i32 %M, i32 %N) {
56642cc60SNikita Popov; CHECK-LABEL: 'ule_from_zero'
66642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @ule_from_zero
7ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
8ca478bc6SNikita Popov; CHECK-NEXT:    exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
96642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: %N
10ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
11ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
12ca478bc6SNikita Popov; CHECK-NEXT:    symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
136642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: %N
14ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
156642cc60SNikita Popov;
166642cc60SNikita Popoventry:
176642cc60SNikita Popov  br label %loop
186642cc60SNikita Popov
196642cc60SNikita Popovloop:
206642cc60SNikita Popov  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
216642cc60SNikita Popov  %cmp1 = icmp ule i32 %iv, %M
226642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
236642cc60SNikita Popov
246642cc60SNikita Popovlatch:
256642cc60SNikita Popov  %iv.next = add nuw i32 %iv, 1
266642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
276642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
286642cc60SNikita Popov
296642cc60SNikita Popovexit:
306642cc60SNikita Popov  ret void
316642cc60SNikita Popov}
326642cc60SNikita Popov
33*e5b0132dSRamkumar Ramachandradefine void @le_from_zero(i32 %M, i32 %N) {
34*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_zero'
35*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Determining loop execution counts for: @le_from_zero
36*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
38*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for latch: %N
39*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
40*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
42*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for latch: %N
43*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Trip multiple is 1
44*e5b0132dSRamkumar Ramachandra;
45*e5b0132dSRamkumar Ramachandraentry:
46*e5b0132dSRamkumar Ramachandra  br label %loop
47*e5b0132dSRamkumar Ramachandra
48*e5b0132dSRamkumar Ramachandraloop:
49*e5b0132dSRamkumar Ramachandra  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
50*e5b0132dSRamkumar Ramachandra  %cmp1 = icmp samesign ule i32 %iv, %M
51*e5b0132dSRamkumar Ramachandra  br i1 %cmp1, label %latch, label %exit
52*e5b0132dSRamkumar Ramachandra
53*e5b0132dSRamkumar Ramachandralatch:
54*e5b0132dSRamkumar Ramachandra  %iv.next = add nuw i32 %iv, 1
55*e5b0132dSRamkumar Ramachandra  %exitcond.not = icmp eq i32 %iv, %N
56*e5b0132dSRamkumar Ramachandra  br i1 %exitcond.not, label %exit, label %loop
57*e5b0132dSRamkumar Ramachandra
58*e5b0132dSRamkumar Ramachandraexit:
59*e5b0132dSRamkumar Ramachandra  ret void
60*e5b0132dSRamkumar Ramachandra}
61*e5b0132dSRamkumar Ramachandra
626642cc60SNikita Popovdefine void @ule_from_one(i32 %M, i32 %N) {
636642cc60SNikita Popov; CHECK-LABEL: 'ule_from_one'
646642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @ule_from_one
656642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N))
666642cc60SNikita Popov; CHECK-NEXT:    exit count for loop: %M
676642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: (-1 + %N)
686642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
696642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N))
706642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for loop: %M
716642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: (-1 + %N)
726642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
736642cc60SNikita Popov;
746642cc60SNikita Popoventry:
756642cc60SNikita Popov  br label %loop
766642cc60SNikita Popov
776642cc60SNikita Popovloop:
786642cc60SNikita Popov  %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ]
796642cc60SNikita Popov  %cmp1 = icmp ule i32 %iv, %M
806642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
816642cc60SNikita Popov
826642cc60SNikita Popovlatch:
836642cc60SNikita Popov  %iv.next = add nuw i32 %iv, 1
846642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
856642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
866642cc60SNikita Popov
876642cc60SNikita Popovexit:
886642cc60SNikita Popov  ret void
896642cc60SNikita Popov}
906642cc60SNikita Popov
91*e5b0132dSRamkumar Ramachandradefine void @le_from_one(i32 %M, i32 %N) {
92*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_one'
93*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Determining loop execution counts for: @le_from_one
94*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N))
95*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for loop: %M
96*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for latch: (-1 + %N)
97*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
98*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N))
99*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for loop: %M
100*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for latch: (-1 + %N)
101*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Trip multiple is 1
102*e5b0132dSRamkumar Ramachandra;
103*e5b0132dSRamkumar Ramachandraentry:
104*e5b0132dSRamkumar Ramachandra  br label %loop
105*e5b0132dSRamkumar Ramachandra
106*e5b0132dSRamkumar Ramachandraloop:
107*e5b0132dSRamkumar Ramachandra  %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ]
108*e5b0132dSRamkumar Ramachandra  %cmp1 = icmp samesign ule i32 %iv, %M
109*e5b0132dSRamkumar Ramachandra  br i1 %cmp1, label %latch, label %exit
110*e5b0132dSRamkumar Ramachandra
111*e5b0132dSRamkumar Ramachandralatch:
112*e5b0132dSRamkumar Ramachandra  %iv.next = add nuw i32 %iv, 1
113*e5b0132dSRamkumar Ramachandra  %exitcond.not = icmp eq i32 %iv, %N
114*e5b0132dSRamkumar Ramachandra  br i1 %exitcond.not, label %exit, label %loop
115*e5b0132dSRamkumar Ramachandra
116*e5b0132dSRamkumar Ramachandraexit:
117*e5b0132dSRamkumar Ramachandra  ret void
118*e5b0132dSRamkumar Ramachandra}
119*e5b0132dSRamkumar Ramachandra
1206642cc60SNikita Popovdefine void @ule_from_unknown(i32 %M, i32 %N, i32 %S) {
1216642cc60SNikita Popov; CHECK-LABEL: 'ule_from_unknown'
1226642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @ule_from_unknown
123ca478bc6SNikita Popov; 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))
124ca478bc6SNikita Popov; 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>))
1256642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: ((-1 * %S) + %N)
126ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
127ca478bc6SNikita Popov; 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))
128ca478bc6SNikita Popov; 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>))
1296642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: ((-1 * %S) + %N)
130ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1316642cc60SNikita Popov;
1326642cc60SNikita Popoventry:
1336642cc60SNikita Popov  br label %loop
1346642cc60SNikita Popov
1356642cc60SNikita Popovloop:
1366642cc60SNikita Popov  %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
1376642cc60SNikita Popov  %cmp1 = icmp ule i32 %iv, %M
1386642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
1396642cc60SNikita Popov
1406642cc60SNikita Popovlatch:
1416642cc60SNikita Popov  %iv.next = add nuw i32 %iv, 1
1426642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
1436642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
1446642cc60SNikita Popov
1456642cc60SNikita Popovexit:
1466642cc60SNikita Popov  ret void
1476642cc60SNikita Popov}
1486642cc60SNikita Popov
1496642cc60SNikita Popovdefine void @ule_from_zero_no_nuw(i32 %M, i32 %N) {
1506642cc60SNikita Popov; CHECK-LABEL: 'ule_from_zero_no_nuw'
1516642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @ule_from_zero_no_nuw
1526642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1536642cc60SNikita Popov; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
154df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
155df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
156df3d70b5SDavid Sherwood; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
157df3d70b5SDavid Sherwood; CHECK-EMPTY:
1586642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: %N
1596642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
1606642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is %N
1616642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
162df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
163df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
164df3d70b5SDavid Sherwood; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
165df3d70b5SDavid Sherwood; CHECK-EMPTY:
1666642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: %N
167ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
168ca478bc6SNikita Popov; CHECK-NEXT:   Predicates:
169ca478bc6SNikita Popov; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
17002ee96ecSDavid Sherwood; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 4294967295
17102ee96ecSDavid Sherwood; CHECK-NEXT:   Predicates:
17202ee96ecSDavid Sherwood; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
173df3d70b5SDavid Sherwood; 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>)
174df3d70b5SDavid Sherwood; CHECK-NEXT:   Predicates:
175df3d70b5SDavid Sherwood; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
1766642cc60SNikita Popov;
1776642cc60SNikita Popoventry:
1786642cc60SNikita Popov  br label %loop
1796642cc60SNikita Popov
1806642cc60SNikita Popovloop:
1816642cc60SNikita Popov  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
1826642cc60SNikita Popov  %cmp1 = icmp ule i32 %iv, %M
1836642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
1846642cc60SNikita Popov
1856642cc60SNikita Popovlatch:
1866642cc60SNikita Popov  %iv.next = add i32 %iv, 1
1876642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
1886642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
1896642cc60SNikita Popov
1906642cc60SNikita Popovexit:
1916642cc60SNikita Popov  ret void
1926642cc60SNikita Popov}
1936642cc60SNikita Popov
194*e5b0132dSRamkumar Ramachandradefine void @le_from_zero_no_nuw(i32 %M, i32 %N) {
195*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_zero_no_nuw'
196*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Determining loop execution counts for: @le_from_zero_no_nuw
197*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
198*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
199*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
200*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:     Predicates:
201*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
202*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY:
203*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for latch: %N
204*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
205*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is %N
206*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
207*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
208*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:     Predicates:
209*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
210*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY:
211*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for latch: %N
212*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
213*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:   Predicates:
214*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
215*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 4294967295
216*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:   Predicates:
217*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
218*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:   Predicates:
220*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
221*e5b0132dSRamkumar Ramachandra;
222*e5b0132dSRamkumar Ramachandraentry:
223*e5b0132dSRamkumar Ramachandra  br label %loop
224*e5b0132dSRamkumar Ramachandra
225*e5b0132dSRamkumar Ramachandraloop:
226*e5b0132dSRamkumar Ramachandra  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
227*e5b0132dSRamkumar Ramachandra  %cmp1 = icmp samesign ule i32 %iv, %M
228*e5b0132dSRamkumar Ramachandra  br i1 %cmp1, label %latch, label %exit
229*e5b0132dSRamkumar Ramachandra
230*e5b0132dSRamkumar Ramachandralatch:
231*e5b0132dSRamkumar Ramachandra  %iv.next = add i32 %iv, 1
232*e5b0132dSRamkumar Ramachandra  %exitcond.not = icmp eq i32 %iv, %N
233*e5b0132dSRamkumar Ramachandra  br i1 %exitcond.not, label %exit, label %loop
234*e5b0132dSRamkumar Ramachandra
235*e5b0132dSRamkumar Ramachandraexit:
236*e5b0132dSRamkumar Ramachandra  ret void
237*e5b0132dSRamkumar Ramachandra}
238*e5b0132dSRamkumar Ramachandra
2396642cc60SNikita Popovdefine void @sle_from_int_min(i32 %M, i32 %N) {
2406642cc60SNikita Popov; CHECK-LABEL: 'sle_from_int_min'
2416642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @sle_from_int_min
242ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)
243ca478bc6SNikita Popov; CHECK-NEXT:    exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
2446642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: (-2147483648 + %N)
245ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
246ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)
247ca478bc6SNikita Popov; CHECK-NEXT:    symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
2486642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: (-2147483648 + %N)
249ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
2506642cc60SNikita Popov;
2516642cc60SNikita Popoventry:
2526642cc60SNikita Popov  br label %loop
2536642cc60SNikita Popov
2546642cc60SNikita Popovloop:
2556642cc60SNikita Popov  %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
2566642cc60SNikita Popov  %cmp1 = icmp sle i32 %iv, %M
2576642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
2586642cc60SNikita Popov
2596642cc60SNikita Popovlatch:
2606642cc60SNikita Popov  %iv.next = add nsw i32 %iv, 1
2616642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
2626642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
2636642cc60SNikita Popov
2646642cc60SNikita Popovexit:
2656642cc60SNikita Popov  ret void
2666642cc60SNikita Popov}
2676642cc60SNikita Popov
268*e5b0132dSRamkumar Ramachandradefine void @le_from_int_min(i32 %M, i32 %N) {
269*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_int_min'
270*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Determining loop execution counts for: @le_from_int_min
271*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N))
272*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for loop: (-2147483647 + (2147483647 umax %M))
273*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for latch: (-2147483648 + %N)
274*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -2147483648
275*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N))
276*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for loop: (-2147483647 + (2147483647 umax %M))
277*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for latch: (-2147483648 + %N)
278*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Trip multiple is 1
279*e5b0132dSRamkumar Ramachandra;
280*e5b0132dSRamkumar Ramachandraentry:
281*e5b0132dSRamkumar Ramachandra  br label %loop
282*e5b0132dSRamkumar Ramachandra
283*e5b0132dSRamkumar Ramachandraloop:
284*e5b0132dSRamkumar Ramachandra  %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
285*e5b0132dSRamkumar Ramachandra  %cmp1 = icmp samesign ule i32 %iv, %M
286*e5b0132dSRamkumar Ramachandra  br i1 %cmp1, label %latch, label %exit
287*e5b0132dSRamkumar Ramachandra
288*e5b0132dSRamkumar Ramachandralatch:
289*e5b0132dSRamkumar Ramachandra  %iv.next = add nuw nsw i32 %iv, 1
290*e5b0132dSRamkumar Ramachandra  %exitcond.not = icmp eq i32 %iv, %N
291*e5b0132dSRamkumar Ramachandra  br i1 %exitcond.not, label %exit, label %loop
292*e5b0132dSRamkumar Ramachandra
293*e5b0132dSRamkumar Ramachandraexit:
294*e5b0132dSRamkumar Ramachandra  ret void
295*e5b0132dSRamkumar Ramachandra}
296*e5b0132dSRamkumar Ramachandra
2976642cc60SNikita Popovdefine void @sle_from_int_min_plus_one(i32 %M, i32 %N) {
2986642cc60SNikita Popov; CHECK-LABEL: 'sle_from_int_min_plus_one'
2996642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @sle_from_int_min_plus_one
3006642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))
3016642cc60SNikita Popov; CHECK-NEXT:    exit count for loop: (-2147483648 + %M)
3026642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: (2147483647 + %N)
3036642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
3046642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))
3056642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for loop: (-2147483648 + %M)
3066642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: (2147483647 + %N)
3076642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
3086642cc60SNikita Popov;
3096642cc60SNikita Popoventry:
3106642cc60SNikita Popov  br label %loop
3116642cc60SNikita Popov
3126642cc60SNikita Popovloop:
3136642cc60SNikita Popov  %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ]
3146642cc60SNikita Popov  %cmp1 = icmp sle i32 %iv, %M
3156642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
3166642cc60SNikita Popov
3176642cc60SNikita Popovlatch:
3186642cc60SNikita Popov  %iv.next = add nsw i32 %iv, 1
3196642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
3206642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
3216642cc60SNikita Popov
3226642cc60SNikita Popovexit:
3236642cc60SNikita Popov  ret void
3246642cc60SNikita Popov}
3256642cc60SNikita Popov
326*e5b0132dSRamkumar Ramachandradefine void @le_from_int_min_plus_one(i32 %M, i32 %N) {
327*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_int_min_plus_one'
328*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Determining loop execution counts for: @le_from_int_min_plus_one
329*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N))
330*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for loop: (-2147483648 + (-2147483648 umax %M))
331*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for latch: (2147483647 + %N)
332*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 2147483647
333*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N))
334*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for loop: (-2147483648 + (-2147483648 umax %M))
335*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for latch: (2147483647 + %N)
336*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Trip multiple is 1
337*e5b0132dSRamkumar Ramachandra;
338*e5b0132dSRamkumar Ramachandraentry:
339*e5b0132dSRamkumar Ramachandra  br label %loop
340*e5b0132dSRamkumar Ramachandra
341*e5b0132dSRamkumar Ramachandraloop:
342*e5b0132dSRamkumar Ramachandra  %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ]
343*e5b0132dSRamkumar Ramachandra  %cmp1 = icmp samesign ule i32 %iv, %M
344*e5b0132dSRamkumar Ramachandra  br i1 %cmp1, label %latch, label %exit
345*e5b0132dSRamkumar Ramachandra
346*e5b0132dSRamkumar Ramachandralatch:
347*e5b0132dSRamkumar Ramachandra  %iv.next = add nuw nsw i32 %iv, 1
348*e5b0132dSRamkumar Ramachandra  %exitcond.not = icmp eq i32 %iv, %N
349*e5b0132dSRamkumar Ramachandra  br i1 %exitcond.not, label %exit, label %loop
350*e5b0132dSRamkumar Ramachandra
351*e5b0132dSRamkumar Ramachandraexit:
352*e5b0132dSRamkumar Ramachandra  ret void
353*e5b0132dSRamkumar Ramachandra}
354*e5b0132dSRamkumar Ramachandra
3556642cc60SNikita Popovdefine void @sle_from_unknown(i32 %M, i32 %N, i32 %S) {
3566642cc60SNikita Popov; CHECK-LABEL: 'sle_from_unknown'
3576642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @sle_from_unknown
358ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is (((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))
359ca478bc6SNikita Popov; CHECK-NEXT:    exit count for loop: ((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>))
3606642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: ((-1 * %S) + %N)
361ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
362ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))
363ca478bc6SNikita Popov; CHECK-NEXT:    symbolic max exit count for loop: ((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>))
3646642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: ((-1 * %S) + %N)
365ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
3666642cc60SNikita Popov;
3676642cc60SNikita Popoventry:
3686642cc60SNikita Popov  br label %loop
3696642cc60SNikita Popov
3706642cc60SNikita Popovloop:
3716642cc60SNikita Popov  %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
3726642cc60SNikita Popov  %cmp1 = icmp sle i32 %iv, %M
3736642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
3746642cc60SNikita Popov
3756642cc60SNikita Popovlatch:
3766642cc60SNikita Popov  %iv.next = add nsw i32 %iv, 1
3776642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
3786642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
3796642cc60SNikita Popov
3806642cc60SNikita Popovexit:
3816642cc60SNikita Popov  ret void
3826642cc60SNikita Popov}
3836642cc60SNikita Popov
384*e5b0132dSRamkumar Ramachandradefine void @le_from_unknown(i32 %M, i32 %N, i32 %S) {
385*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_unknown'
386*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Determining loop execution counts for: @le_from_unknown
387*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for latch: ((-1 * %S) + %N)
390*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
391*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for latch: ((-1 * %S) + %N)
394*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Trip multiple is 1
395*e5b0132dSRamkumar Ramachandra;
396*e5b0132dSRamkumar Ramachandraentry:
397*e5b0132dSRamkumar Ramachandra  br label %loop
398*e5b0132dSRamkumar Ramachandra
399*e5b0132dSRamkumar Ramachandraloop:
400*e5b0132dSRamkumar Ramachandra  %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
401*e5b0132dSRamkumar Ramachandra  %cmp1 = icmp samesign ule i32 %iv, %M
402*e5b0132dSRamkumar Ramachandra  br i1 %cmp1, label %latch, label %exit
403*e5b0132dSRamkumar Ramachandra
404*e5b0132dSRamkumar Ramachandralatch:
405*e5b0132dSRamkumar Ramachandra  %iv.next = add nuw nsw i32 %iv, 1
406*e5b0132dSRamkumar Ramachandra  %exitcond.not = icmp eq i32 %iv, %N
407*e5b0132dSRamkumar Ramachandra  br i1 %exitcond.not, label %exit, label %loop
408*e5b0132dSRamkumar Ramachandra
409*e5b0132dSRamkumar Ramachandraexit:
410*e5b0132dSRamkumar Ramachandra  ret void
411*e5b0132dSRamkumar Ramachandra}
412*e5b0132dSRamkumar Ramachandra
4136642cc60SNikita Popovdefine void @sle_from_int_min_no_nsw(i32 %M, i32 %N) {
4146642cc60SNikita Popov; CHECK-LABEL: 'sle_from_int_min_no_nsw'
4156642cc60SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @sle_from_int_min_no_nsw
4166642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
4176642cc60SNikita Popov; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
418df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
419df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
420df3d70b5SDavid Sherwood; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
421df3d70b5SDavid Sherwood; CHECK-EMPTY:
4226642cc60SNikita Popov; CHECK-NEXT:    exit count for latch: (-2147483648 + %N)
4236642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
4246642cc60SNikita Popov; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)
4256642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
426df3d70b5SDavid Sherwood; CHECK-NEXT:    predicated symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
427df3d70b5SDavid Sherwood; CHECK-NEXT:     Predicates:
428df3d70b5SDavid Sherwood; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
429df3d70b5SDavid Sherwood; CHECK-EMPTY:
4306642cc60SNikita Popov; CHECK-NEXT:    symbolic max exit count for latch: (-2147483648 + %N)
431ca478bc6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)
432ca478bc6SNikita Popov; CHECK-NEXT:   Predicates:
433ca478bc6SNikita Popov; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
43402ee96ecSDavid Sherwood; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 4294967295
43502ee96ecSDavid Sherwood; CHECK-NEXT:   Predicates:
43602ee96ecSDavid Sherwood; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
437df3d70b5SDavid Sherwood; CHECK-NEXT:  Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)
438df3d70b5SDavid Sherwood; CHECK-NEXT:   Predicates:
439df3d70b5SDavid Sherwood; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
4406642cc60SNikita Popov;
4416642cc60SNikita Popoventry:
4426642cc60SNikita Popov  br label %loop
4436642cc60SNikita Popov
4446642cc60SNikita Popovloop:
4456642cc60SNikita Popov  %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
4466642cc60SNikita Popov  %cmp1 = icmp sle i32 %iv, %M
4476642cc60SNikita Popov  br i1 %cmp1, label %latch, label %exit
4486642cc60SNikita Popov
4496642cc60SNikita Popovlatch:
4506642cc60SNikita Popov  %iv.next = add i32 %iv, 1
4516642cc60SNikita Popov  %exitcond.not = icmp eq i32 %iv, %N
4526642cc60SNikita Popov  br i1 %exitcond.not, label %exit, label %loop
4536642cc60SNikita Popov
4546642cc60SNikita Popovexit:
4556642cc60SNikita Popov  ret void
4566642cc60SNikita Popov}
457*e5b0132dSRamkumar Ramachandra
458*e5b0132dSRamkumar Ramachandradefine void @le_from_int_min_no_nuw_nsw(i32 %M, i32 %N) {
459*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_int_min_no_nuw_nsw'
460*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Determining loop execution counts for: @le_from_int_min_no_nuw_nsw
461*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
462*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
463*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    predicated exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw>
464*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:     Predicates:
465*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nusw>
466*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY:
467*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    exit count for latch: (-2147483648 + %N)
468*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
469*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)
470*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
471*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    predicated symbolic max exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw>
472*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:     Predicates:
473*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nusw>
474*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY:
475*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:    symbolic max exit count for latch: (-2147483648 + %N)
476*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:   Predicates:
478*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nusw>
479*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 2147483648
480*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:   Predicates:
481*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nusw>
482*e5b0132dSRamkumar Ramachandra; 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*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:   Predicates:
484*e5b0132dSRamkumar Ramachandra; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nusw>
485*e5b0132dSRamkumar Ramachandra;
486*e5b0132dSRamkumar Ramachandraentry:
487*e5b0132dSRamkumar Ramachandra  br label %loop
488*e5b0132dSRamkumar Ramachandra
489*e5b0132dSRamkumar Ramachandraloop:
490*e5b0132dSRamkumar Ramachandra  %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
491*e5b0132dSRamkumar Ramachandra  %cmp1 = icmp samesign ule i32 %iv, %M
492*e5b0132dSRamkumar Ramachandra  br i1 %cmp1, label %latch, label %exit
493*e5b0132dSRamkumar Ramachandra
494*e5b0132dSRamkumar Ramachandralatch:
495*e5b0132dSRamkumar Ramachandra  %iv.next = add i32 %iv, 1
496*e5b0132dSRamkumar Ramachandra  %exitcond.not = icmp eq i32 %iv, %N
497*e5b0132dSRamkumar Ramachandra  br i1 %exitcond.not, label %exit, label %loop
498*e5b0132dSRamkumar Ramachandra
499*e5b0132dSRamkumar Ramachandraexit:
500*e5b0132dSRamkumar Ramachandra  ret void
501*e5b0132dSRamkumar Ramachandra}
502