Skip to content

Commit daaf62a

Browse files
committed
Add tests
1 parent f7685af commit daaf62a

File tree

1 file changed

+195
-0
lines changed

1 file changed

+195
-0
lines changed
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+sve | FileCheck %s
3+
4+
define i64 @select_or_reduce_v2i1(ptr nocapture noundef readonly %src) {
5+
; CHECK-LABEL: select_or_reduce_v2i1:
6+
; CHECK: // %bb.0: // %entry
7+
; CHECK-NEXT: mov x8, xzr
8+
; CHECK-NEXT: .LBB0_1: // %vector.body
9+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
10+
; CHECK-NEXT: ldr q0, [x0, x8]
11+
; CHECK-NEXT: cmeq v0.2d, v0.2d, #0
12+
; CHECK-NEXT: xtn v0.2s, v0.2d
13+
; CHECK-NEXT: umaxp v0.2s, v0.2s, v0.2s
14+
; CHECK-NEXT: fmov w9, s0
15+
; CHECK-NEXT: tbnz w9, #0, .LBB0_3
16+
; CHECK-NEXT: // %bb.2: // %vector.body
17+
; CHECK-NEXT: // in Loop: Header=BB0_1 Depth=1
18+
; CHECK-NEXT: cmp x8, #16
19+
; CHECK-NEXT: add x8, x8, #16
20+
; CHECK-NEXT: b.ne .LBB0_1
21+
; CHECK-NEXT: .LBB0_3: // %middle.split
22+
; CHECK-NEXT: and x0, x9, #0x1
23+
; CHECK-NEXT: ret
24+
entry:
25+
br label %vector.body
26+
27+
vector.body:
28+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
29+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
30+
%wide.load = load <2 x ptr>, ptr %arrayidx, align 8
31+
%cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)
32+
%index.next = add nuw i64 %index, 2
33+
%or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)
34+
%iv.cmp = icmp eq i64 %index.next, 4
35+
%exit.cond = or i1 %or.reduc, %iv.cmp
36+
br i1 %exit.cond, label %middle.split, label %vector.body
37+
38+
middle.split:
39+
%sel = select i1 %or.reduc, i64 1, i64 0
40+
ret i64 %sel
41+
}
42+
43+
define i64 @br_or_reduce_v2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {
44+
; CHECK-LABEL: br_or_reduce_v2i1:
45+
; CHECK: // %bb.0: // %entry
46+
; CHECK-NEXT: mov x8, xzr
47+
; CHECK-NEXT: .LBB1_1: // %vector.body
48+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
49+
; CHECK-NEXT: ldr q0, [x0, x8]
50+
; CHECK-NEXT: cmeq v0.2d, v0.2d, #0
51+
; CHECK-NEXT: xtn v0.2s, v0.2d
52+
; CHECK-NEXT: umaxp v0.2s, v0.2s, v0.2s
53+
; CHECK-NEXT: fmov w9, s0
54+
; CHECK-NEXT: tbnz w9, #0, .LBB1_3
55+
; CHECK-NEXT: // %bb.2: // %vector.body
56+
; CHECK-NEXT: // in Loop: Header=BB1_1 Depth=1
57+
; CHECK-NEXT: cmp x8, #16
58+
; CHECK-NEXT: add x8, x8, #16
59+
; CHECK-NEXT: b.ne .LBB1_1
60+
; CHECK-NEXT: .LBB1_3: // %middle.split
61+
; CHECK-NEXT: tbz w9, #0, .LBB1_5
62+
; CHECK-NEXT: // %bb.4: // %found
63+
; CHECK-NEXT: mov w8, #56 // =0x38
64+
; CHECK-NEXT: mov w0, #1 // =0x1
65+
; CHECK-NEXT: str x8, [x1]
66+
; CHECK-NEXT: ret
67+
; CHECK-NEXT: .LBB1_5:
68+
; CHECK-NEXT: mov x0, xzr
69+
; CHECK-NEXT: ret
70+
entry:
71+
br label %vector.body
72+
73+
vector.body:
74+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
75+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
76+
%wide.load = load <2 x ptr>, ptr %arrayidx, align 8
77+
%cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)
78+
%index.next = add nuw i64 %index, 2
79+
%or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)
80+
%iv.cmp = icmp eq i64 %index.next, 4
81+
%exit.cond = or i1 %or.reduc, %iv.cmp
82+
br i1 %exit.cond, label %middle.split, label %vector.body
83+
84+
middle.split:
85+
br i1 %or.reduc, label %found, label %notfound
86+
87+
found:
88+
store i64 56, ptr %p, align 8
89+
ret i64 1
90+
91+
notfound:
92+
ret i64 0
93+
}
94+
95+
define i64 @select_or_reduce_nxv2i1(ptr nocapture noundef readonly %src) {
96+
; CHECK-LABEL: select_or_reduce_nxv2i1:
97+
; CHECK: // %bb.0: // %entry
98+
; CHECK-NEXT: cntd x9
99+
; CHECK-NEXT: ptrue p0.d
100+
; CHECK-NEXT: mov x10, xzr
101+
; CHECK-NEXT: neg x8, x9
102+
; CHECK-NEXT: add x11, x8, #4
103+
; CHECK-NEXT: .LBB2_1: // %vector.body
104+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
105+
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0, x10, lsl #3]
106+
; CHECK-NEXT: cmpeq p1.d, p0/z, z0.d, #0
107+
; CHECK-NEXT: cset w8, ne
108+
; CHECK-NEXT: b.ne .LBB2_3
109+
; CHECK-NEXT: // %bb.2: // %vector.body
110+
; CHECK-NEXT: // in Loop: Header=BB2_1 Depth=1
111+
; CHECK-NEXT: cmp x11, x10
112+
; CHECK-NEXT: add x10, x10, x9
113+
; CHECK-NEXT: b.ne .LBB2_1
114+
; CHECK-NEXT: .LBB2_3: // %middle.split
115+
; CHECK-NEXT: mov x0, x8
116+
; CHECK-NEXT: ret
117+
entry:
118+
%vscale = tail call i64 @llvm.vscale.i64()
119+
%vf = shl nuw nsw i64 %vscale, 1
120+
br label %vector.body
121+
122+
vector.body:
123+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
124+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
125+
%wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8
126+
%cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)
127+
%index.next = add nuw i64 %index, %vf
128+
%or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)
129+
%iv.cmp = icmp eq i64 %index.next, 4
130+
%exit.cond = or i1 %or.reduc, %iv.cmp
131+
br i1 %exit.cond, label %middle.split, label %vector.body
132+
133+
middle.split:
134+
%sel = select i1 %or.reduc, i64 1, i64 0
135+
ret i64 %sel
136+
}
137+
138+
define i64 @br_or_reduce_nxv2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {
139+
; CHECK-LABEL: br_or_reduce_nxv2i1:
140+
; CHECK: // %bb.0: // %entry
141+
; CHECK-NEXT: cntd x8
142+
; CHECK-NEXT: ptrue p0.d
143+
; CHECK-NEXT: mov x9, xzr
144+
; CHECK-NEXT: neg x10, x8
145+
; CHECK-NEXT: add x10, x10, #4
146+
; CHECK-NEXT: .LBB3_1: // %vector.body
147+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
148+
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0, x9, lsl #3]
149+
; CHECK-NEXT: cmpeq p1.d, p0/z, z0.d, #0
150+
; CHECK-NEXT: cset w11, ne
151+
; CHECK-NEXT: b.ne .LBB3_3
152+
; CHECK-NEXT: // %bb.2: // %vector.body
153+
; CHECK-NEXT: // in Loop: Header=BB3_1 Depth=1
154+
; CHECK-NEXT: cmp x10, x9
155+
; CHECK-NEXT: add x9, x9, x8
156+
; CHECK-NEXT: b.ne .LBB3_1
157+
; CHECK-NEXT: .LBB3_3: // %middle.split
158+
; CHECK-NEXT: tbz w11, #0, .LBB3_5
159+
; CHECK-NEXT: // %bb.4: // %found
160+
; CHECK-NEXT: mov w8, #56 // =0x38
161+
; CHECK-NEXT: mov w0, #1 // =0x1
162+
; CHECK-NEXT: str x8, [x1]
163+
; CHECK-NEXT: ret
164+
; CHECK-NEXT: .LBB3_5:
165+
; CHECK-NEXT: mov x0, xzr
166+
; CHECK-NEXT: ret
167+
entry:
168+
%vscale = tail call i64 @llvm.vscale.i64()
169+
%vf = shl nuw nsw i64 %vscale, 1
170+
br label %vector.body
171+
172+
vector.body:
173+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
174+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
175+
%wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8
176+
%cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)
177+
%index.next = add nuw i64 %index, %vf
178+
%or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)
179+
%iv.cmp = icmp eq i64 %index.next, 4
180+
%exit.cond = or i1 %or.reduc, %iv.cmp
181+
br i1 %exit.cond, label %middle.split, label %vector.body
182+
183+
middle.split:
184+
br i1 %or.reduc, label %found, label %notfound
185+
186+
found:
187+
store i64 56, ptr %p, align 8
188+
ret i64 1
189+
190+
notfound:
191+
ret i64 0
192+
}
193+
194+
declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)
195+
declare i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1>)

0 commit comments

Comments
 (0)