1target 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"
2target triple = "powerpc64-unknown-linux-gnu"
3; RUN: llc < %s -march=ppc64 | FileCheck %s
4
5; CHECK: test_pos1_ir_sle
6; CHECK: bdnz
7; a < b
8define void @test_pos1_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
9entry:
10  %cmp3 = icmp sle i32 28395, %b
11  br i1 %cmp3, label %for.body.lr.ph, label %for.end
12
13for.body.lr.ph:                                   ; preds = %entry
14  br label %for.body
15
16for.body:                                         ; preds = %for.body.lr.ph, %for.body
17  %i.04 = phi i32 [ 28395, %for.body.lr.ph ], [ %inc, %for.body ]
18  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
19  %0 = load i8* %arrayidx, align 1
20  %conv = zext i8 %0 to i32
21  %add = add nsw i32 %conv, 1
22  %conv1 = trunc i32 %add to i8
23  store i8 %conv1, i8* %arrayidx, align 1
24  %inc = add nsw i32 %i.04, 1
25  %cmp = icmp sle i32 %inc, %b
26  br i1 %cmp, label %for.body, label %for.end
27
28for.end:                                          ; preds = %for.body, %entry
29  ret void
30}
31
32
33
34; CHECK: test_pos2_ir_sle
35; FIXME: Support this loop!
36; CHECK-NOT: bdnz
37; a < b
38define void @test_pos2_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
39entry:
40  %cmp3 = icmp sle i32 9073, %b
41  br i1 %cmp3, label %for.body.lr.ph, label %for.end
42
43for.body.lr.ph:                                   ; preds = %entry
44  br label %for.body
45
46for.body:                                         ; preds = %for.body.lr.ph, %for.body
47  %i.04 = phi i32 [ 9073, %for.body.lr.ph ], [ %inc, %for.body ]
48  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
49  %0 = load i8* %arrayidx, align 1
50  %conv = zext i8 %0 to i32
51  %add = add nsw i32 %conv, 1
52  %conv1 = trunc i32 %add to i8
53  store i8 %conv1, i8* %arrayidx, align 1
54  %inc = add nsw i32 %i.04, 2
55  %cmp = icmp sle i32 %inc, %b
56  br i1 %cmp, label %for.body, label %for.end
57
58for.end:                                          ; preds = %for.body, %entry
59  ret void
60}
61
62
63
64; CHECK: test_pos4_ir_sle
65; FIXME: Support this loop!
66; CHECK-NOT: bdnz
67; a < b
68define void @test_pos4_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
69entry:
70  %cmp3 = icmp sle i32 21956, %b
71  br i1 %cmp3, label %for.body.lr.ph, label %for.end
72
73for.body.lr.ph:                                   ; preds = %entry
74  br label %for.body
75
76for.body:                                         ; preds = %for.body.lr.ph, %for.body
77  %i.04 = phi i32 [ 21956, %for.body.lr.ph ], [ %inc, %for.body ]
78  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
79  %0 = load i8* %arrayidx, align 1
80  %conv = zext i8 %0 to i32
81  %add = add nsw i32 %conv, 1
82  %conv1 = trunc i32 %add to i8
83  store i8 %conv1, i8* %arrayidx, align 1
84  %inc = add nsw i32 %i.04, 4
85  %cmp = icmp sle i32 %inc, %b
86  br i1 %cmp, label %for.body, label %for.end
87
88for.end:                                          ; preds = %for.body, %entry
89  ret void
90}
91
92
93
94; CHECK: test_pos8_ir_sle
95; FIXME: Support this loop!
96; CHECK-NOT: bdnz
97; a < b
98define void @test_pos8_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
99entry:
100  %cmp3 = icmp sle i32 16782, %b
101  br i1 %cmp3, label %for.body.lr.ph, label %for.end
102
103for.body.lr.ph:                                   ; preds = %entry
104  br label %for.body
105
106for.body:                                         ; preds = %for.body.lr.ph, %for.body
107  %i.04 = phi i32 [ 16782, %for.body.lr.ph ], [ %inc, %for.body ]
108  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
109  %0 = load i8* %arrayidx, align 1
110  %conv = zext i8 %0 to i32
111  %add = add nsw i32 %conv, 1
112  %conv1 = trunc i32 %add to i8
113  store i8 %conv1, i8* %arrayidx, align 1
114  %inc = add nsw i32 %i.04, 8
115  %cmp = icmp sle i32 %inc, %b
116  br i1 %cmp, label %for.body, label %for.end
117
118for.end:                                          ; preds = %for.body, %entry
119  ret void
120}
121
122
123
124; CHECK: test_pos16_ir_sle
125; FIXME: Support this loop!
126; CHECK-NOT: bdnz
127; a < b
128define void @test_pos16_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
129entry:
130  %cmp3 = icmp sle i32 19097, %b
131  br i1 %cmp3, label %for.body.lr.ph, label %for.end
132
133for.body.lr.ph:                                   ; preds = %entry
134  br label %for.body
135
136for.body:                                         ; preds = %for.body.lr.ph, %for.body
137  %i.04 = phi i32 [ 19097, %for.body.lr.ph ], [ %inc, %for.body ]
138  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
139  %0 = load i8* %arrayidx, align 1
140  %conv = zext i8 %0 to i32
141  %add = add nsw i32 %conv, 1
142  %conv1 = trunc i32 %add to i8
143  store i8 %conv1, i8* %arrayidx, align 1
144  %inc = add nsw i32 %i.04, 16
145  %cmp = icmp sle i32 %inc, %b
146  br i1 %cmp, label %for.body, label %for.end
147
148for.end:                                          ; preds = %for.body, %entry
149  ret void
150}
151
152
153
154; CHECK: test_pos1_ri_sle
155; CHECK: bdnz
156; a < b
157define void @test_pos1_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
158entry:
159  %cmp3 = icmp sle i32 %a, 14040
160  br i1 %cmp3, label %for.body.lr.ph, label %for.end
161
162for.body.lr.ph:                                   ; preds = %entry
163  br label %for.body
164
165for.body:                                         ; preds = %for.body.lr.ph, %for.body
166  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
167  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
168  %0 = load i8* %arrayidx, align 1
169  %conv = zext i8 %0 to i32
170  %add = add nsw i32 %conv, 1
171  %conv1 = trunc i32 %add to i8
172  store i8 %conv1, i8* %arrayidx, align 1
173  %inc = add nsw i32 %i.04, 1
174  %cmp = icmp sle i32 %inc, 14040
175  br i1 %cmp, label %for.body, label %for.end
176
177for.end:                                          ; preds = %for.body, %entry
178  ret void
179}
180
181
182
183; CHECK: test_pos2_ri_sle
184; CHECK: bdnz
185; a < b
186define void @test_pos2_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
187entry:
188  %cmp3 = icmp sle i32 %a, 13710
189  br i1 %cmp3, label %for.body.lr.ph, label %for.end
190
191for.body.lr.ph:                                   ; preds = %entry
192  br label %for.body
193
194for.body:                                         ; preds = %for.body.lr.ph, %for.body
195  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
196  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
197  %0 = load i8* %arrayidx, align 1
198  %conv = zext i8 %0 to i32
199  %add = add nsw i32 %conv, 1
200  %conv1 = trunc i32 %add to i8
201  store i8 %conv1, i8* %arrayidx, align 1
202  %inc = add nsw i32 %i.04, 2
203  %cmp = icmp sle i32 %inc, 13710
204  br i1 %cmp, label %for.body, label %for.end
205
206for.end:                                          ; preds = %for.body, %entry
207  ret void
208}
209
210
211
212; CHECK: test_pos4_ri_sle
213; CHECK: bdnz
214; a < b
215define void @test_pos4_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
216entry:
217  %cmp3 = icmp sle i32 %a, 9920
218  br i1 %cmp3, label %for.body.lr.ph, label %for.end
219
220for.body.lr.ph:                                   ; preds = %entry
221  br label %for.body
222
223for.body:                                         ; preds = %for.body.lr.ph, %for.body
224  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
225  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
226  %0 = load i8* %arrayidx, align 1
227  %conv = zext i8 %0 to i32
228  %add = add nsw i32 %conv, 1
229  %conv1 = trunc i32 %add to i8
230  store i8 %conv1, i8* %arrayidx, align 1
231  %inc = add nsw i32 %i.04, 4
232  %cmp = icmp sle i32 %inc, 9920
233  br i1 %cmp, label %for.body, label %for.end
234
235for.end:                                          ; preds = %for.body, %entry
236  ret void
237}
238
239
240
241; CHECK: test_pos8_ri_sle
242; CHECK: bdnz
243; a < b
244define void @test_pos8_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
245entry:
246  %cmp3 = icmp sle i32 %a, 18924
247  br i1 %cmp3, label %for.body.lr.ph, label %for.end
248
249for.body.lr.ph:                                   ; preds = %entry
250  br label %for.body
251
252for.body:                                         ; preds = %for.body.lr.ph, %for.body
253  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
254  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
255  %0 = load i8* %arrayidx, align 1
256  %conv = zext i8 %0 to i32
257  %add = add nsw i32 %conv, 1
258  %conv1 = trunc i32 %add to i8
259  store i8 %conv1, i8* %arrayidx, align 1
260  %inc = add nsw i32 %i.04, 8
261  %cmp = icmp sle i32 %inc, 18924
262  br i1 %cmp, label %for.body, label %for.end
263
264for.end:                                          ; preds = %for.body, %entry
265  ret void
266}
267
268
269
270; CHECK: test_pos16_ri_sle
271; CHECK: bdnz
272; a < b
273define void @test_pos16_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
274entry:
275  %cmp3 = icmp sle i32 %a, 11812
276  br i1 %cmp3, label %for.body.lr.ph, label %for.end
277
278for.body.lr.ph:                                   ; preds = %entry
279  br label %for.body
280
281for.body:                                         ; preds = %for.body.lr.ph, %for.body
282  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
283  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
284  %0 = load i8* %arrayidx, align 1
285  %conv = zext i8 %0 to i32
286  %add = add nsw i32 %conv, 1
287  %conv1 = trunc i32 %add to i8
288  store i8 %conv1, i8* %arrayidx, align 1
289  %inc = add nsw i32 %i.04, 16
290  %cmp = icmp sle i32 %inc, 11812
291  br i1 %cmp, label %for.body, label %for.end
292
293for.end:                                          ; preds = %for.body, %entry
294  ret void
295}
296
297
298
299; CHECK: test_pos1_rr_sle
300; FIXME: Support this loop!
301; CHECK-NOT: bdnz
302; a < b
303define void @test_pos1_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
304entry:
305  %cmp3 = icmp sle i32 %a, %b
306  br i1 %cmp3, label %for.body.lr.ph, label %for.end
307
308for.body.lr.ph:                                   ; preds = %entry
309  br label %for.body
310
311for.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* %p, i32 %i.04
314  %0 = load 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 sle i32 %inc, %b
321  br i1 %cmp, label %for.body, label %for.end
322
323for.end:                                          ; preds = %for.body, %entry
324  ret void
325}
326
327
328
329; CHECK: test_pos2_rr_sle
330; FIXME: Support this loop!
331; CHECK-NOT: bdnz
332; a < b
333define void @test_pos2_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
334entry:
335  %cmp3 = icmp sle i32 %a, %b
336  br i1 %cmp3, label %for.body.lr.ph, label %for.end
337
338for.body.lr.ph:                                   ; preds = %entry
339  br label %for.body
340
341for.body:                                         ; preds = %for.body.lr.ph, %for.body
342  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
343  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
344  %0 = load i8* %arrayidx, align 1
345  %conv = zext i8 %0 to i32
346  %add = add nsw i32 %conv, 1
347  %conv1 = trunc i32 %add to i8
348  store i8 %conv1, i8* %arrayidx, align 1
349  %inc = add nsw i32 %i.04, 2
350  %cmp = icmp sle i32 %inc, %b
351  br i1 %cmp, label %for.body, label %for.end
352
353for.end:                                          ; preds = %for.body, %entry
354  ret void
355}
356
357
358
359; CHECK: test_pos4_rr_sle
360; FIXME: Support this loop!
361; CHECK-NOT: bdnz
362; a < b
363define void @test_pos4_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
364entry:
365  %cmp3 = icmp sle i32 %a, %b
366  br i1 %cmp3, label %for.body.lr.ph, label %for.end
367
368for.body.lr.ph:                                   ; preds = %entry
369  br label %for.body
370
371for.body:                                         ; preds = %for.body.lr.ph, %for.body
372  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
373  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
374  %0 = load i8* %arrayidx, align 1
375  %conv = zext i8 %0 to i32
376  %add = add nsw i32 %conv, 1
377  %conv1 = trunc i32 %add to i8
378  store i8 %conv1, i8* %arrayidx, align 1
379  %inc = add nsw i32 %i.04, 4
380  %cmp = icmp sle i32 %inc, %b
381  br i1 %cmp, label %for.body, label %for.end
382
383for.end:                                          ; preds = %for.body, %entry
384  ret void
385}
386
387
388
389; CHECK: test_pos8_rr_sle
390; FIXME: Support this loop!
391; CHECK-NOT: bdnz
392; a < b
393define void @test_pos8_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
394entry:
395  %cmp3 = icmp sle i32 %a, %b
396  br i1 %cmp3, label %for.body.lr.ph, label %for.end
397
398for.body.lr.ph:                                   ; preds = %entry
399  br label %for.body
400
401for.body:                                         ; preds = %for.body.lr.ph, %for.body
402  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
403  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
404  %0 = load i8* %arrayidx, align 1
405  %conv = zext i8 %0 to i32
406  %add = add nsw i32 %conv, 1
407  %conv1 = trunc i32 %add to i8
408  store i8 %conv1, i8* %arrayidx, align 1
409  %inc = add nsw i32 %i.04, 8
410  %cmp = icmp sle i32 %inc, %b
411  br i1 %cmp, label %for.body, label %for.end
412
413for.end:                                          ; preds = %for.body, %entry
414  ret void
415}
416
417
418
419; CHECK: test_pos16_rr_sle
420; FIXME: Support this loop!
421; CHECK-NOT: bdnz
422; a < b
423define void @test_pos16_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
424entry:
425  %cmp3 = icmp sle i32 %a, %b
426  br i1 %cmp3, label %for.body.lr.ph, label %for.end
427
428for.body.lr.ph:                                   ; preds = %entry
429  br label %for.body
430
431for.body:                                         ; preds = %for.body.lr.ph, %for.body
432  %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
433  %arrayidx = getelementptr inbounds i8* %p, i32 %i.04
434  %0 = load i8* %arrayidx, align 1
435  %conv = zext i8 %0 to i32
436  %add = add nsw i32 %conv, 1
437  %conv1 = trunc i32 %add to i8
438  store i8 %conv1, i8* %arrayidx, align 1
439  %inc = add nsw i32 %i.04, 16
440  %cmp = icmp sle i32 %inc, %b
441  br i1 %cmp, label %for.body, label %for.end
442
443for.end:                                          ; preds = %for.body, %entry
444  ret void
445}
446
447