1; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s
2
3declare void @llvm.experimental.guard(i1, ...)
4
5define void @test_1(i32 %n) nounwind {
6; Prove that (n > 1) ===> (n / 2 > 0).
7; CHECK:         Determining loop execution counts for: @test_1
8; CHECK:         Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw>
9entry:
10  %cmp1 = icmp sgt i32 %n, 1
11  %n.div.2 = sdiv i32 %n, 2
12  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
13  br label %header
14
15header:
16  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
17  %indvar.next = add i32 %indvar, 1
18  %exitcond = icmp sgt i32 %n.div.2, %indvar.next
19  br i1 %exitcond, label %header, label %exit
20
21exit:
22  ret void
23}
24
25define void @test_1neg(i32 %n) nounwind {
26; Prove that (n > 0) =\=> (n / 2 > 0).
27; CHECK:         Determining loop execution counts for: @test_1neg
28; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
29entry:
30  %cmp1 = icmp sgt i32 %n, 0
31  %n.div.2 = sdiv i32 %n, 2
32  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
33  br label %header
34
35header:
36  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
37  %indvar.next = add i32 %indvar, 1
38  %exitcond = icmp sgt i32 %n.div.2, %indvar.next
39  br i1 %exitcond, label %header, label %exit
40
41exit:
42  ret void
43}
44
45define void @test_2(i32 %n) nounwind {
46; Prove that (n >= 2) ===> (n / 2 > 0).
47; CHECK:         Determining loop execution counts for: @test_2
48; CHECK:         Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw>
49entry:
50  %cmp1 = icmp sge i32 %n, 2
51  %n.div.2 = sdiv i32 %n, 2
52  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
53  br label %header
54
55header:
56  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
57  %indvar.next = add i32 %indvar, 1
58  %exitcond = icmp sgt i32 %n.div.2, %indvar.next
59  br i1 %exitcond, label %header, label %exit
60
61exit:
62  ret void
63}
64
65define void @test_2neg(i32 %n) nounwind {
66; Prove that (n >= 1) =\=> (n / 2 > 0).
67; CHECK:         Determining loop execution counts for: @test_2neg
68; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
69entry:
70  %cmp1 = icmp sge i32 %n, 1
71  %n.div.2 = sdiv i32 %n, 2
72  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
73  br label %header
74
75header:
76  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
77  %indvar.next = add i32 %indvar, 1
78  %exitcond = icmp sgt i32 %n.div.2, %indvar.next
79  br i1 %exitcond, label %header, label %exit
80
81exit:
82  ret void
83}
84
85define void @test_3(i32 %n) nounwind {
86; Prove that (n > -2) ===> (n / 2 >= 0).
87; CHECK:         Determining loop execution counts for: @test_3
88; CHECK:         Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
89entry:
90  %cmp1 = icmp sgt i32 %n, -2
91  %n.div.2 = sdiv i32 %n, 2
92  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
93  br label %header
94
95header:
96  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
97  %indvar.next = add i32 %indvar, 1
98  %exitcond = icmp sge i32 %n.div.2, %indvar
99  br i1 %exitcond, label %header, label %exit
100
101exit:
102  ret void
103}
104
105define void @test_3neg(i32 %n) nounwind {
106; Prove that (n > -3) =\=> (n / 2 >= 0).
107; CHECK:         Determining loop execution counts for: @test_3neg
108; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
109entry:
110  %cmp1 = icmp sgt i32 %n, -3
111  %n.div.2 = sdiv i32 %n, 2
112  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
113  br label %header
114
115header:
116  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
117  %indvar.next = add i32 %indvar, 1
118  %exitcond = icmp sge i32 %n.div.2, %indvar
119  br i1 %exitcond, label %header, label %exit
120
121exit:
122  ret void
123}
124
125define void @test_4(i32 %n) nounwind {
126; Prove that (n >= -1) ===> (n / 2 >= 0).
127; CHECK:         Determining loop execution counts for: @test_4
128; CHECK:         Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
129entry:
130  %cmp1 = icmp sge i32 %n, -1
131  %n.div.2 = sdiv i32 %n, 2
132  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
133  br label %header
134
135header:
136  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
137  %indvar.next = add i32 %indvar, 1
138  %exitcond = icmp sge i32 %n.div.2, %indvar
139  br i1 %exitcond, label %header, label %exit
140
141exit:
142  ret void
143}
144
145define void @test_4neg(i32 %n) nounwind {
146; Prove that (n >= -2) =\=> (n / 2 >= 0).
147; CHECK:         Determining loop execution counts for: @test_4neg
148; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
149entry:
150  %cmp1 = icmp sge i32 %n, -2
151  %n.div.2 = sdiv i32 %n, 2
152  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
153  br label %header
154
155header:
156  %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
157  %indvar.next = add i32 %indvar, 1
158  %exitcond = icmp sge i32 %n.div.2, %indvar
159  br i1 %exitcond, label %header, label %exit
160
161exit:
162  ret void
163}
164
165define void @test_ext_01(i32 %n) nounwind {
166; Prove that (n > 1) ===> (n / 2 > 0).
167; CHECK:         Determining loop execution counts for: @test_ext_01
168; CHECK:         Loop %header: backedge-taken count is (-1 + (sext i32 %n.div.2 to i64))<nsw>
169entry:
170  %cmp1 = icmp sgt i32 %n, 1
171  %n.div.2 = sdiv i32 %n, 2
172  %n.div.2.ext = sext i32 %n.div.2 to i64
173  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
174  br label %header
175
176header:
177  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
178  %indvar.next = add i64 %indvar, 1
179  %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
180  br i1 %exitcond, label %header, label %exit
181
182exit:
183  ret void
184}
185
186define void @test_ext_01neg(i32 %n) nounwind {
187; Prove that (n > 0) =\=> (n / 2 > 0).
188; CHECK:         Determining loop execution counts for: @test_ext_01neg
189; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax (sext i32 %n.div.2 to i64)))<nsw>
190entry:
191  %cmp1 = icmp sgt i32 %n, 0
192  %n.div.2 = sdiv i32 %n, 2
193  %n.div.2.ext = sext i32 %n.div.2 to i64
194  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
195  br label %header
196
197header:
198  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
199  %indvar.next = add i64 %indvar, 1
200  %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
201  br i1 %exitcond, label %header, label %exit
202
203exit:
204  ret void
205}
206
207define void @test_ext_02(i32 %n) nounwind {
208; Prove that (n >= 2) ===> (n / 2 > 0).
209; CHECK:         Determining loop execution counts for: @test_ext_02
210; CHECK:         Loop %header: backedge-taken count is (-1 + (sext i32 %n.div.2 to i64))<nsw>
211entry:
212  %cmp1 = icmp sge i32 %n, 2
213  %n.div.2 = sdiv i32 %n, 2
214  %n.div.2.ext = sext i32 %n.div.2 to i64
215  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
216  br label %header
217
218header:
219  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
220  %indvar.next = add i64 %indvar, 1
221  %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
222  br i1 %exitcond, label %header, label %exit
223
224exit:
225  ret void
226}
227
228define void @test_ext_02neg(i32 %n) nounwind {
229; Prove that (n >= 1) =\=> (n / 2 > 0).
230; CHECK:         Determining loop execution counts for: @test_ext_02neg
231; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax (sext i32 %n.div.2 to i64)))<nsw>
232entry:
233  %cmp1 = icmp sge i32 %n, 1
234  %n.div.2 = sdiv i32 %n, 2
235  %n.div.2.ext = sext i32 %n.div.2 to i64
236  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
237  br label %header
238
239header:
240  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
241  %indvar.next = add i64 %indvar, 1
242  %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
243  br i1 %exitcond, label %header, label %exit
244
245exit:
246  ret void
247}
248
249define void @test_ext_03(i32 %n) nounwind {
250; Prove that (n > -2) ===> (n / 2 >= 0).
251; CHECK:         Determining loop execution counts for: @test_ext_03
252; CHECK:         Loop %header: backedge-taken count is (1 + (sext i32 %n.div.2 to i64))<nsw>
253entry:
254  %cmp1 = icmp sgt i32 %n, -2
255  %n.div.2 = sdiv i32 %n, 2
256  %n.div.2.ext = sext i32 %n.div.2 to i64
257  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
258  br label %header
259
260header:
261  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
262  %indvar.next = add i64 %indvar, 1
263  %exitcond = icmp sge i64 %n.div.2.ext, %indvar
264  br i1 %exitcond, label %header, label %exit
265
266exit:
267  ret void
268}
269
270define void @test_ext_03neg(i32 %n) nounwind {
271; Prove that (n > -3) =\=> (n / 2 >= 0).
272; CHECK:         Determining loop execution counts for: @test_ext_03neg
273; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + (sext i32 %n.div.2 to i64))<nsw>)
274entry:
275  %cmp1 = icmp sgt i32 %n, -3
276  %n.div.2 = sdiv i32 %n, 2
277  %n.div.2.ext = sext i32 %n.div.2 to i64
278  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
279  br label %header
280
281header:
282  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
283  %indvar.next = add i64 %indvar, 1
284  %exitcond = icmp sge i64 %n.div.2.ext, %indvar
285  br i1 %exitcond, label %header, label %exit
286
287exit:
288  ret void
289}
290
291define void @test_ext_04(i32 %n) nounwind {
292; Prove that (n >= -1) ===> (n / 2 >= 0).
293; CHECK:         Determining loop execution counts for: @test_ext_04
294; CHECK:         Loop %header: backedge-taken count is (1 + (sext i32 %n.div.2 to i64))<nsw>
295entry:
296  %cmp1 = icmp sge i32 %n, -1
297  %n.div.2 = sdiv i32 %n, 2
298  %n.div.2.ext = sext i32 %n.div.2 to i64
299  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
300  br label %header
301
302header:
303  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
304  %indvar.next = add i64 %indvar, 1
305  %exitcond = icmp sge i64 %n.div.2.ext, %indvar
306  br i1 %exitcond, label %header, label %exit
307
308exit:
309  ret void
310}
311
312define void @test_ext_04neg(i32 %n) nounwind {
313; Prove that (n >= -2) =\=> (n / 2 >= 0).
314; CHECK:         Determining loop execution counts for: @test_ext_04neg
315; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + (sext i32 %n.div.2 to i64))<nsw>)
316entry:
317  %cmp1 = icmp sge i32 %n, -2
318  %n.div.2 = sdiv i32 %n, 2
319  %n.div.2.ext = sext i32 %n.div.2 to i64
320  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
321  br label %header
322
323header:
324  %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
325  %indvar.next = add i64 %indvar, 1
326  %exitcond = icmp sge i64 %n.div.2.ext, %indvar
327  br i1 %exitcond, label %header, label %exit
328
329exit:
330  ret void
331}
332