Skip to content

Commit 3e8e3c6

Browse files
committed
Add tests
1 parent 1feeeb4 commit 3e8e3c6

File tree

2 files changed

+378
-0
lines changed

2 files changed

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