Skip to content

Commit d1a9aa5

Browse files
committed
Add tests
1 parent f7685af commit d1a9aa5

File tree

2 files changed

+380
-0
lines changed

2 files changed

+380
-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>)
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -codegenprepare -S < %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: define i64 @select_or_reduce_v2i1(
6+
; CHECK-SAME: ptr nocapture noundef readonly [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
9+
; CHECK: [[VECTOR_BODY]]:
10+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
11+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]
12+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x ptr>, ptr [[ARRAYIDX]], align 8
13+
; CHECK-NEXT: [[COND:%.*]] = icmp eq <2 x ptr> [[WIDE_LOAD]], zeroinitializer
14+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
15+
; CHECK-NEXT: [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[COND]])
16+
; CHECK-NEXT: [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4
17+
; CHECK-NEXT: [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]
18+
; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]
19+
; CHECK: [[MIDDLE_SPLIT]]:
20+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[OR_REDUC]], i64 1, i64 0
21+
; CHECK-NEXT: ret i64 [[SEL]]
22+
;
23+
entry:
24+
br label %vector.body
25+
26+
vector.body:
27+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
28+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
29+
%wide.load = load <2 x ptr>, ptr %arrayidx, align 8
30+
%cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)
31+
%index.next = add nuw i64 %index, 2
32+
%or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)
33+
%iv.cmp = icmp eq i64 %index.next, 4
34+
%exit.cond = or i1 %or.reduc, %iv.cmp
35+
br i1 %exit.cond, label %middle.split, label %vector.body
36+
37+
middle.split:
38+
%sel = select i1 %or.reduc, i64 1, i64 0
39+
ret i64 %sel
40+
}
41+
42+
define i64 @br_or_reduce_v2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {
43+
; CHECK-LABEL: define i64 @br_or_reduce_v2i1(
44+
; CHECK-SAME: ptr nocapture noundef readonly [[SRC:%.*]], ptr noundef readnone [[P:%.*]]) #[[ATTR0]] {
45+
; CHECK-NEXT: [[ENTRY:.*]]:
46+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
47+
; CHECK: [[VECTOR_BODY]]:
48+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
49+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]
50+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x ptr>, ptr [[ARRAYIDX]], align 8
51+
; CHECK-NEXT: [[COND:%.*]] = icmp eq <2 x ptr> [[WIDE_LOAD]], zeroinitializer
52+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
53+
; CHECK-NEXT: [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[COND]])
54+
; CHECK-NEXT: [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4
55+
; CHECK-NEXT: [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]
56+
; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]
57+
; CHECK: [[MIDDLE_SPLIT]]:
58+
; CHECK-NEXT: br i1 [[OR_REDUC]], label %[[FOUND:.*]], label %[[NOTFOUND:.*]]
59+
; CHECK: [[FOUND]]:
60+
; CHECK-NEXT: store i64 56, ptr [[P]], align 8
61+
; CHECK-NEXT: ret i64 1
62+
; CHECK: [[NOTFOUND]]:
63+
; CHECK-NEXT: ret i64 0
64+
;
65+
entry:
66+
br label %vector.body
67+
68+
vector.body:
69+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
70+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
71+
%wide.load = load <2 x ptr>, ptr %arrayidx, align 8
72+
%cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)
73+
%index.next = add nuw i64 %index, 2
74+
%or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)
75+
%iv.cmp = icmp eq i64 %index.next, 4
76+
%exit.cond = or i1 %or.reduc, %iv.cmp
77+
br i1 %exit.cond, label %middle.split, label %vector.body
78+
79+
middle.split:
80+
br i1 %or.reduc, label %found, label %notfound
81+
82+
found:
83+
store i64 56, ptr %p, align 8
84+
ret i64 1
85+
86+
notfound:
87+
ret i64 0
88+
}
89+
90+
define i64 @select_or_reduce_nxv2i1(ptr nocapture noundef readonly %src) {
91+
; CHECK-LABEL: define i64 @select_or_reduce_nxv2i1(
92+
; CHECK-SAME: ptr nocapture noundef readonly [[SRC:%.*]]) #[[ATTR0]] {
93+
; CHECK-NEXT: [[ENTRY:.*]]:
94+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
95+
; CHECK: [[VECTOR_BODY]]:
96+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
97+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]
98+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 2 x ptr>, ptr [[ARRAYIDX]], align 8
99+
; CHECK-NEXT: [[COND:%.*]] = icmp eq <vscale x 2 x ptr> [[WIDE_LOAD]], zeroinitializer
100+
; CHECK-NEXT: [[TMP0:%.*]] = tail call i64 @llvm.vscale.i64()
101+
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i64 [[TMP0]], 1
102+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP1]]
103+
; CHECK-NEXT: [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[COND]])
104+
; CHECK-NEXT: [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4
105+
; CHECK-NEXT: [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]
106+
; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]
107+
; CHECK: [[MIDDLE_SPLIT]]:
108+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[OR_REDUC]], i64 1, i64 0
109+
; CHECK-NEXT: ret i64 [[SEL]]
110+
;
111+
entry:
112+
%vscale = tail call i64 @llvm.vscale.i64()
113+
%vf = shl nuw nsw i64 %vscale, 1
114+
br label %vector.body
115+
116+
vector.body:
117+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
118+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
119+
%wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8
120+
%cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)
121+
%index.next = add nuw i64 %index, %vf
122+
%or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)
123+
%iv.cmp = icmp eq i64 %index.next, 4
124+
%exit.cond = or i1 %or.reduc, %iv.cmp
125+
br i1 %exit.cond, label %middle.split, label %vector.body
126+
127+
middle.split:
128+
%sel = select i1 %or.reduc, i64 1, i64 0
129+
ret i64 %sel
130+
}
131+
132+
define i64 @br_or_reduce_nxv2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {
133+
; CHECK-LABEL: define i64 @br_or_reduce_nxv2i1(
134+
; CHECK-SAME: ptr nocapture noundef readonly [[SRC:%.*]], ptr noundef readnone [[P:%.*]]) #[[ATTR0]] {
135+
; CHECK-NEXT: [[ENTRY:.*]]:
136+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
137+
; CHECK: [[VECTOR_BODY]]:
138+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
139+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]
140+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 2 x ptr>, ptr [[ARRAYIDX]], align 8
141+
; CHECK-NEXT: [[COND:%.*]] = icmp eq <vscale x 2 x ptr> [[WIDE_LOAD]], zeroinitializer
142+
; CHECK-NEXT: [[TMP0:%.*]] = tail call i64 @llvm.vscale.i64()
143+
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i64 [[TMP0]], 1
144+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP1]]
145+
; CHECK-NEXT: [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[COND]])
146+
; CHECK-NEXT: [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4
147+
; CHECK-NEXT: [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]
148+
; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]
149+
; CHECK: [[MIDDLE_SPLIT]]:
150+
; CHECK-NEXT: br i1 [[OR_REDUC]], label %[[FOUND:.*]], label %[[NOTFOUND:.*]]
151+
; CHECK: [[FOUND]]:
152+
; CHECK-NEXT: store i64 56, ptr [[P]], align 8
153+
; CHECK-NEXT: ret i64 1
154+
; CHECK: [[NOTFOUND]]:
155+
; CHECK-NEXT: ret i64 0
156+
;
157+
entry:
158+
%vscale = tail call i64 @llvm.vscale.i64()
159+
%vf = shl nuw nsw i64 %vscale, 1
160+
br label %vector.body
161+
162+
vector.body:
163+
%index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
164+
%arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index
165+
%wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8
166+
%cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)
167+
%index.next = add nuw i64 %index, %vf
168+
%or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)
169+
%iv.cmp = icmp eq i64 %index.next, 4
170+
%exit.cond = or i1 %or.reduc, %iv.cmp
171+
br i1 %exit.cond, label %middle.split, label %vector.body
172+
173+
middle.split:
174+
br i1 %or.reduc, label %found, label %notfound
175+
176+
found:
177+
store i64 56, ptr %p, align 8
178+
ret i64 1
179+
180+
notfound:
181+
ret i64 0
182+
}
183+
184+
declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)
185+
declare i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1>)

0 commit comments

Comments
 (0)