1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=hexagon < %s | FileCheck %s
4 declare <32 x i32> @llvm.hexagon.V6.vL32b.pred.ai.128B(i1, ptr, i32)
5 declare <32 x i32> @llvm.hexagon.V6.vL32b.npred.ai.128B(i1, ptr, i32)
6 declare <32 x i32> @llvm.hexagon.V6.vL32b.nt.pred.ai.128B(i1, ptr, i32)
7 declare <32 x i32> @llvm.hexagon.V6.vL32b.nt.npred.ai.128B(i1, ptr, i32)
9 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.pred.pi.128B(i1, ptr, i32)
10 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.npred.pi.128B(i1, ptr, i32)
11 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.pred.pi.128B(i1, ptr, i32)
12 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.npred.pi.128B(i1, ptr, i32)
14 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.pred.ppu.128B(i1, ptr, i32)
15 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.npred.ppu.128B(i1, ptr, i32)
16 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.pred.ppu.128B(i1, ptr, i32)
17 declare { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.npred.ppu.128B(i1, ptr, i32)
19 declare void @llvm.hexagon.V6.vS32b.pred.ai.128B(i1, ptr, i32, <32 x i32>)
20 declare void @llvm.hexagon.V6.vS32b.npred.ai.128B(i1, ptr, i32, <32 x i32>)
21 declare void @llvm.hexagon.V6.vS32Ub.pred.ai.128B(i1, ptr, i32, <32 x i32>)
22 declare void @llvm.hexagon.V6.vS32Ub.npred.ai.128B(i1, ptr, i32, <32 x i32>)
23 declare void @llvm.hexagon.V6.vS32b.nt.pred.ai.128B(i1, ptr, i32, <32 x i32>)
24 declare void @llvm.hexagon.V6.vS32b.nt.npred.ai.128B(i1, ptr, i32, <32 x i32>)
26 declare ptr @llvm.hexagon.V6.vS32b.pred.pi.128B(i1, ptr, i32, <32 x i32>)
27 declare ptr @llvm.hexagon.V6.vS32b.npred.pi.128B(i1, ptr, i32, <32 x i32>)
28 declare ptr @llvm.hexagon.V6.vS32Ub.pred.pi.128B(i1, ptr, i32, <32 x i32>)
29 declare ptr @llvm.hexagon.V6.vS32Ub.npred.pi.128B(i1, ptr, i32, <32 x i32>)
30 declare ptr @llvm.hexagon.V6.vS32b.nt.pred.pi.128B(i1, ptr, i32, <32 x i32>)
31 declare ptr @llvm.hexagon.V6.vS32b.nt.npred.pi.128B(i1, ptr, i32, <32 x i32>)
33 declare ptr @llvm.hexagon.V6.vS32b.pred.ppu.128B(i1, ptr, i32, <32 x i32>)
34 declare ptr @llvm.hexagon.V6.vS32b.npred.ppu.128B(i1, ptr, i32, <32 x i32>)
35 declare ptr @llvm.hexagon.V6.vS32Ub.pred.ppu.128B(i1, ptr, i32, <32 x i32>)
36 declare ptr @llvm.hexagon.V6.vS32Ub.npred.ppu.128B(i1, ptr, i32, <32 x i32>)
37 declare ptr @llvm.hexagon.V6.vS32b.nt.pred.ppu.128B(i1, ptr, i32, <32 x i32>)
38 declare ptr @llvm.hexagon.V6.vS32b.nt.npred.ppu.128B(i1, ptr, i32, <32 x i32>)
41 define <32 x i32> @f0(i32 %a0, ptr %a1) #0 {
43 ; CHECK: // %bb.0: // %b0
45 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
48 ; CHECK-NEXT: if (p0) v0 = vmem(r1+#3)
51 ; CHECK-NEXT: jumpr r31
54 %v0 = icmp eq i32 %a0, 0
55 %v1 = call <32 x i32> @llvm.hexagon.V6.vL32b.pred.ai.128B(i1 %v0, ptr %a1, i32 384)
59 define <32 x i32> @f1(i32 %a0, ptr %a1) #0 {
61 ; CHECK: // %bb.0: // %b0
63 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
66 ; CHECK-NEXT: if (!p0) v0 = vmem(r1+#3)
69 ; CHECK-NEXT: jumpr r31
72 %v0 = icmp eq i32 %a0, 0
73 %v1 = call <32 x i32> @llvm.hexagon.V6.vL32b.npred.ai.128B(i1 %v0, ptr %a1, i32 384)
77 define <32 x i32> @f2(i32 %a0, ptr %a1) #0 {
79 ; CHECK: // %bb.0: // %b0
81 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
84 ; CHECK-NEXT: if (p0) v0 = vmem(r1+#3):nt
87 ; CHECK-NEXT: jumpr r31
90 %v0 = icmp eq i32 %a0, 0
91 %v1 = call <32 x i32> @llvm.hexagon.V6.vL32b.nt.pred.ai.128B(i1 %v0, ptr %a1, i32 384)
95 define <32 x i32> @f3(i32 %a0, ptr %a1) #0 {
97 ; CHECK: // %bb.0: // %b0
99 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
102 ; CHECK-NEXT: if (!p0) v0 = vmem(r1+#3):nt
105 ; CHECK-NEXT: jumpr r31
108 %v0 = icmp eq i32 %a0, 0
109 %v1 = call <32 x i32> @llvm.hexagon.V6.vL32b.nt.npred.ai.128B(i1 %v0, ptr %a1, i32 384)
113 define ptr @f4(i32 %a0, ptr %a1) #0 {
115 ; CHECK: // %bb.0: // %b0
117 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
120 ; CHECK-NEXT: r0 = r1
123 ; CHECK-NEXT: if (p0) v0 = vmem(r0++#3)
126 ; CHECK-NEXT: jumpr r31
129 %v0 = icmp eq i32 %a0, 0
130 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.pred.pi.128B(i1 %v0, ptr %a1, i32 384)
131 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
135 define ptr @f5(i32 %a0, ptr %a1) #0 {
137 ; CHECK: // %bb.0: // %b0
139 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
142 ; CHECK-NEXT: r0 = r1
145 ; CHECK-NEXT: if (!p0) v0 = vmem(r0++#3)
148 ; CHECK-NEXT: jumpr r31
151 %v0 = icmp eq i32 %a0, 0
152 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.npred.pi.128B(i1 %v0, ptr %a1, i32 384)
153 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
157 define ptr @f6(i32 %a0, ptr %a1) #0 {
159 ; CHECK: // %bb.0: // %b0
161 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
164 ; CHECK-NEXT: r0 = r1
167 ; CHECK-NEXT: if (p0) v0 = vmem(r0++#3):nt
170 ; CHECK-NEXT: jumpr r31
173 %v0 = icmp eq i32 %a0, 0
174 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.pred.pi.128B(i1 %v0, ptr %a1, i32 384)
175 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
179 define ptr @f7(i32 %a0, ptr %a1) #0 {
181 ; CHECK: // %bb.0: // %b0
183 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
186 ; CHECK-NEXT: r0 = r1
189 ; CHECK-NEXT: if (!p0) v0 = vmem(r0++#3):nt
192 ; CHECK-NEXT: jumpr r31
195 %v0 = icmp eq i32 %a0, 0
196 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.npred.pi.128B(i1 %v0, ptr %a1, i32 384)
197 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
201 define ptr @f8(i32 %a0, ptr %a1, i32 %a2) #0 {
203 ; CHECK: // %bb.0: // %b0
205 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
208 ; CHECK-NEXT: r0 = r1
211 ; CHECK-NEXT: m0 = r2
214 ; CHECK-NEXT: if (p0) v0 = vmem(r0++m0)
217 ; CHECK-NEXT: jumpr r31
220 %v0 = icmp eq i32 %a0, 0
221 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.pred.ppu.128B(i1 %v0, ptr %a1, i32 %a2)
222 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
226 define ptr @f9(i32 %a0, ptr %a1, i32 %a2) #0 {
228 ; CHECK: // %bb.0: // %b0
230 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
233 ; CHECK-NEXT: r0 = r1
236 ; CHECK-NEXT: m0 = r2
239 ; CHECK-NEXT: if (!p0) v0 = vmem(r0++m0)
242 ; CHECK-NEXT: jumpr r31
245 %v0 = icmp eq i32 %a0, 0
246 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.npred.ppu.128B(i1 %v0, ptr %a1, i32 %a2)
247 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
251 define ptr @f10(i32 %a0, ptr %a1, i32 %a2) #0 {
253 ; CHECK: // %bb.0: // %b0
255 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
258 ; CHECK-NEXT: r0 = r1
261 ; CHECK-NEXT: m0 = r2
264 ; CHECK-NEXT: if (p0) v0 = vmem(r0++m0):nt
267 ; CHECK-NEXT: jumpr r31
270 %v0 = icmp eq i32 %a0, 0
271 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.pred.ppu.128B(i1 %v0, ptr %a1, i32 %a2)
272 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
276 define ptr @f11(i32 %a0, ptr %a1, i32 %a2) #0 {
278 ; CHECK: // %bb.0: // %b0
280 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
283 ; CHECK-NEXT: r0 = r1
286 ; CHECK-NEXT: m0 = r2
289 ; CHECK-NEXT: if (!p0) v0 = vmem(r0++m0):nt
292 ; CHECK-NEXT: jumpr r31
295 %v0 = icmp eq i32 %a0, 0
296 %v1 = call { <32 x i32>, ptr } @llvm.hexagon.V6.vL32b.nt.npred.ppu.128B(i1 %v0, ptr %a1, i32 %a2)
297 %v2 = extractvalue { <32 x i32>, ptr } %v1, 1
301 define void @f12(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
303 ; CHECK: // %bb.0: // %b0
305 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
308 ; CHECK-NEXT: if (p0) vmem(r1+#-3) = v0
311 ; CHECK-NEXT: jumpr r31
314 %v0 = icmp eq i32 %a0, 0
315 call void @llvm.hexagon.V6.vS32b.pred.ai.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
319 define void @f13(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
321 ; CHECK: // %bb.0: // %b0
323 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
326 ; CHECK-NEXT: if (!p0) vmem(r1+#-3) = v0
329 ; CHECK-NEXT: jumpr r31
332 %v0 = icmp eq i32 %a0, 0
333 call void @llvm.hexagon.V6.vS32b.npred.ai.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
337 define void @f14(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
339 ; CHECK: // %bb.0: // %b0
341 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
344 ; CHECK-NEXT: if (p0) vmemu(r1+#-3) = v0
347 ; CHECK-NEXT: jumpr r31
350 %v0 = icmp eq i32 %a0, 0
351 call void @llvm.hexagon.V6.vS32Ub.pred.ai.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
355 define void @f15(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
357 ; CHECK: // %bb.0: // %b0
359 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
362 ; CHECK-NEXT: if (!p0) vmemu(r1+#-3) = v0
365 ; CHECK-NEXT: jumpr r31
368 %v0 = icmp eq i32 %a0, 0
369 call void @llvm.hexagon.V6.vS32Ub.npred.ai.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
373 define void @f16(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
375 ; CHECK: // %bb.0: // %b0
377 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
380 ; CHECK-NEXT: if (p0) vmem(r1+#-3):nt = v0
383 ; CHECK-NEXT: jumpr r31
386 %v0 = icmp eq i32 %a0, 0
387 call void @llvm.hexagon.V6.vS32b.nt.pred.ai.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
391 define void @f17(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
393 ; CHECK: // %bb.0: // %b0
395 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
398 ; CHECK-NEXT: if (!p0) vmem(r1+#-3):nt = v0
401 ; CHECK-NEXT: jumpr r31
404 %v0 = icmp eq i32 %a0, 0
405 call void @llvm.hexagon.V6.vS32b.nt.npred.ai.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
409 define ptr @f18(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
411 ; CHECK: // %bb.0: // %b0
413 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
416 ; CHECK-NEXT: r0 = r1
419 ; CHECK-NEXT: if (p0) vmem(r0++#-3) = v0
422 ; CHECK-NEXT: jumpr r31
425 %v0 = icmp eq i32 %a0, 0
426 %v1 = call ptr @llvm.hexagon.V6.vS32b.pred.pi.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
430 define ptr @f19(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
432 ; CHECK: // %bb.0: // %b0
434 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
437 ; CHECK-NEXT: r0 = r1
440 ; CHECK-NEXT: if (!p0) vmem(r0++#-3) = v0
443 ; CHECK-NEXT: jumpr r31
446 %v0 = icmp eq i32 %a0, 0
447 %v1 = call ptr @llvm.hexagon.V6.vS32b.npred.pi.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
451 define ptr @f20(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
453 ; CHECK: // %bb.0: // %b0
455 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
458 ; CHECK-NEXT: r0 = r1
461 ; CHECK-NEXT: if (p0) vmemu(r0++#-3) = v0
464 ; CHECK-NEXT: jumpr r31
467 %v0 = icmp eq i32 %a0, 0
468 %v1 = call ptr @llvm.hexagon.V6.vS32Ub.pred.pi.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
472 define ptr @f21(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
474 ; CHECK: // %bb.0: // %b0
476 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
479 ; CHECK-NEXT: r0 = r1
482 ; CHECK-NEXT: if (!p0) vmemu(r0++#-3) = v0
485 ; CHECK-NEXT: jumpr r31
488 %v0 = icmp eq i32 %a0, 0
489 %v1 = call ptr @llvm.hexagon.V6.vS32Ub.npred.pi.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
493 define ptr @f22(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
495 ; CHECK: // %bb.0: // %b0
497 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
500 ; CHECK-NEXT: r0 = r1
503 ; CHECK-NEXT: if (p0) vmem(r0++#-3):nt = v0
506 ; CHECK-NEXT: jumpr r31
509 %v0 = icmp eq i32 %a0, 0
510 %v1 = call ptr @llvm.hexagon.V6.vS32b.nt.pred.pi.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
514 define ptr @f23(i32 %a0, ptr %a1, <32 x i32> %a2) #0 {
516 ; CHECK: // %bb.0: // %b0
518 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
521 ; CHECK-NEXT: r0 = r1
524 ; CHECK-NEXT: if (!p0) vmem(r0++#-3):nt = v0
527 ; CHECK-NEXT: jumpr r31
530 %v0 = icmp eq i32 %a0, 0
531 %v1 = call ptr @llvm.hexagon.V6.vS32b.nt.npred.pi.128B(i1 %v0, ptr %a1, i32 -384, <32 x i32> %a2)
535 define ptr @f24(i32 %a0, ptr %a1, i32 %a2, <32 x i32> %a3) #0 {
537 ; CHECK: // %bb.0: // %b0
539 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
542 ; CHECK-NEXT: r0 = r1
545 ; CHECK-NEXT: m0 = r2
548 ; CHECK-NEXT: if (p0) vmem(r0++m0) = v0
551 ; CHECK-NEXT: jumpr r31
554 %v0 = icmp eq i32 %a0, 0
555 %v1 = call ptr @llvm.hexagon.V6.vS32b.pred.ppu.128B(i1 %v0, ptr %a1, i32 %a2, <32 x i32> %a3)
559 define ptr @f25(i32 %a0, ptr %a1, i32 %a2, <32 x i32> %a3) #0 {
561 ; CHECK: // %bb.0: // %b0
563 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
566 ; CHECK-NEXT: r0 = r1
569 ; CHECK-NEXT: m0 = r2
572 ; CHECK-NEXT: if (!p0) vmem(r0++m0) = v0
575 ; CHECK-NEXT: jumpr r31
578 %v0 = icmp eq i32 %a0, 0
579 %v1 = call ptr @llvm.hexagon.V6.vS32b.npred.ppu.128B(i1 %v0, ptr %a1, i32 %a2, <32 x i32> %a3)
583 define ptr @f26(i32 %a0, ptr %a1, i32 %a2, <32 x i32> %a3) #0 {
585 ; CHECK: // %bb.0: // %b0
587 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
590 ; CHECK-NEXT: r0 = r1
593 ; CHECK-NEXT: m0 = r2
596 ; CHECK-NEXT: if (p0) vmemu(r0++m0) = v0
599 ; CHECK-NEXT: jumpr r31
602 %v0 = icmp eq i32 %a0, 0
603 %v1 = call ptr @llvm.hexagon.V6.vS32Ub.pred.ppu.128B(i1 %v0, ptr %a1, i32 %a2, <32 x i32> %a3)
607 define ptr @f27(i32 %a0, ptr %a1, i32 %a2, <32 x i32> %a3) #0 {
609 ; CHECK: // %bb.0: // %b0
611 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
614 ; CHECK-NEXT: r0 = r1
617 ; CHECK-NEXT: m0 = r2
620 ; CHECK-NEXT: if (!p0) vmemu(r0++m0) = v0
623 ; CHECK-NEXT: jumpr r31
626 %v0 = icmp eq i32 %a0, 0
627 %v1 = call ptr @llvm.hexagon.V6.vS32Ub.npred.ppu.128B(i1 %v0, ptr %a1, i32 %a2, <32 x i32> %a3)
631 define ptr @f28(i32 %a0, ptr %a1, i32 %a2, <32 x i32> %a3) #0 {
633 ; CHECK: // %bb.0: // %b0
635 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
638 ; CHECK-NEXT: r0 = r1
641 ; CHECK-NEXT: m0 = r2
644 ; CHECK-NEXT: if (p0) vmem(r0++m0):nt = v0
647 ; CHECK-NEXT: jumpr r31
650 %v0 = icmp eq i32 %a0, 0
651 %v1 = call ptr @llvm.hexagon.V6.vS32b.nt.pred.ppu.128B(i1 %v0, ptr %a1, i32 %a2, <32 x i32> %a3)
655 define ptr @f29(i32 %a0, ptr %a1, i32 %a2, <32 x i32> %a3) #0 {
657 ; CHECK: // %bb.0: // %b0
659 ; CHECK-NEXT: p0 = cmp.eq(r0,#0)
662 ; CHECK-NEXT: r0 = r1
665 ; CHECK-NEXT: m0 = r2
668 ; CHECK-NEXT: if (!p0) vmem(r0++m0):nt = v0
671 ; CHECK-NEXT: jumpr r31
674 %v0 = icmp eq i32 %a0, 0
675 %v1 = call ptr @llvm.hexagon.V6.vS32b.nt.npred.ppu.128B(i1 %v0, ptr %a1, i32 %a2, <32 x i32> %a3)
679 attributes #0 = { nounwind "target-cpu"="hexagonv66" "target-features"="+hvxv66,+hvx-length128b,-packets" }