[ARM] Better OR's for MVE compares
[llvm-core.git] / test / Transforms / IndVarSimplify / infer-poison-flags.ll
bloba148bf75bb21779e7c32cadf2d310c4fd32d0b2f
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -indvars -S | FileCheck %s
4 @A = external global i32
6 define void @add_cr_nsw_nuw() {
7 ; CHECK-LABEL: @add_cr_nsw_nuw(
8 ; CHECK-NEXT:  entry:
9 ; CHECK-NEXT:    br label [[LOOP:%.*]]
10 ; CHECK:       loop:
11 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
12 ; CHECK-NEXT:    [[I_NEXT]] = add nuw nsw i32 [[I]], 1
13 ; CHECK-NEXT:    store i32 [[I]], i32* @A
14 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 1000
15 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
16 ; CHECK:       loopexit:
17 ; CHECK-NEXT:    ret void
19 entry:
20   br label %loop
22 loop:
23   %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
24   %i.next = add i32 %i, 1
25   store i32 %i, i32* @A
26   %c = icmp ne i32 %i.next, 1000
27   br i1 %c, label %loop, label %loopexit
29 loopexit:
30   ret void
33 define void @add_cr_nuw() {
34 ; CHECK-LABEL: @add_cr_nuw(
35 ; CHECK-NEXT:  entry:
36 ; CHECK-NEXT:    br label [[LOOP:%.*]]
37 ; CHECK:       loop:
38 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
39 ; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1
40 ; CHECK-NEXT:    store i32 [[I]], i32* @A
41 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], -1
42 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
43 ; CHECK:       loopexit:
44 ; CHECK-NEXT:    ret void
46 entry:
47   br label %loop
49 loop:
50   %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
51   %i.next = add i32 %i, 1
52   store i32 %i, i32* @A
53   %c = icmp ne i32 %i.next, -1
54   br i1 %c, label %loop, label %loopexit
56 loopexit:
57   ret void
60 define void @add_cr_nsw() {
61 ; CHECK-LABEL: @add_cr_nsw(
62 ; CHECK-NEXT:  entry:
63 ; CHECK-NEXT:    br label [[LOOP:%.*]]
64 ; CHECK:       loop:
65 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ -10, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
66 ; CHECK-NEXT:    [[I_NEXT]] = add nsw i32 [[I]], 1
67 ; CHECK-NEXT:    store i32 [[I]], i32* @A
68 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 10
69 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
70 ; CHECK:       loopexit:
71 ; CHECK-NEXT:    ret void
73 entry:
74   br label %loop
76 loop:
77   %i = phi i32 [ -10, %entry ], [ %i.next, %loop ]
78   %i.next = add i32 %i, 1
79   store i32 %i, i32* @A
80   %c = icmp ne i32 %i.next, 10
81   br i1 %c, label %loop, label %loopexit
83 loopexit:
84   ret void
87 define void @add_cr_none() {
88 ; CHECK-LABEL: @add_cr_none(
89 ; CHECK-NEXT:  entry:
90 ; CHECK-NEXT:    br label [[LOOP:%.*]]
91 ; CHECK:       loop:
92 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 10, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
93 ; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1
94 ; CHECK-NEXT:    store i32 [[I]], i32* @A
95 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 0
96 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
97 ; CHECK:       loopexit:
98 ; CHECK-NEXT:    ret void
100 entry:
101   br label %loop
103 loop:
104   %i = phi i32 [ 10, %entry ], [ %i.next, %loop ]
105   %i.next = add i32 %i, 1
106   store i32 %i, i32* @A
107   %c = icmp ne i32 %i.next, 0
108   br i1 %c, label %loop, label %loopexit
110 loopexit:
111   ret void
114 define void @add_unknown_none(i32 %n) {
115 ; CHECK-LABEL: @add_unknown_none(
116 ; CHECK-NEXT:  entry:
117 ; CHECK-NEXT:    br label [[LOOP:%.*]]
118 ; CHECK:       loop:
119 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
120 ; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1
121 ; CHECK-NEXT:    store i32 [[I]], i32* @A
122 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], [[N:%.*]]
123 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
124 ; CHECK:       loopexit:
125 ; CHECK-NEXT:    ret void
127 entry:
128   br label %loop
130 loop:
131   %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
132   %i.next = add i32 %i, 1
133   store i32 %i, i32* @A
134   %c = icmp ne i32 %i.next, %n
135   br i1 %c, label %loop, label %loopexit
137 loopexit:
138   ret void
141 define void @sub_cr_nsw_nuw() {
142 ; CHECK-LABEL: @sub_cr_nsw_nuw(
143 ; CHECK-NEXT:  entry:
144 ; CHECK-NEXT:    br label [[LOOP:%.*]]
145 ; CHECK:       loop:
146 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
147 ; CHECK-NEXT:    [[I_NEXT]] = sub nsw i32 [[I]], -1
148 ; CHECK-NEXT:    store i32 [[I]], i32* @A
149 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 1000
150 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
151 ; CHECK:       loopexit:
152 ; CHECK-NEXT:    ret void
154 entry:
155   br label %loop
157 loop:
158   %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
159   %i.next = sub i32 %i, -1
160   store i32 %i, i32* @A
161   %c = icmp ne i32 %i.next, 1000
162   br i1 %c, label %loop, label %loopexit
164 loopexit:
165   ret void
169 define void @sub_unknown_none(i32 %n) {
170 ; CHECK-LABEL: @sub_unknown_none(
171 ; CHECK-NEXT:  entry:
172 ; CHECK-NEXT:    br label [[LOOP:%.*]]
173 ; CHECK:       loop:
174 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
175 ; CHECK-NEXT:    [[I_NEXT]] = sub i32 [[I]], -1
176 ; CHECK-NEXT:    store i32 [[I]], i32* @A
177 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], [[N:%.*]]
178 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
179 ; CHECK:       loopexit:
180 ; CHECK-NEXT:    ret void
182 entry:
183   br label %loop
185 loop:
186   %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
187   %i.next = sub i32 %i, -1
188   store i32 %i, i32* @A
189   %c = icmp ne i32 %i.next, %n
190   br i1 %c, label %loop, label %loopexit
192 loopexit:
193   ret void
197 ; NOTE: For the rest of these, it looks like we're failing to use a statically
198 ; computable backedge taken count to infer a range on the IV and thus fail to
199 ; prove flags via constant range reasoning.
201 ; TODO
202 define void @mul_cr_nsw_nuw() {
203 ; CHECK-LABEL: @mul_cr_nsw_nuw(
204 ; CHECK-NEXT:  entry:
205 ; CHECK-NEXT:    br label [[LOOP:%.*]]
206 ; CHECK:       loop:
207 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
208 ; CHECK-NEXT:    [[I_NEXT]] = mul i32 [[I]], 2
209 ; CHECK-NEXT:    store i32 [[I]], i32* @A
210 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 1024
211 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
212 ; CHECK:       loopexit:
213 ; CHECK-NEXT:    ret void
215 entry:
216   br label %loop
218 loop:
219   %i = phi i32 [ 1, %entry ], [ %i.next, %loop ]
220   %i.next = mul i32 %i, 2
221   store i32 %i, i32* @A
222   %c = icmp ne i32 %i.next, 1024
223   br i1 %c, label %loop, label %loopexit
225 loopexit:
226   ret void
229 ;; TODO
230 define void @shl_cr_nsw_nuw() {
231 ; CHECK-LABEL: @shl_cr_nsw_nuw(
232 ; CHECK-NEXT:  entry:
233 ; CHECK-NEXT:    br label [[LOOP:%.*]]
234 ; CHECK:       loop:
235 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
236 ; CHECK-NEXT:    [[I_NEXT]] = shl i32 [[I]], 1
237 ; CHECK-NEXT:    store i32 [[I]], i32* @A
238 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 1024
239 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
240 ; CHECK:       loopexit:
241 ; CHECK-NEXT:    ret void
243 entry:
244   br label %loop
246 loop:
247   %i = phi i32 [ 1, %entry ], [ %i.next, %loop ]
248   %i.next = shl i32 %i, 1
249   store i32 %i, i32* @A
250   %c = icmp ne i32 %i.next, 1024
251   br i1 %c, label %loop, label %loopexit
253 loopexit:
254   ret void
257 ; TODO
258 define void @lshr_cr_nsw_nuw() {
259 ; CHECK-LABEL: @lshr_cr_nsw_nuw(
260 ; CHECK-NEXT:  entry:
261 ; CHECK-NEXT:    br label [[LOOP:%.*]]
262 ; CHECK:       loop:
263 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 1024, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
264 ; CHECK-NEXT:    [[I_NEXT]] = lshr i32 [[I]], 1
265 ; CHECK-NEXT:    store i32 [[I]], i32* @A
266 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 0
267 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
268 ; CHECK:       loopexit:
269 ; CHECK-NEXT:    ret void
271 entry:
272   br label %loop
274 loop:
275   %i = phi i32 [ 1024, %entry ], [ %i.next, %loop ]
276   %i.next = lshr i32 %i, 1
277   store i32 %i, i32* @A
278   %c = icmp ne i32 %i.next, 0
279   br i1 %c, label %loop, label %loopexit
281 loopexit:
282   ret void
285 ; TODO
286 define void @lshr_cr_nuw() {
287 ; CHECK-LABEL: @lshr_cr_nuw(
288 ; CHECK-NEXT:  entry:
289 ; CHECK-NEXT:    br label [[LOOP:%.*]]
290 ; CHECK:       loop:
291 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
292 ; CHECK-NEXT:    [[I_NEXT]] = lshr i32 [[I]], 1
293 ; CHECK-NEXT:    store i32 [[I]], i32* @A
294 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 0
295 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
296 ; CHECK:       loopexit:
297 ; CHECK-NEXT:    ret void
299 entry:
300   br label %loop
302 loop:
303   %i = phi i32 [ -1, %entry ], [ %i.next, %loop ]
304   %i.next = lshr i32 %i, 1
305   store i32 %i, i32* @A
306   %c = icmp ne i32 %i.next, 0
307   br i1 %c, label %loop, label %loopexit
309 loopexit:
310   ret void
313 ; TODO
314 define void @ashr_cr_nsw_nuw() {
315 ; CHECK-LABEL: @ashr_cr_nsw_nuw(
316 ; CHECK-NEXT:  entry:
317 ; CHECK-NEXT:    br label [[LOOP:%.*]]
318 ; CHECK:       loop:
319 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 1024, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
320 ; CHECK-NEXT:    [[I_NEXT]] = ashr i32 [[I]], 1
321 ; CHECK-NEXT:    store i32 [[I]], i32* @A
322 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 0
323 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
324 ; CHECK:       loopexit:
325 ; CHECK-NEXT:    ret void
327 entry:
328   br label %loop
330 loop:
331   %i = phi i32 [ 1024, %entry ], [ %i.next, %loop ]
332   %i.next = ashr i32 %i, 1
333   store i32 %i, i32* @A
334   %c = icmp ne i32 %i.next, 0
335   br i1 %c, label %loop, label %loopexit
337 loopexit:
338   ret void
341 ; TODO
342 define void @ashr_cr_nsw() {
343 ; CHECK-LABEL: @ashr_cr_nsw(
344 ; CHECK-NEXT:  entry:
345 ; CHECK-NEXT:    br label [[LOOP:%.*]]
346 ; CHECK:       loop:
347 ; CHECK-NEXT:    [[I:%.*]] = phi i32 [ -1024, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
348 ; CHECK-NEXT:    [[I_NEXT]] = ashr i32 [[I]], 1
349 ; CHECK-NEXT:    store i32 [[I]], i32* @A
350 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I_NEXT]], 1
351 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[LOOPEXIT:%.*]]
352 ; CHECK:       loopexit:
353 ; CHECK-NEXT:    ret void
355 entry:
356   br label %loop
358 loop:
359   %i = phi i32 [ -1024, %entry ], [ %i.next, %loop ]
360   %i.next = ashr i32 %i, 1
361   store i32 %i, i32* @A
362   %c = icmp ne i32 %i.next, 1
363   br i1 %c, label %loop, label %loopexit
365 loopexit:
366   ret void