xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/exit-count-non-strict.ll (revision e5b0132d157ad4c9a502dc8c4a61a3a3c83646c2)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s
3
4define void @ule_from_zero(i32 %M, i32 %N) {
5; CHECK-LABEL: 'ule_from_zero'
6; CHECK-NEXT:  Determining loop execution counts for: @ule_from_zero
7; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
8; CHECK-NEXT:    exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
9; CHECK-NEXT:    exit count for latch: %N
10; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
11; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
12; CHECK-NEXT:    symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
13; CHECK-NEXT:    symbolic max exit count for latch: %N
14; CHECK-NEXT:  Loop %loop: Trip multiple is 1
15;
16entry:
17  br label %loop
18
19loop:
20  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
21  %cmp1 = icmp ule i32 %iv, %M
22  br i1 %cmp1, label %latch, label %exit
23
24latch:
25  %iv.next = add nuw i32 %iv, 1
26  %exitcond.not = icmp eq i32 %iv, %N
27  br i1 %exitcond.not, label %exit, label %loop
28
29exit:
30  ret void
31}
32
33define 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;
45entry:
46  br label %loop
47
48loop:
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
53latch:
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
58exit:
59  ret void
60}
61
62define void @ule_from_one(i32 %M, i32 %N) {
63; CHECK-LABEL: 'ule_from_one'
64; CHECK-NEXT:  Determining loop execution counts for: @ule_from_one
65; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N))
66; CHECK-NEXT:    exit count for loop: %M
67; CHECK-NEXT:    exit count for latch: (-1 + %N)
68; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
69; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N))
70; CHECK-NEXT:    symbolic max exit count for loop: %M
71; CHECK-NEXT:    symbolic max exit count for latch: (-1 + %N)
72; CHECK-NEXT:  Loop %loop: Trip multiple is 1
73;
74entry:
75  br label %loop
76
77loop:
78  %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ]
79  %cmp1 = icmp ule i32 %iv, %M
80  br i1 %cmp1, label %latch, label %exit
81
82latch:
83  %iv.next = add nuw i32 %iv, 1
84  %exitcond.not = icmp eq i32 %iv, %N
85  br i1 %exitcond.not, label %exit, label %loop
86
87exit:
88  ret void
89}
90
91define 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;
103entry:
104  br label %loop
105
106loop:
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
111latch:
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
116exit:
117  ret void
118}
119
120define void @ule_from_unknown(i32 %M, i32 %N, i32 %S) {
121; CHECK-LABEL: 'ule_from_unknown'
122; CHECK-NEXT:  Determining loop execution counts for: @ule_from_unknown
123; 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))
124; 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>))
125; CHECK-NEXT:    exit count for latch: ((-1 * %S) + %N)
126; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
127; 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))
128; 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>))
129; CHECK-NEXT:    symbolic max exit count for latch: ((-1 * %S) + %N)
130; CHECK-NEXT:  Loop %loop: Trip multiple is 1
131;
132entry:
133  br label %loop
134
135loop:
136  %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
137  %cmp1 = icmp ule i32 %iv, %M
138  br i1 %cmp1, label %latch, label %exit
139
140latch:
141  %iv.next = add nuw i32 %iv, 1
142  %exitcond.not = icmp eq i32 %iv, %N
143  br i1 %exitcond.not, label %exit, label %loop
144
145exit:
146  ret void
147}
148
149define void @ule_from_zero_no_nuw(i32 %M, i32 %N) {
150; CHECK-LABEL: 'ule_from_zero_no_nuw'
151; CHECK-NEXT:  Determining loop execution counts for: @ule_from_zero_no_nuw
152; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
153; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
154; CHECK-NEXT:    predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
155; CHECK-NEXT:     Predicates:
156; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
157; CHECK-EMPTY:
158; CHECK-NEXT:    exit count for latch: %N
159; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
160; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is %N
161; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
162; CHECK-NEXT:    predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>
163; CHECK-NEXT:     Predicates:
164; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
165; CHECK-EMPTY:
166; CHECK-NEXT:    symbolic max exit count for latch: %N
167; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)
168; CHECK-NEXT:   Predicates:
169; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
170; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 4294967295
171; CHECK-NEXT:   Predicates:
172; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
173; 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>)
174; CHECK-NEXT:   Predicates:
175; CHECK-NEXT:      {0,+,1}<%loop> Added Flags: <nusw>
176;
177entry:
178  br label %loop
179
180loop:
181  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
182  %cmp1 = icmp ule i32 %iv, %M
183  br i1 %cmp1, label %latch, label %exit
184
185latch:
186  %iv.next = add i32 %iv, 1
187  %exitcond.not = icmp eq i32 %iv, %N
188  br i1 %exitcond.not, label %exit, label %loop
189
190exit:
191  ret void
192}
193
194define 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;
222entry:
223  br label %loop
224
225loop:
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
230latch:
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
235exit:
236  ret void
237}
238
239define void @sle_from_int_min(i32 %M, i32 %N) {
240; CHECK-LABEL: 'sle_from_int_min'
241; CHECK-NEXT:  Determining loop execution counts for: @sle_from_int_min
242; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)
243; CHECK-NEXT:    exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
244; CHECK-NEXT:    exit count for latch: (-2147483648 + %N)
245; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
246; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)
247; CHECK-NEXT:    symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
248; CHECK-NEXT:    symbolic max exit count for latch: (-2147483648 + %N)
249; CHECK-NEXT:  Loop %loop: Trip multiple is 1
250;
251entry:
252  br label %loop
253
254loop:
255  %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
256  %cmp1 = icmp sle i32 %iv, %M
257  br i1 %cmp1, label %latch, label %exit
258
259latch:
260  %iv.next = add nsw i32 %iv, 1
261  %exitcond.not = icmp eq i32 %iv, %N
262  br i1 %exitcond.not, label %exit, label %loop
263
264exit:
265  ret void
266}
267
268define 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;
280entry:
281  br label %loop
282
283loop:
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
288latch:
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
293exit:
294  ret void
295}
296
297define void @sle_from_int_min_plus_one(i32 %M, i32 %N) {
298; CHECK-LABEL: 'sle_from_int_min_plus_one'
299; CHECK-NEXT:  Determining loop execution counts for: @sle_from_int_min_plus_one
300; CHECK-NEXT:  Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))
301; CHECK-NEXT:    exit count for loop: (-2147483648 + %M)
302; CHECK-NEXT:    exit count for latch: (2147483647 + %N)
303; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
304; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))
305; CHECK-NEXT:    symbolic max exit count for loop: (-2147483648 + %M)
306; CHECK-NEXT:    symbolic max exit count for latch: (2147483647 + %N)
307; CHECK-NEXT:  Loop %loop: Trip multiple is 1
308;
309entry:
310  br label %loop
311
312loop:
313  %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ]
314  %cmp1 = icmp sle i32 %iv, %M
315  br i1 %cmp1, label %latch, label %exit
316
317latch:
318  %iv.next = add nsw i32 %iv, 1
319  %exitcond.not = icmp eq i32 %iv, %N
320  br i1 %exitcond.not, label %exit, label %loop
321
322exit:
323  ret void
324}
325
326define 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;
338entry:
339  br label %loop
340
341loop:
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
346latch:
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
351exit:
352  ret void
353}
354
355define void @sle_from_unknown(i32 %M, i32 %N, i32 %S) {
356; CHECK-LABEL: 'sle_from_unknown'
357; CHECK-NEXT:  Determining loop execution counts for: @sle_from_unknown
358; 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))
359; 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>))
360; CHECK-NEXT:    exit count for latch: ((-1 * %S) + %N)
361; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4294967295
362; 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))
363; 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>))
364; CHECK-NEXT:    symbolic max exit count for latch: ((-1 * %S) + %N)
365; CHECK-NEXT:  Loop %loop: Trip multiple is 1
366;
367entry:
368  br label %loop
369
370loop:
371  %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
372  %cmp1 = icmp sle i32 %iv, %M
373  br i1 %cmp1, label %latch, label %exit
374
375latch:
376  %iv.next = add nsw i32 %iv, 1
377  %exitcond.not = icmp eq i32 %iv, %N
378  br i1 %exitcond.not, label %exit, label %loop
379
380exit:
381  ret void
382}
383
384define 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;
396entry:
397  br label %loop
398
399loop:
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
404latch:
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
409exit:
410  ret void
411}
412
413define void @sle_from_int_min_no_nsw(i32 %M, i32 %N) {
414; CHECK-LABEL: 'sle_from_int_min_no_nsw'
415; CHECK-NEXT:  Determining loop execution counts for: @sle_from_int_min_no_nsw
416; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
417; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
418; CHECK-NEXT:    predicated exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
419; CHECK-NEXT:     Predicates:
420; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
421; CHECK-EMPTY:
422; CHECK-NEXT:    exit count for latch: (-2147483648 + %N)
423; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
424; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)
425; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
426; CHECK-NEXT:    predicated symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>
427; CHECK-NEXT:     Predicates:
428; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
429; CHECK-EMPTY:
430; CHECK-NEXT:    symbolic max exit count for latch: (-2147483648 + %N)
431; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)
432; CHECK-NEXT:   Predicates:
433; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
434; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 4294967295
435; CHECK-NEXT:   Predicates:
436; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
437; 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>)
438; CHECK-NEXT:   Predicates:
439; CHECK-NEXT:      {-2147483648,+,1}<%loop> Added Flags: <nssw>
440;
441entry:
442  br label %loop
443
444loop:
445  %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
446  %cmp1 = icmp sle i32 %iv, %M
447  br i1 %cmp1, label %latch, label %exit
448
449latch:
450  %iv.next = add i32 %iv, 1
451  %exitcond.not = icmp eq i32 %iv, %N
452  br i1 %exitcond.not, label %exit, label %loop
453
454exit:
455  ret void
456}
457
458define 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;
486entry:
487  br label %loop
488
489loop:
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
494latch:
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
499exit:
500  ret void
501}
502