blob: bef043703247a6eafb119dcb864cd8dc59a9752e [file] [log] [blame]
Hal Finkel25c19922013-05-15 21:37:41 +00001target 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
Hal Finkel34974ed2014-04-12 21:52:38 +00005; XFAIL: *
6; SE needs improvement
7
Hal Finkel25c19922013-05-15 21:37:41 +00008; CHECK: test_pos1_ir_sle
9; CHECK: bdnz
10; a < b
11define void @test_pos1_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
12entry:
13 %cmp3 = icmp sle i32 28395, %b
14 br i1 %cmp3, label %for.body.lr.ph, label %for.end
15
16for.body.lr.ph: ; preds = %entry
17 br label %for.body
18
19for.body: ; preds = %for.body.lr.ph, %for.body
20 %i.04 = phi i32 [ 28395, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +000021 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +000022 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +000023 %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 sle i32 %inc, %b
29 br i1 %cmp, label %for.body, label %for.end
30
31for.end: ; preds = %for.body, %entry
32 ret void
33}
34
35
36
37; CHECK: test_pos2_ir_sle
Andrew Trick1bda7212013-10-19 00:14:04 +000038; CHECK: bdnz
Hal Finkel25c19922013-05-15 21:37:41 +000039; a < b
40define void @test_pos2_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
41entry:
42 %cmp3 = icmp sle i32 9073, %b
43 br i1 %cmp3, label %for.body.lr.ph, label %for.end
44
45for.body.lr.ph: ; preds = %entry
46 br label %for.body
47
48for.body: ; preds = %for.body.lr.ph, %for.body
49 %i.04 = phi i32 [ 9073, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +000050 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +000051 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +000052 %conv = zext i8 %0 to i32
53 %add = add nsw i32 %conv, 1
54 %conv1 = trunc i32 %add to i8
55 store i8 %conv1, i8* %arrayidx, align 1
56 %inc = add nsw i32 %i.04, 2
57 %cmp = icmp sle i32 %inc, %b
58 br i1 %cmp, label %for.body, label %for.end
59
60for.end: ; preds = %for.body, %entry
61 ret void
62}
63
64
65
66; CHECK: test_pos4_ir_sle
Andrew Trick1bda7212013-10-19 00:14:04 +000067; CHECK: bdnz
Hal Finkel25c19922013-05-15 21:37:41 +000068; a < b
69define void @test_pos4_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
70entry:
71 %cmp3 = icmp sle i32 21956, %b
72 br i1 %cmp3, label %for.body.lr.ph, label %for.end
73
74for.body.lr.ph: ; preds = %entry
75 br label %for.body
76
77for.body: ; preds = %for.body.lr.ph, %for.body
78 %i.04 = phi i32 [ 21956, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +000079 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +000080 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +000081 %conv = zext i8 %0 to i32
82 %add = add nsw i32 %conv, 1
83 %conv1 = trunc i32 %add to i8
84 store i8 %conv1, i8* %arrayidx, align 1
85 %inc = add nsw i32 %i.04, 4
86 %cmp = icmp sle i32 %inc, %b
87 br i1 %cmp, label %for.body, label %for.end
88
89for.end: ; preds = %for.body, %entry
90 ret void
91}
92
93
94
95; CHECK: test_pos8_ir_sle
Andrew Trick1bda7212013-10-19 00:14:04 +000096; CHECK: bdnz
Hal Finkel25c19922013-05-15 21:37:41 +000097; 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 ]
David Blaikie79e6c742015-02-27 19:29:02 +0000108 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000109 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000110 %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
Andrew Trick1bda7212013-10-19 00:14:04 +0000125; CHECK: bdnz
Hal Finkel25c19922013-05-15 21:37:41 +0000126; a < b
127define void @test_pos16_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
128entry:
129 %cmp3 = icmp sle i32 19097, %b
130 br i1 %cmp3, label %for.body.lr.ph, label %for.end
131
132for.body.lr.ph: ; preds = %entry
133 br label %for.body
134
135for.body: ; preds = %for.body.lr.ph, %for.body
136 %i.04 = phi i32 [ 19097, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000137 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000138 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000139 %conv = zext i8 %0 to i32
140 %add = add nsw i32 %conv, 1
141 %conv1 = trunc i32 %add to i8
142 store i8 %conv1, i8* %arrayidx, align 1
143 %inc = add nsw i32 %i.04, 16
144 %cmp = icmp sle i32 %inc, %b
145 br i1 %cmp, label %for.body, label %for.end
146
147for.end: ; preds = %for.body, %entry
148 ret void
149}
150
151
152
153; CHECK: test_pos1_ri_sle
154; CHECK: bdnz
155; a < b
156define void @test_pos1_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
157entry:
158 %cmp3 = icmp sle i32 %a, 14040
159 br i1 %cmp3, label %for.body.lr.ph, label %for.end
160
161for.body.lr.ph: ; preds = %entry
162 br label %for.body
163
164for.body: ; preds = %for.body.lr.ph, %for.body
165 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000166 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000167 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000168 %conv = zext i8 %0 to i32
169 %add = add nsw i32 %conv, 1
170 %conv1 = trunc i32 %add to i8
171 store i8 %conv1, i8* %arrayidx, align 1
172 %inc = add nsw i32 %i.04, 1
173 %cmp = icmp sle i32 %inc, 14040
174 br i1 %cmp, label %for.body, label %for.end
175
176for.end: ; preds = %for.body, %entry
177 ret void
178}
179
180
181
182; CHECK: test_pos2_ri_sle
183; CHECK: bdnz
184; a < b
185define void @test_pos2_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
186entry:
187 %cmp3 = icmp sle i32 %a, 13710
188 br i1 %cmp3, label %for.body.lr.ph, label %for.end
189
190for.body.lr.ph: ; preds = %entry
191 br label %for.body
192
193for.body: ; preds = %for.body.lr.ph, %for.body
194 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000195 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000196 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000197 %conv = zext i8 %0 to i32
198 %add = add nsw i32 %conv, 1
199 %conv1 = trunc i32 %add to i8
200 store i8 %conv1, i8* %arrayidx, align 1
201 %inc = add nsw i32 %i.04, 2
202 %cmp = icmp sle i32 %inc, 13710
203 br i1 %cmp, label %for.body, label %for.end
204
205for.end: ; preds = %for.body, %entry
206 ret void
207}
208
209
210
211; CHECK: test_pos4_ri_sle
212; CHECK: bdnz
213; a < b
214define void @test_pos4_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
215entry:
216 %cmp3 = icmp sle i32 %a, 9920
217 br i1 %cmp3, label %for.body.lr.ph, label %for.end
218
219for.body.lr.ph: ; preds = %entry
220 br label %for.body
221
222for.body: ; preds = %for.body.lr.ph, %for.body
223 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000224 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000225 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000226 %conv = zext i8 %0 to i32
227 %add = add nsw i32 %conv, 1
228 %conv1 = trunc i32 %add to i8
229 store i8 %conv1, i8* %arrayidx, align 1
230 %inc = add nsw i32 %i.04, 4
231 %cmp = icmp sle i32 %inc, 9920
232 br i1 %cmp, label %for.body, label %for.end
233
234for.end: ; preds = %for.body, %entry
235 ret void
236}
237
238
239
240; CHECK: test_pos8_ri_sle
241; CHECK: bdnz
242; a < b
243define void @test_pos8_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
244entry:
245 %cmp3 = icmp sle i32 %a, 18924
246 br i1 %cmp3, label %for.body.lr.ph, label %for.end
247
248for.body.lr.ph: ; preds = %entry
249 br label %for.body
250
251for.body: ; preds = %for.body.lr.ph, %for.body
252 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000253 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000254 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000255 %conv = zext i8 %0 to i32
256 %add = add nsw i32 %conv, 1
257 %conv1 = trunc i32 %add to i8
258 store i8 %conv1, i8* %arrayidx, align 1
259 %inc = add nsw i32 %i.04, 8
260 %cmp = icmp sle i32 %inc, 18924
261 br i1 %cmp, label %for.body, label %for.end
262
263for.end: ; preds = %for.body, %entry
264 ret void
265}
266
267
268
269; CHECK: test_pos16_ri_sle
270; CHECK: bdnz
271; a < b
272define void @test_pos16_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
273entry:
274 %cmp3 = icmp sle i32 %a, 11812
275 br i1 %cmp3, label %for.body.lr.ph, label %for.end
276
277for.body.lr.ph: ; preds = %entry
278 br label %for.body
279
280for.body: ; preds = %for.body.lr.ph, %for.body
281 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000282 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000283 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000284 %conv = zext i8 %0 to i32
285 %add = add nsw i32 %conv, 1
286 %conv1 = trunc i32 %add to i8
287 store i8 %conv1, i8* %arrayidx, align 1
288 %inc = add nsw i32 %i.04, 16
289 %cmp = icmp sle i32 %inc, 11812
290 br i1 %cmp, label %for.body, label %for.end
291
292for.end: ; preds = %for.body, %entry
293 ret void
294}
295
296
297
298; CHECK: test_pos1_rr_sle
299; FIXME: Support this loop!
300; CHECK-NOT: bdnz
301; a < b
302define void @test_pos1_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
303entry:
304 %cmp3 = icmp sle i32 %a, %b
305 br i1 %cmp3, label %for.body.lr.ph, label %for.end
306
307for.body.lr.ph: ; preds = %entry
308 br label %for.body
309
310for.body: ; preds = %for.body.lr.ph, %for.body
311 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000312 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000313 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000314 %conv = zext i8 %0 to i32
315 %add = add nsw i32 %conv, 1
316 %conv1 = trunc i32 %add to i8
317 store i8 %conv1, i8* %arrayidx, align 1
318 %inc = add nsw i32 %i.04, 1
319 %cmp = icmp sle i32 %inc, %b
320 br i1 %cmp, label %for.body, label %for.end
321
322for.end: ; preds = %for.body, %entry
323 ret void
324}
325
326
327
328; CHECK: test_pos2_rr_sle
329; FIXME: Support this loop!
330; CHECK-NOT: bdnz
331; a < b
332define void @test_pos2_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
333entry:
334 %cmp3 = icmp sle i32 %a, %b
335 br i1 %cmp3, label %for.body.lr.ph, label %for.end
336
337for.body.lr.ph: ; preds = %entry
338 br label %for.body
339
340for.body: ; preds = %for.body.lr.ph, %for.body
341 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000342 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000343 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000344 %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 sle i32 %inc, %b
350 br i1 %cmp, label %for.body, label %for.end
351
352for.end: ; preds = %for.body, %entry
353 ret void
354}
355
356
357
358; CHECK: test_pos4_rr_sle
359; FIXME: Support this loop!
360; CHECK-NOT: bdnz
361; a < b
362define void @test_pos4_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
363entry:
364 %cmp3 = icmp sle i32 %a, %b
365 br i1 %cmp3, label %for.body.lr.ph, label %for.end
366
367for.body.lr.ph: ; preds = %entry
368 br label %for.body
369
370for.body: ; preds = %for.body.lr.ph, %for.body
371 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000372 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000373 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000374 %conv = zext i8 %0 to i32
375 %add = add nsw i32 %conv, 1
376 %conv1 = trunc i32 %add to i8
377 store i8 %conv1, i8* %arrayidx, align 1
378 %inc = add nsw i32 %i.04, 4
379 %cmp = icmp sle i32 %inc, %b
380 br i1 %cmp, label %for.body, label %for.end
381
382for.end: ; preds = %for.body, %entry
383 ret void
384}
385
386
387
388; CHECK: test_pos8_rr_sle
389; FIXME: Support this loop!
390; CHECK-NOT: bdnz
391; a < b
392define void @test_pos8_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
393entry:
394 %cmp3 = icmp sle i32 %a, %b
395 br i1 %cmp3, label %for.body.lr.ph, label %for.end
396
397for.body.lr.ph: ; preds = %entry
398 br label %for.body
399
400for.body: ; preds = %for.body.lr.ph, %for.body
401 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000402 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000403 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000404 %conv = zext i8 %0 to i32
405 %add = add nsw i32 %conv, 1
406 %conv1 = trunc i32 %add to i8
407 store i8 %conv1, i8* %arrayidx, align 1
408 %inc = add nsw i32 %i.04, 8
409 %cmp = icmp sle i32 %inc, %b
410 br i1 %cmp, label %for.body, label %for.end
411
412for.end: ; preds = %for.body, %entry
413 ret void
414}
415
416
417
418; CHECK: test_pos16_rr_sle
419; FIXME: Support this loop!
420; CHECK-NOT: bdnz
421; a < b
422define void @test_pos16_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
423entry:
424 %cmp3 = icmp sle i32 %a, %b
425 br i1 %cmp3, label %for.body.lr.ph, label %for.end
426
427for.body.lr.ph: ; preds = %entry
428 br label %for.body
429
430for.body: ; preds = %for.body.lr.ph, %for.body
431 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +0000432 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
David Blaikiea79ac142015-02-27 21:17:42 +0000433 %0 = load i8, i8* %arrayidx, align 1
Hal Finkel25c19922013-05-15 21:37:41 +0000434 %conv = zext i8 %0 to i32
435 %add = add nsw i32 %conv, 1
436 %conv1 = trunc i32 %add to i8
437 store i8 %conv1, i8* %arrayidx, align 1
438 %inc = add nsw i32 %i.04, 16
439 %cmp = icmp sle i32 %inc, %b
440 br i1 %cmp, label %for.body, label %for.end
441
442for.end: ; preds = %for.body, %entry
443 ret void
444}