[AArch64] Add extra add/cast tests for select-optimize.
[llvm-project.git] / llvm / test / Analysis / ScalarEvolution / implied-via-division.ll
blob6d38f510c4997b26c303002835374a61d3c2cc0f
1 ; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
3 declare void @llvm.experimental.guard(i1, ...)
5 define 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>
9 entry:
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
15 header:
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
21 exit:
22   ret void
25 define 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>
29 entry:
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
35 header:
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
41 exit:
42   ret void
45 define 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>
49 entry:
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
55 header:
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
61 exit:
62   ret void
65 define 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>
69 entry:
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
75 header:
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
81 exit:
82   ret void
85 define 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>
89 entry:
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
95 header:
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
101 exit:
102   ret void
105 define 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>)
109 entry:
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
115 header:
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
121 exit:
122   ret void
125 define 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>
129 entry:
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
135 header:
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
141 exit:
142   ret void
145 define 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>)
149 entry:
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
155 header:
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
161 exit:
162   ret void
165 define 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>
169 entry:
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
176 header:
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
182 exit:
183   ret void
186 define 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>
190 entry:
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
197 header:
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
203 exit:
204   ret void
207 define 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>
211 entry:
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
218 header:
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
224 exit:
225   ret void
228 define 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>
232 entry:
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
239 header:
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
245 exit:
246   ret void
249 define 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>
253 entry:
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
260 header:
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
266 exit:
267   ret void
270 define 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>)
274 entry:
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
281 header:
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
287 exit:
288   ret void
291 define 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>
295 entry:
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
302 header:
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
308 exit:
309   ret void
312 define 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>)
316 entry:
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
323 header:
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
329 exit:
330   ret void