blob: 43f4c04fa92758ab4734c23b551b71919401c35f [file] [log] [blame]
Max Kazantsev2e44d292017-03-31 12:05:30 +00001; 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}