Skip to content

Commit 093f0a4

Browse files
committed
[instcombine] Improve coverage for reductions of i1 types
In advance of an upcoming change to generalize some of this to scalable vector types.
1 parent ddbf5ea commit 093f0a4

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed

llvm/test/Transforms/InstCombine/vector-logical-reductions.ll

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ define i1 @reduction_logical_or(<4 x i1> %x) {
1111
ret i1 %r
1212
}
1313

14+
define i1 @reduction_logical_or_nxv2i1(<vscale x 2 x i1> %x) {
15+
; CHECK-LABEL: @reduction_logical_or_nxv2i1(
16+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
17+
; CHECK-NEXT: ret i1 [[R]]
18+
;
19+
%r = call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %x)
20+
ret i1 %r
21+
}
22+
1423
define i1 @reduction_logical_and(<4 x i1> %x) {
1524
; CHECK-LABEL: @reduction_logical_and(
1625
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[X:%.*]] to i4
@@ -21,6 +30,131 @@ define i1 @reduction_logical_and(<4 x i1> %x) {
2130
ret i1 %r
2231
}
2332

33+
define i1 @reduction_logical_and_nxv2i1(<vscale x 2 x i1> %x) {
34+
; CHECK-LABEL: @reduction_logical_and_nxv2i1(
35+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
36+
; CHECK-NEXT: ret i1 [[R]]
37+
;
38+
%r = call i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1> %x)
39+
ret i1 %r
40+
}
41+
42+
define i1 @reduction_logical_mul(<2 x i1> %x) {
43+
; CHECK-LABEL: @reduction_logical_mul(
44+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
45+
; CHECK-NEXT: [[R:%.*]] = icmp eq i2 [[TMP1]], -1
46+
; CHECK-NEXT: ret i1 [[R]]
47+
;
48+
%r = call i1 @llvm.vector.reduce.mul.v4i1(<2 x i1> %x)
49+
ret i1 %r
50+
}
51+
52+
define i1 @reduction_logical_mul_nxv2i1(<vscale x 2 x i1> %x) {
53+
; CHECK-LABEL: @reduction_logical_mul_nxv2i1(
54+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.mul.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
55+
; CHECK-NEXT: ret i1 [[R]]
56+
;
57+
%r = call i1 @llvm.vector.reduce.mul.nxv2i1(<vscale x 2 x i1> %x)
58+
ret i1 %r
59+
}
60+
61+
define i1 @reduction_logical_xor(<2 x i1> %x) {
62+
; CHECK-LABEL: @reduction_logical_xor(
63+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
64+
; CHECK-NEXT: [[TMP2:%.*]] = call range(i2 0, -1) i2 @llvm.ctpop.i2(i2 [[TMP1]])
65+
; CHECK-NEXT: [[R:%.*]] = trunc i2 [[TMP2]] to i1
66+
; CHECK-NEXT: ret i1 [[R]]
67+
;
68+
%r = call i1 @llvm.vector.reduce.xor.v4i1(<2 x i1> %x)
69+
ret i1 %r
70+
}
71+
72+
define i1 @reduction_logical_xor_nxv2i1(<vscale x 2 x i1> %x) {
73+
; CHECK-LABEL: @reduction_logical_xor_nxv2i1(
74+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
75+
; CHECK-NEXT: ret i1 [[R]]
76+
;
77+
%r = call i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1> %x)
78+
ret i1 %r
79+
}
80+
81+
define i1 @reduction_logical_smin(<2 x i1> %x) {
82+
; CHECK-LABEL: @reduction_logical_smin(
83+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
84+
; CHECK-NEXT: [[R:%.*]] = icmp ne i2 [[TMP1]], 0
85+
; CHECK-NEXT: ret i1 [[R]]
86+
;
87+
%r = call i1 @llvm.vector.reduce.smin.v4i1(<2 x i1> %x)
88+
ret i1 %r
89+
}
90+
91+
define i1 @reduction_logical_smin_nxv2i1(<vscale x 2 x i1> %x) {
92+
; CHECK-LABEL: @reduction_logical_smin_nxv2i1(
93+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
94+
; CHECK-NEXT: ret i1 [[R]]
95+
;
96+
%r = call i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1> %x)
97+
ret i1 %r
98+
}
99+
100+
define i1 @reduction_logical_smax(<2 x i1> %x) {
101+
; CHECK-LABEL: @reduction_logical_smax(
102+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
103+
; CHECK-NEXT: [[R:%.*]] = icmp eq i2 [[TMP1]], -1
104+
; CHECK-NEXT: ret i1 [[R]]
105+
;
106+
%r = call i1 @llvm.vector.reduce.smax.v4i1(<2 x i1> %x)
107+
ret i1 %r
108+
}
109+
110+
define i1 @reduction_logical_smax_nxv2i1(<vscale x 2 x i1> %x) {
111+
; CHECK-LABEL: @reduction_logical_smax_nxv2i1(
112+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
113+
; CHECK-NEXT: ret i1 [[R]]
114+
;
115+
%r = call i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1> %x)
116+
ret i1 %r
117+
}
118+
119+
define i1 @reduction_logical_umin(<2 x i1> %x) {
120+
; CHECK-LABEL: @reduction_logical_umin(
121+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
122+
; CHECK-NEXT: [[R:%.*]] = icmp eq i2 [[TMP1]], -1
123+
; CHECK-NEXT: ret i1 [[R]]
124+
;
125+
%r = call i1 @llvm.vector.reduce.umin.v4i1(<2 x i1> %x)
126+
ret i1 %r
127+
}
128+
129+
define i1 @reduction_logical_umin_nxv2i1(<vscale x 2 x i1> %x) {
130+
; CHECK-LABEL: @reduction_logical_umin_nxv2i1(
131+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
132+
; CHECK-NEXT: ret i1 [[R]]
133+
;
134+
%r = call i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1> %x)
135+
ret i1 %r
136+
}
137+
138+
define i1 @reduction_logical_umax(<2 x i1> %x) {
139+
; CHECK-LABEL: @reduction_logical_umax(
140+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i1> [[X:%.*]] to i2
141+
; CHECK-NEXT: [[R:%.*]] = icmp ne i2 [[TMP1]], 0
142+
; CHECK-NEXT: ret i1 [[R]]
143+
;
144+
%r = call i1 @llvm.vector.reduce.umax.v4i1(<2 x i1> %x)
145+
ret i1 %r
146+
}
147+
148+
define i1 @reduction_logical_umax_nxv2i1(<vscale x 2 x i1> %x) {
149+
; CHECK-LABEL: @reduction_logical_umax_nxv2i1(
150+
; CHECK-NEXT: [[R:%.*]] = call i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1> [[X:%.*]])
151+
; CHECK-NEXT: ret i1 [[R]]
152+
;
153+
%r = call i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1> %x)
154+
ret i1 %r
155+
}
156+
157+
24158
define i1 @reduction_logical_or_reverse_nxv2i1(<vscale x 2 x i1> %p) {
25159
; CHECK-LABEL: @reduction_logical_or_reverse_nxv2i1(
26160
; CHECK-NEXT: [[RED:%.*]] = call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[P:%.*]])
@@ -93,5 +227,15 @@ declare i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1>)
93227
declare i1 @llvm.vector.reduce.and.v2i1(<2 x i1>)
94228
declare i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1>)
95229
declare i1 @llvm.vector.reduce.xor.v2i1(<2 x i1>)
230+
declare i1 @llvm.vector.reduce.mul.nxv2i1(<vscale x 2 x i1>)
231+
declare i1 @llvm.vector.reduce.mul.v2i1(<2 x i1>)
232+
declare i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1>)
233+
declare i1 @llvm.vector.reduce.smin.v2i1(<2 x i1>)
234+
declare i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1>)
235+
declare i1 @llvm.vector.reduce.smax.v2i1(<2 x i1>)
236+
declare i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1>)
237+
declare i1 @llvm.vector.reduce.umin.v2i1(<2 x i1>)
238+
declare i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1>)
239+
declare i1 @llvm.vector.reduce.umax.v2i1(<2 x i1>)
96240
declare <vscale x 2 x i1> @llvm.vector.reverse.nxv2i1(<vscale x 2 x i1>)
97241
declare <2 x i1> @llvm.vector.reverse.v2i1(<2 x i1>)

0 commit comments

Comments
 (0)