Skip to content

Commit c428080

Browse files
committed
Add tests
1 parent c72a751 commit c428080

File tree

2 files changed

+243
-0
lines changed

2 files changed

+243
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s | FileCheck %s
3+
4+
target triple = "aarch64-unknown-linux-gnu"
5+
6+
define void @vector_loop_with_icmp(ptr nocapture noundef writeonly %dest) {
7+
; CHECK-LABEL: vector_loop_with_icmp:
8+
; CHECK: // %bb.0: // %entry
9+
; CHECK-NEXT: mov w8, #15 // =0xf
10+
; CHECK-NEXT: mov w10, #4 // =0x4
11+
; CHECK-NEXT: adrp x9, .LCPI0_0
12+
; CHECK-NEXT: adrp x11, .LCPI0_1
13+
; CHECK-NEXT: dup v0.2d, x8
14+
; CHECK-NEXT: dup v1.2d, x10
15+
; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI0_0]
16+
; CHECK-NEXT: ldr q3, [x11, :lo12:.LCPI0_1]
17+
; CHECK-NEXT: add x9, x0, #8
18+
; CHECK-NEXT: mov w10, #16 // =0x10
19+
; CHECK-NEXT: mov w11, #1 // =0x1
20+
; CHECK-NEXT: b .LBB0_2
21+
; CHECK-NEXT: .LBB0_1: // %pred.store.continue18
22+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
23+
; CHECK-NEXT: add v2.2d, v2.2d, v1.2d
24+
; CHECK-NEXT: add v3.2d, v3.2d, v1.2d
25+
; CHECK-NEXT: subs x10, x10, #4
26+
; CHECK-NEXT: add x9, x9, #16
27+
; CHECK-NEXT: b.eq .LBB0_10
28+
; CHECK-NEXT: .LBB0_2: // %vector.body
29+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
30+
; CHECK-NEXT: cmhi v4.2d, v0.2d, v3.2d
31+
; CHECK-NEXT: xtn v4.2s, v4.2d
32+
; CHECK-NEXT: uzp1 v4.4h, v4.4h, v0.4h
33+
; CHECK-NEXT: umov w12, v4.h[0]
34+
; CHECK-NEXT: tbz w12, #0, .LBB0_4
35+
; CHECK-NEXT: // %bb.3: // %pred.store.if
36+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
37+
; CHECK-NEXT: stur w11, [x9, #-8]
38+
; CHECK-NEXT: .LBB0_4: // %pred.store.continue
39+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
40+
; CHECK-NEXT: dup v4.2d, x8
41+
; CHECK-NEXT: cmhi v4.2d, v4.2d, v3.2d
42+
; CHECK-NEXT: xtn v4.2s, v4.2d
43+
; CHECK-NEXT: uzp1 v4.4h, v4.4h, v0.4h
44+
; CHECK-NEXT: umov w12, v4.h[1]
45+
; CHECK-NEXT: tbz w12, #0, .LBB0_6
46+
; CHECK-NEXT: // %bb.5: // %pred.store.if5
47+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
48+
; CHECK-NEXT: stur w11, [x9, #-4]
49+
; CHECK-NEXT: .LBB0_6: // %pred.store.continue6
50+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
51+
; CHECK-NEXT: dup v4.2d, x8
52+
; CHECK-NEXT: cmhi v4.2d, v4.2d, v2.2d
53+
; CHECK-NEXT: xtn v4.2s, v4.2d
54+
; CHECK-NEXT: uzp1 v4.4h, v0.4h, v4.4h
55+
; CHECK-NEXT: umov w12, v4.h[2]
56+
; CHECK-NEXT: tbz w12, #0, .LBB0_8
57+
; CHECK-NEXT: // %bb.7: // %pred.store.if7
58+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
59+
; CHECK-NEXT: str w11, [x9]
60+
; CHECK-NEXT: .LBB0_8: // %pred.store.continue8
61+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
62+
; CHECK-NEXT: dup v4.2d, x8
63+
; CHECK-NEXT: cmhi v4.2d, v4.2d, v2.2d
64+
; CHECK-NEXT: xtn v4.2s, v4.2d
65+
; CHECK-NEXT: uzp1 v4.4h, v0.4h, v4.4h
66+
; CHECK-NEXT: umov w12, v4.h[3]
67+
; CHECK-NEXT: tbz w12, #0, .LBB0_1
68+
; CHECK-NEXT: // %bb.9: // %pred.store.if9
69+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
70+
; CHECK-NEXT: str w11, [x9, #4]
71+
; CHECK-NEXT: b .LBB0_1
72+
; CHECK-NEXT: .LBB0_10: // %for.cond.cleanup
73+
; CHECK-NEXT: ret
74+
entry:
75+
br label %vector.body
76+
77+
vector.body:
78+
%index = phi i64 [ 0, %entry ], [ %index.next, %pred.store.continue18 ]
79+
%vec.ind = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, %entry ], [ %vec.ind.next, %pred.store.continue18 ]
80+
%0 = icmp ult <4 x i64> %vec.ind, <i64 15, i64 15, i64 15, i64 15>
81+
%1 = extractelement <4 x i1> %0, i64 0
82+
br i1 %1, label %pred.store.if, label %pred.store.continue
83+
84+
pred.store.if:
85+
%2 = getelementptr inbounds i32, ptr %dest, i64 %index
86+
store i32 1, ptr %2, align 4
87+
br label %pred.store.continue
88+
89+
pred.store.continue:
90+
%3 = extractelement <4 x i1> %0, i64 1
91+
br i1 %3, label %pred.store.if5, label %pred.store.continue6
92+
93+
pred.store.if5:
94+
%4 = or disjoint i64 %index, 1
95+
%5 = getelementptr inbounds i32, ptr %dest, i64 %4
96+
store i32 1, ptr %5, align 4
97+
br label %pred.store.continue6
98+
99+
pred.store.continue6:
100+
%6 = extractelement <4 x i1> %0, i64 2
101+
br i1 %6, label %pred.store.if7, label %pred.store.continue8
102+
103+
pred.store.if7:
104+
%7 = or disjoint i64 %index, 2
105+
%8 = getelementptr inbounds i32, ptr %dest, i64 %7
106+
store i32 1, ptr %8, align 4
107+
br label %pred.store.continue8
108+
109+
pred.store.continue8:
110+
%9 = extractelement <4 x i1> %0, i64 3
111+
br i1 %9, label %pred.store.if9, label %pred.store.continue18
112+
113+
pred.store.if9:
114+
%10 = or disjoint i64 %index, 3
115+
%11 = getelementptr inbounds i32, ptr %dest, i64 %10
116+
store i32 1, ptr %11, align 4
117+
br label %pred.store.continue18
118+
119+
pred.store.continue18:
120+
%index.next = add i64 %index, 4
121+
%vec.ind.next = add <4 x i64> %vec.ind, <i64 4, i64 4, i64 4, i64 4>
122+
%24 = icmp eq i64 %index.next, 16
123+
br i1 %24, label %for.cond.cleanup, label %vector.body
124+
125+
for.cond.cleanup:
126+
ret void
127+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve < %s | FileCheck %s
3+
4+
define arm_aapcs_vfpcc void @vector_loop_with_icmp(ptr nocapture noundef writeonly %dest) {
5+
; CHECK-LABEL: vector_loop_with_icmp:
6+
; CHECK: @ %bb.0: @ %entry
7+
; CHECK-NEXT: push {r7, lr}
8+
; CHECK-NEXT: vpush {d8, d9}
9+
; CHECK-NEXT: adr r1, .LCPI0_0
10+
; CHECK-NEXT: vmov.i32 q1, #0xf
11+
; CHECK-NEXT: vldrw.u32 q0, [r1]
12+
; CHECK-NEXT: movs r1, #0
13+
; CHECK-NEXT: mov.w lr, #1
14+
; CHECK-NEXT: vmov.i32 q2, #0xf
15+
; CHECK-NEXT: vmov.i32 q3, #0xf
16+
; CHECK-NEXT: vmov.i32 q4, #0xf
17+
; CHECK-NEXT: mov.w r12, #4
18+
; CHECK-NEXT: movs r3, #0
19+
; CHECK-NEXT: .LBB0_1: @ %vector.body
20+
; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
21+
; CHECK-NEXT: vcmp.u32 hi, q1, q0
22+
; CHECK-NEXT: vmrs r2, p0
23+
; CHECK-NEXT: vcmp.u32 hi, q2, q0
24+
; CHECK-NEXT: lsls r2, r2, #31
25+
; CHECK-NEXT: it ne
26+
; CHECK-NEXT: strne.w lr, [r0, r1, lsl #2]
27+
; CHECK-NEXT: vmrs r2, p0
28+
; CHECK-NEXT: vcmp.u32 hi, q3, q0
29+
; CHECK-NEXT: lsrs r2, r2, #4
30+
; CHECK-NEXT: lsls r2, r2, #31
31+
; CHECK-NEXT: itt ne
32+
; CHECK-NEXT: orrne r2, r1, #1
33+
; CHECK-NEXT: strne.w lr, [r0, r2, lsl #2]
34+
; CHECK-NEXT: vmrs r2, p0
35+
; CHECK-NEXT: vcmp.u32 hi, q4, q0
36+
; CHECK-NEXT: vadd.i32 q0, q0, r12
37+
; CHECK-NEXT: lsrs r2, r2, #8
38+
; CHECK-NEXT: lsls r2, r2, #31
39+
; CHECK-NEXT: itt ne
40+
; CHECK-NEXT: orrne r2, r1, #2
41+
; CHECK-NEXT: strne.w lr, [r0, r2, lsl #2]
42+
; CHECK-NEXT: vmrs r2, p0
43+
; CHECK-NEXT: lsrs r2, r2, #12
44+
; CHECK-NEXT: lsls r2, r2, #31
45+
; CHECK-NEXT: itt ne
46+
; CHECK-NEXT: orrne r2, r1, #3
47+
; CHECK-NEXT: strne.w lr, [r0, r2, lsl #2]
48+
; CHECK-NEXT: adds r1, #4
49+
; CHECK-NEXT: adc r3, r3, #0
50+
; CHECK-NEXT: eor r2, r1, #16
51+
; CHECK-NEXT: orrs r2, r3
52+
; CHECK-NEXT: bne .LBB0_1
53+
; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup
54+
; CHECK-NEXT: vpop {d8, d9}
55+
; CHECK-NEXT: pop {r7, pc}
56+
; CHECK-NEXT: .p2align 4
57+
; CHECK-NEXT: @ %bb.3:
58+
; CHECK-NEXT: .LCPI0_0:
59+
; CHECK-NEXT: .long 0 @ 0x0
60+
; CHECK-NEXT: .long 1 @ 0x1
61+
; CHECK-NEXT: .long 2 @ 0x2
62+
; CHECK-NEXT: .long 3 @ 0x3
63+
entry:
64+
br label %vector.body
65+
66+
vector.body:
67+
%index = phi i64 [ 0, %entry ], [ %index.next, %pred.store.continue18 ]
68+
%vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %entry ], [ %vec.ind.next, %pred.store.continue18 ]
69+
%0 = icmp ult <4 x i32> %vec.ind, <i32 15, i32 15, i32 15, i32 15>
70+
%1 = extractelement <4 x i1> %0, i64 0
71+
br i1 %1, label %pred.store.if, label %pred.store.continue
72+
73+
pred.store.if:
74+
%2 = getelementptr inbounds i32, ptr %dest, i64 %index
75+
store i32 1, ptr %2, align 4
76+
br label %pred.store.continue
77+
78+
pred.store.continue:
79+
%3 = extractelement <4 x i1> %0, i64 1
80+
br i1 %3, label %pred.store.if5, label %pred.store.continue6
81+
82+
pred.store.if5:
83+
%4 = or disjoint i64 %index, 1
84+
%5 = getelementptr inbounds i32, ptr %dest, i64 %4
85+
store i32 1, ptr %5, align 4
86+
br label %pred.store.continue6
87+
88+
pred.store.continue6:
89+
%6 = extractelement <4 x i1> %0, i64 2
90+
br i1 %6, label %pred.store.if7, label %pred.store.continue8
91+
92+
pred.store.if7:
93+
%7 = or disjoint i64 %index, 2
94+
%8 = getelementptr inbounds i32, ptr %dest, i64 %7
95+
store i32 1, ptr %8, align 4
96+
br label %pred.store.continue8
97+
98+
pred.store.continue8:
99+
%9 = extractelement <4 x i1> %0, i64 3
100+
br i1 %9, label %pred.store.if9, label %pred.store.continue18
101+
102+
pred.store.if9:
103+
%10 = or disjoint i64 %index, 3
104+
%11 = getelementptr inbounds i32, ptr %dest, i64 %10
105+
store i32 1, ptr %11, align 4
106+
br label %pred.store.continue18
107+
108+
pred.store.continue18:
109+
%index.next = add i64 %index, 4
110+
%vec.ind.next = add <4 x i32> %vec.ind, <i32 4, i32 4, i32 4, i32 4>
111+
%24 = icmp eq i64 %index.next, 16
112+
br i1 %24, label %for.cond.cleanup, label %vector.body
113+
114+
for.cond.cleanup:
115+
ret void
116+
}

0 commit comments

Comments
 (0)