[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / PowerPC / ctrloop-lt.ll
blobb1ef8586050e7aa1c35e747612635c3bcfb4b47f
1 ; RUN: llc -verify-machineinstrs < %s | FileCheck %s
2 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
3 target triple = "powerpc64-unknown-linux-gnu"
5 ; XFAIL: *
6 ; SE needs improvement
8 ; CHECK: test_pos1_ir_slt
9 ; CHECK: bdnz
10 ; a < b
11 define void @test_pos1_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
12 entry:
13   %cmp3 = icmp slt i32 8531, %b
14   br i1 %cmp3, label %for.body.lr.ph, label %for.end
16 for.body.lr.ph:                                   ; preds = %entry
17   br label %for.body
19 for.body:                                         ; preds = %for.body.lr.ph, %for.body
20   %i.04 = phi i32 [ 8531, %for.body.lr.ph ], [ %inc, %for.body ]
21   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
22   %0 = load i8, i8* %arrayidx, align 1
23   %conv = zext i8 %0 to i32
24   %add = add nsw i32 %conv, 1
25   %conv1 = trunc i32 %add to i8
26   store i8 %conv1, i8* %arrayidx, align 1
27   %inc = add nsw i32 %i.04, 1
28   %cmp = icmp slt i32 %inc, %b
29   br i1 %cmp, label %for.body, label %for.end
31 for.end:                                          ; preds = %for.body, %entry
32   ret void
37 ; CHECK: test_pos2_ir_slt
38 ; FIXME: Support this loop!
39 ; CHECK: bdnz
40 ; a < b
41 define void @test_pos2_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
42 entry:
43   %cmp3 = icmp slt i32 9152, %b
44   br i1 %cmp3, label %for.body.lr.ph, label %for.end
46 for.body.lr.ph:                                   ; preds = %entry
47   br label %for.body
49 for.body:                                         ; preds = %for.body.lr.ph, %for.body
50   %i.04 = phi i32 [ 9152, %for.body.lr.ph ], [ %inc, %for.body ]
51   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
52   %0 = load i8, i8* %arrayidx, align 1
53   %conv = zext i8 %0 to i32
54   %add = add nsw i32 %conv, 1
55   %conv1 = trunc i32 %add to i8
56   store i8 %conv1, i8* %arrayidx, align 1
57   %inc = add nsw i32 %i.04, 2
58   %cmp = icmp slt i32 %inc, %b
59   br i1 %cmp, label %for.body, label %for.end
61 for.end:                                          ; preds = %for.body, %entry
62   ret void
67 ; CHECK: test_pos4_ir_slt
68 ; FIXME: Support this loop!
69 ; CHECK: bdnz
70 ; a < b
71 define void @test_pos4_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
72 entry:
73   %cmp3 = icmp slt i32 18851, %b
74   br i1 %cmp3, label %for.body.lr.ph, label %for.end
76 for.body.lr.ph:                                   ; preds = %entry
77   br label %for.body
79 for.body:                                         ; preds = %for.body.lr.ph, %for.body
80   %i.04 = phi i32 [ 18851, %for.body.lr.ph ], [ %inc, %for.body ]
81   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
82   %0 = load i8, i8* %arrayidx, align 1
83   %conv = zext i8 %0 to i32
84   %add = add nsw i32 %conv, 1
85   %conv1 = trunc i32 %add to i8
86   store i8 %conv1, i8* %arrayidx, align 1
87   %inc = add nsw i32 %i.04, 4
88   %cmp = icmp slt i32 %inc, %b
89   br i1 %cmp, label %for.body, label %for.end
91 for.end:                                          ; preds = %for.body, %entry
92   ret void
97 ; CHECK: test_pos8_ir_slt
98 ; CHECK: bdnz
99 ; a < b
100 define void @test_pos8_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
101 entry:
102   %cmp3 = icmp slt i32 25466, %b
103   br i1 %cmp3, label %for.body.lr.ph, label %for.end
105 for.body.lr.ph:                                   ; preds = %entry
106   br label %for.body
108 for.body:                                         ; preds = %for.body.lr.ph, %for.body
109   %i.04 = phi i32 [ 25466, %for.body.lr.ph ], [ %inc, %for.body ]
110   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
111   %0 = load i8, i8* %arrayidx, align 1
112   %conv = zext i8 %0 to i32
113   %add = add nsw i32 %conv, 1
114   %conv1 = trunc i32 %add to i8
115   store i8 %conv1, i8* %arrayidx, align 1
116   %inc = add nsw i32 %i.04, 8
117   %cmp = icmp slt i32 %inc, %b
118   br i1 %cmp, label %for.body, label %for.end
120 for.end:                                          ; preds = %for.body, %entry
121   ret void
126 ; CHECK: test_pos16_ir_slt
127 ; CHECK: bdnz
128 ; a < b
129 define void @test_pos16_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
130 entry:
131   %cmp3 = icmp slt i32 9295, %b
132   br i1 %cmp3, label %for.body.lr.ph, label %for.end
134 for.body.lr.ph:                                   ; preds = %entry
135   br label %for.body
137 for.body:                                         ; preds = %for.body.lr.ph, %for.body
138   %i.04 = phi i32 [ 9295, %for.body.lr.ph ], [ %inc, %for.body ]
139   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
140   %0 = load i8, i8* %arrayidx, align 1
141   %conv = zext i8 %0 to i32
142   %add = add nsw i32 %conv, 1
143   %conv1 = trunc i32 %add to i8
144   store i8 %conv1, i8* %arrayidx, align 1
145   %inc = add nsw i32 %i.04, 16
146   %cmp = icmp slt i32 %inc, %b
147   br i1 %cmp, label %for.body, label %for.end
149 for.end:                                          ; preds = %for.body, %entry
150   ret void
155 ; CHECK: test_pos1_ri_slt
156 ; CHECK: bdnz
157 ; a < b
158 define void @test_pos1_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
159 entry:
160   %cmp3 = icmp slt i32 %a, 31236
161   br i1 %cmp3, label %for.body.lr.ph, label %for.end
163 for.body.lr.ph:                                   ; preds = %entry
164   br label %for.body
166 for.body:                                         ; preds = %for.body.lr.ph, %for.body
167   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
168   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
169   %0 = load i8, i8* %arrayidx, align 1
170   %conv = zext i8 %0 to i32
171   %add = add nsw i32 %conv, 1
172   %conv1 = trunc i32 %add to i8
173   store i8 %conv1, i8* %arrayidx, align 1
174   %inc = add nsw i32 %i.04, 1
175   %cmp = icmp slt i32 %inc, 31236
176   br i1 %cmp, label %for.body, label %for.end
178 for.end:                                          ; preds = %for.body, %entry
179   ret void
184 ; CHECK: test_pos2_ri_slt
185 ; CHECK: bdnz
186 ; a < b
187 define void @test_pos2_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
188 entry:
189   %cmp3 = icmp slt i32 %a, 22653
190   br i1 %cmp3, label %for.body.lr.ph, label %for.end
192 for.body.lr.ph:                                   ; preds = %entry
193   br label %for.body
195 for.body:                                         ; preds = %for.body.lr.ph, %for.body
196   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
197   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
198   %0 = load i8, i8* %arrayidx, align 1
199   %conv = zext i8 %0 to i32
200   %add = add nsw i32 %conv, 1
201   %conv1 = trunc i32 %add to i8
202   store i8 %conv1, i8* %arrayidx, align 1
203   %inc = add nsw i32 %i.04, 2
204   %cmp = icmp slt i32 %inc, 22653
205   br i1 %cmp, label %for.body, label %for.end
207 for.end:                                          ; preds = %for.body, %entry
208   ret void
213 ; CHECK: test_pos4_ri_slt
214 ; CHECK: bdnz
215 ; a < b
216 define void @test_pos4_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
217 entry:
218   %cmp3 = icmp slt i32 %a, 1431
219   br i1 %cmp3, label %for.body.lr.ph, label %for.end
221 for.body.lr.ph:                                   ; preds = %entry
222   br label %for.body
224 for.body:                                         ; preds = %for.body.lr.ph, %for.body
225   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
226   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
227   %0 = load i8, i8* %arrayidx, align 1
228   %conv = zext i8 %0 to i32
229   %add = add nsw i32 %conv, 1
230   %conv1 = trunc i32 %add to i8
231   store i8 %conv1, i8* %arrayidx, align 1
232   %inc = add nsw i32 %i.04, 4
233   %cmp = icmp slt i32 %inc, 1431
234   br i1 %cmp, label %for.body, label %for.end
236 for.end:                                          ; preds = %for.body, %entry
237   ret void
242 ; CHECK: test_pos8_ri_slt
243 ; CHECK: bdnz
244 ; a < b
245 define void @test_pos8_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
246 entry:
247   %cmp3 = icmp slt i32 %a, 22403
248   br i1 %cmp3, label %for.body.lr.ph, label %for.end
250 for.body.lr.ph:                                   ; preds = %entry
251   br label %for.body
253 for.body:                                         ; preds = %for.body.lr.ph, %for.body
254   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
255   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
256   %0 = load i8, i8* %arrayidx, align 1
257   %conv = zext i8 %0 to i32
258   %add = add nsw i32 %conv, 1
259   %conv1 = trunc i32 %add to i8
260   store i8 %conv1, i8* %arrayidx, align 1
261   %inc = add nsw i32 %i.04, 8
262   %cmp = icmp slt i32 %inc, 22403
263   br i1 %cmp, label %for.body, label %for.end
265 for.end:                                          ; preds = %for.body, %entry
266   ret void
271 ; CHECK: test_pos16_ri_slt
272 ; CHECK: bdnz
273 ; a < b
274 define void @test_pos16_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
275 entry:
276   %cmp3 = icmp slt i32 %a, 21715
277   br i1 %cmp3, label %for.body.lr.ph, label %for.end
279 for.body.lr.ph:                                   ; preds = %entry
280   br label %for.body
282 for.body:                                         ; preds = %for.body.lr.ph, %for.body
283   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
284   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
285   %0 = load i8, i8* %arrayidx, align 1
286   %conv = zext i8 %0 to i32
287   %add = add nsw i32 %conv, 1
288   %conv1 = trunc i32 %add to i8
289   store i8 %conv1, i8* %arrayidx, align 1
290   %inc = add nsw i32 %i.04, 16
291   %cmp = icmp slt i32 %inc, 21715
292   br i1 %cmp, label %for.body, label %for.end
294 for.end:                                          ; preds = %for.body, %entry
295   ret void
300 ; CHECK: test_pos1_rr_slt
301 ; CHECK: bdnz
302 ; a < b
303 define void @test_pos1_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
304 entry:
305   %cmp3 = icmp slt i32 %a, %b
306   br i1 %cmp3, label %for.body.lr.ph, label %for.end
308 for.body.lr.ph:                                   ; preds = %entry
309   br label %for.body
311 for.body:                                         ; preds = %for.body.lr.ph, %for.body
312   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
313   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
314   %0 = load i8, i8* %arrayidx, align 1
315   %conv = zext i8 %0 to i32
316   %add = add nsw i32 %conv, 1
317   %conv1 = trunc i32 %add to i8
318   store i8 %conv1, i8* %arrayidx, align 1
319   %inc = add nsw i32 %i.04, 1
320   %cmp = icmp slt i32 %inc, %b
321   br i1 %cmp, label %for.body, label %for.end
323 for.end:                                          ; preds = %for.body, %entry
324   ret void
329 ; CHECK: test_pos2_rr_slt
330 ; CHECK: bdnz
331 ; a < b
332 define void @test_pos2_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
333 entry:
334   %cmp3 = icmp slt i32 %a, %b
335   br i1 %cmp3, label %for.body.lr.ph, label %for.end
337 for.body.lr.ph:                                   ; preds = %entry
338   br label %for.body
340 for.body:                                         ; preds = %for.body.lr.ph, %for.body
341   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
342   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
343   %0 = load i8, i8* %arrayidx, align 1
344   %conv = zext i8 %0 to i32
345   %add = add nsw i32 %conv, 1
346   %conv1 = trunc i32 %add to i8
347   store i8 %conv1, i8* %arrayidx, align 1
348   %inc = add nsw i32 %i.04, 2
349   %cmp = icmp slt i32 %inc, %b
350   br i1 %cmp, label %for.body, label %for.end
352 for.end:                                          ; preds = %for.body, %entry
353   ret void
358 ; CHECK: test_pos4_rr_slt
359 ; CHECK: bdnz
360 ; a < b
361 define void @test_pos4_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
362 entry:
363   %cmp3 = icmp slt i32 %a, %b
364   br i1 %cmp3, label %for.body.lr.ph, label %for.end
366 for.body.lr.ph:                                   ; preds = %entry
367   br label %for.body
369 for.body:                                         ; preds = %for.body.lr.ph, %for.body
370   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
371   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
372   %0 = load i8, i8* %arrayidx, align 1
373   %conv = zext i8 %0 to i32
374   %add = add nsw i32 %conv, 1
375   %conv1 = trunc i32 %add to i8
376   store i8 %conv1, i8* %arrayidx, align 1
377   %inc = add nsw i32 %i.04, 4
378   %cmp = icmp slt i32 %inc, %b
379   br i1 %cmp, label %for.body, label %for.end
381 for.end:                                          ; preds = %for.body, %entry
382   ret void
387 ; CHECK: test_pos8_rr_slt
388 ; CHECK: bdnz
389 ; a < b
390 define void @test_pos8_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
391 entry:
392   %cmp3 = icmp slt i32 %a, %b
393   br i1 %cmp3, label %for.body.lr.ph, label %for.end
395 for.body.lr.ph:                                   ; preds = %entry
396   br label %for.body
398 for.body:                                         ; preds = %for.body.lr.ph, %for.body
399   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
400   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
401   %0 = load i8, i8* %arrayidx, align 1
402   %conv = zext i8 %0 to i32
403   %add = add nsw i32 %conv, 1
404   %conv1 = trunc i32 %add to i8
405   store i8 %conv1, i8* %arrayidx, align 1
406   %inc = add nsw i32 %i.04, 8
407   %cmp = icmp slt i32 %inc, %b
408   br i1 %cmp, label %for.body, label %for.end
410 for.end:                                          ; preds = %for.body, %entry
411   ret void
416 ; CHECK: test_pos16_rr_slt
417 ; CHECK: bdnz
418 ; a < b
419 define void @test_pos16_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
420 entry:
421   %cmp3 = icmp slt i32 %a, %b
422   br i1 %cmp3, label %for.body.lr.ph, label %for.end
424 for.body.lr.ph:                                   ; preds = %entry
425   br label %for.body
427 for.body:                                         ; preds = %for.body.lr.ph, %for.body
428   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
429   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
430   %0 = load i8, i8* %arrayidx, align 1
431   %conv = zext i8 %0 to i32
432   %add = add nsw i32 %conv, 1
433   %conv1 = trunc i32 %add to i8
434   store i8 %conv1, i8* %arrayidx, align 1
435   %inc = add nsw i32 %i.04, 16
436   %cmp = icmp slt i32 %inc, %b
437   br i1 %cmp, label %for.body, label %for.end
439 for.end:                                          ; preds = %for.body, %entry
440   ret void