xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/finite-trip-count.ll (revision 02ee96eca90741031a26f0f06cd48bb0ba558d1a)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0  -scalar-evolution-classify-expressions=0  2>&1 | FileCheck %s
3
4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5target triple = "x86_64-unknown-linux-gnu"
6
7declare void @non_exit_use(i32 %i) #0
8
9define void @sle_pre_inc(i32 %len) willreturn {
10; CHECK-LABEL: 'sle_pre_inc'
11; CHECK-NEXT:  Determining loop execution counts for: @sle_pre_inc
12; CHECK-NEXT:  Loop %for.body: backedge-taken count is (0 smax (1 + %len))
13; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483647
14; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (0 smax (1 + %len))
15; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
16;
17entry:
18  br label %for.body
19
20for.body:
21  %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]
22  call void @non_exit_use(i32 %iv) nounwind willreturn
23  %inc = add i32 %iv, 1
24  %cmp = icmp sle i32 %iv, %len
25  br i1 %cmp, label %for.body, label %for.end
26
27for.end:
28  ret void
29}
30
31define void @sle_post_inc(i32 %len) willreturn {
32; CHECK-LABEL: 'sle_post_inc'
33; CHECK-NEXT:  Determining loop execution counts for: @sle_post_inc
34; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + (1 smax (1 + %len)))<nsw>
35; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483646
36; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + (1 smax (1 + %len)))<nsw>
37; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
38;
39entry:
40  br label %for.body
41
42for.body:
43  %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]
44  call void @non_exit_use(i32 %iv) nounwind willreturn
45  %inc = add i32 %iv, 1
46  %cmp = icmp sle i32 %inc, %len
47  br i1 %cmp, label %for.body, label %for.end
48
49for.end:
50  ret void
51}
52
53define void @sle_pre_inc_infinite(i32 %len) {
54; CHECK-LABEL: 'sle_pre_inc_infinite'
55; CHECK-NEXT:  Determining loop execution counts for: @sle_pre_inc_infinite
56; CHECK-NEXT:  Loop %for.body: Unpredictable backedge-taken count.
57; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.
58; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.
59; CHECK-NEXT:  Loop %for.body: Predicated backedge-taken count is (0 smax (1 + (sext i32 %len to i64))<nsw>)
60; CHECK-NEXT:   Predicates:
61; CHECK-NEXT:      {0,+,1}<%for.body> Added Flags: <nssw>
62; CHECK-NEXT:  Loop %for.body: Predicated constant max backedge-taken count is i64 2147483648
63; CHECK-NEXT:   Predicates:
64; CHECK-NEXT:      {0,+,1}<%for.body> Added Flags: <nssw>
65; CHECK-NEXT:  Loop %for.body: Predicated symbolic max backedge-taken count is (0 smax (1 + (sext i32 %len to i64))<nsw>)
66; CHECK-NEXT:   Predicates:
67; CHECK-NEXT:      {0,+,1}<%for.body> Added Flags: <nssw>
68;
69entry:
70  br label %for.body
71
72for.body:
73  %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]
74  call void @non_exit_use(i32 %iv) nounwind willreturn
75  %inc = add i32 %iv, 1
76  %cmp = icmp sle i32 %iv, %len
77  br i1 %cmp, label %for.body, label %for.end
78
79for.end:
80  ret void
81}
82
83define void @ule_pre_inc(i32 %len) willreturn {
84; CHECK-LABEL: 'ule_pre_inc'
85; CHECK-NEXT:  Determining loop execution counts for: @ule_pre_inc
86; CHECK-NEXT:  Loop %for.body: backedge-taken count is (1 + %len)
87; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -1
88; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (1 + %len)
89; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
90;
91entry:
92  br label %for.body
93
94for.body:
95  %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]
96  call void @non_exit_use(i32 %iv) nounwind willreturn
97  %inc = add i32 %iv, 1
98  %cmp = icmp ule i32 %iv, %len
99  br i1 %cmp, label %for.body, label %for.end
100
101for.end:
102  ret void
103}
104
105define void @ule_post_inc(i32 %len) willreturn {
106; CHECK-LABEL: 'ule_post_inc'
107; CHECK-NEXT:  Determining loop execution counts for: @ule_post_inc
108; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + (1 umax (1 + %len)))
109; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2
110; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + (1 umax (1 + %len)))
111; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
112;
113entry:
114  br label %for.body
115
116for.body:
117  %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]
118  call void @non_exit_use(i32 %iv) nounwind willreturn
119  %inc = add i32 %iv, 1
120  %cmp = icmp ule i32 %inc, %len
121  br i1 %cmp, label %for.body, label %for.end
122
123for.end:
124  ret void
125}
126
127define void @ule_pre_inc_infinite(i32 %len) {
128; CHECK-LABEL: 'ule_pre_inc_infinite'
129; CHECK-NEXT:  Determining loop execution counts for: @ule_pre_inc_infinite
130; CHECK-NEXT:  Loop %for.body: Unpredictable backedge-taken count.
131; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.
132; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.
133; CHECK-NEXT:  Loop %for.body: Predicated backedge-taken count is (1 + (zext i32 %len to i64))<nuw><nsw>
134; CHECK-NEXT:   Predicates:
135; CHECK-NEXT:      {0,+,1}<%for.body> Added Flags: <nusw>
136; CHECK-NEXT:  Loop %for.body: Predicated constant max backedge-taken count is i64 4294967296
137; CHECK-NEXT:   Predicates:
138; CHECK-NEXT:      {0,+,1}<%for.body> Added Flags: <nusw>
139; CHECK-NEXT:  Loop %for.body: Predicated symbolic max backedge-taken count is (1 + (zext i32 %len to i64))<nuw><nsw>
140; CHECK-NEXT:   Predicates:
141; CHECK-NEXT:      {0,+,1}<%for.body> Added Flags: <nusw>
142;
143entry:
144  br label %for.body
145
146for.body:
147  %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]
148  call void @non_exit_use(i32 %iv) nounwind willreturn
149  %inc = add i32 %iv, 1
150  %cmp = icmp ule i32 %iv, %len
151  br i1 %cmp, label %for.body, label %for.end
152
153for.end:
154  ret void
155}
156
157define void @sge_pre_inc(i32 %end) willreturn {
158; CHECK-LABEL: 'sge_pre_inc'
159; CHECK-NEXT:  Determining loop execution counts for: @sge_pre_inc
160; CHECK-NEXT:  Loop %for.body: backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))
161; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2147483548
162; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))
163; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
164;
165entry:
166  br label %for.body
167
168for.body:
169  %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]
170  call void @non_exit_use(i32 %iv) nounwind willreturn
171  %inc = add i32 %iv, -1
172  %cmp = icmp sge i32 %iv, %end
173  br i1 %cmp, label %for.body, label %for.end
174
175for.end:
176  ret void
177}
178
179define void @sge_post_inc(i32 %end) willreturn {
180; CHECK-LABEL: 'sge_post_inc'
181; CHECK-NEXT:  Determining loop execution counts for: @sge_post_inc
182; CHECK-NEXT:  Loop %for.body: backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))
183; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2147483548
184; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))
185; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
186;
187entry:
188  br label %for.body
189
190for.body:
191  %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]
192  call void @non_exit_use(i32 %iv) nounwind willreturn
193  %inc = add i32 %iv, -1
194  %cmp = icmp sge i32 %iv, %end
195  br i1 %cmp, label %for.body, label %for.end
196
197for.end:
198  ret void
199}
200
201define void @sge_pre_inc_infinite(i32 %end) {
202; CHECK-LABEL: 'sge_pre_inc_infinite'
203; CHECK-NEXT:  Determining loop execution counts for: @sge_pre_inc_infinite
204; CHECK-NEXT:  Loop %for.body: Unpredictable backedge-taken count.
205; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.
206; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.
207;
208entry:
209  br label %for.body
210
211for.body:
212  %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]
213  call void @non_exit_use(i32 %iv) nounwind willreturn
214  %inc = add i32 %iv, -1
215  %cmp = icmp sge i32 %iv, %end
216  br i1 %cmp, label %for.body, label %for.end
217
218for.end:
219  ret void
220}
221
222define void @use_pre_inc(i32 %end) willreturn {
223; CHECK-LABEL: 'use_pre_inc'
224; CHECK-NEXT:  Determining loop execution counts for: @use_pre_inc
225; CHECK-NEXT:  Loop %for.body: backedge-taken count is (100 + (-1 * (100 umin (-1 + %end)))<nsw>)<nsw>
226; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 100
227; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 umin (-1 + %end)))<nsw>)<nsw>
228; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
229;
230entry:
231  br label %for.body
232
233for.body:
234  %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]
235  call void @non_exit_use(i32 %iv) nounwind willreturn
236  %inc = add i32 %iv, -1
237  %cmp = icmp uge i32 %iv, %end
238  br i1 %cmp, label %for.body, label %for.end
239
240for.end:
241  ret void
242}
243
244define void @use_post_inc(i32 %end) willreturn {
245; CHECK-LABEL: 'use_post_inc'
246; CHECK-NEXT:  Determining loop execution counts for: @use_post_inc
247; CHECK-NEXT:  Loop %for.body: backedge-taken count is (99 + (-1 * (99 umin (-1 + %end)))<nsw>)<nsw>
248; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 99
249; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (99 + (-1 * (99 umin (-1 + %end)))<nsw>)<nsw>
250; CHECK-NEXT:  Loop %for.body: Trip multiple is 1
251;
252entry:
253  br label %for.body
254
255for.body:
256  %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]
257  call void @non_exit_use(i32 %iv) nounwind willreturn
258  %inc = add i32 %iv, -1
259  %cmp = icmp uge i32 %inc, %end
260  br i1 %cmp, label %for.body, label %for.end
261
262for.end:
263  ret void
264}
265
266define void @uge_pre_inc_infinite(i32 %end) {
267; CHECK-LABEL: 'uge_pre_inc_infinite'
268; CHECK-NEXT:  Determining loop execution counts for: @uge_pre_inc_infinite
269; CHECK-NEXT:  Loop %for.body: Unpredictable backedge-taken count.
270; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.
271; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.
272;
273entry:
274  br label %for.body
275
276for.body:
277  %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]
278  call void @non_exit_use(i32 %iv) nounwind willreturn
279  %inc = add i32 %iv, -1
280  %cmp = icmp uge i32 %iv, %end
281  br i1 %cmp, label %for.body, label %for.end
282
283for.end:
284  ret void
285}
286
287define void @pr54191(i64 %n) mustprogress {
288; CHECK-LABEL: 'pr54191'
289; CHECK-NEXT:  Determining loop execution counts for: @pr54191
290; CHECK-NEXT:  Loop %loop: backedge-taken count is ((-2 + %n) /u 2)
291; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4611686018427387902
292; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-2 + %n) /u 2)
293; CHECK-NEXT:  Loop %loop: Trip multiple is 1
294;
295entry:
296  %guard = icmp sgt i64 %n, 1
297  br i1 %guard, label %loop, label %exit
298
299loop:
300  %iv = phi i64 [ 2, %entry ], [ %iv.next, %loop ]
301  %iv.next = add nuw nsw i64 %iv, 2
302  %cmp = icmp sle i64 %iv.next, %n
303  br i1 %cmp, label %loop, label %exit
304
305exit:
306  ret void
307}
308