@@ -11,6 +11,15 @@ define i1 @reduction_logical_or(<4 x i1> %x) {
11
11
ret i1 %r
12
12
}
13
13
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
+
14
23
define i1 @reduction_logical_and (<4 x i1 > %x ) {
15
24
; CHECK-LABEL: @reduction_logical_and(
16
25
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[X:%.*]] to i4
@@ -21,6 +30,131 @@ define i1 @reduction_logical_and(<4 x i1> %x) {
21
30
ret i1 %r
22
31
}
23
32
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
+
24
158
define i1 @reduction_logical_or_reverse_nxv2i1 (<vscale x 2 x i1 > %p ) {
25
159
; CHECK-LABEL: @reduction_logical_or_reverse_nxv2i1(
26
160
; 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>)
93
227
declare i1 @llvm.vector.reduce.and.v2i1 (<2 x i1 >)
94
228
declare i1 @llvm.vector.reduce.xor.nxv2i1 (<vscale x 2 x i1 >)
95
229
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 >)
96
240
declare <vscale x 2 x i1 > @llvm.vector.reverse.nxv2i1 (<vscale x 2 x i1 >)
97
241
declare <2 x i1 > @llvm.vector.reverse.v2i1 (<2 x i1 >)
0 commit comments