1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -O0 -mtriple=aarch64 -run-pass=legalizer -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s
7 tracksRegLiveness: true
14 ; CHECK-LABEL: name: test_redxor_v1i1
17 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
18 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
19 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
20 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)
21 ; CHECK-NEXT: RET_ReallyLR implicit $w0
23 %0:_(s1) = G_TRUNC %1(s32)
24 %2:_(s1) = G_VECREDUCE_XOR %0(s1)
25 %4:_(s32) = G_ZEXT %2(s1)
27 RET_ReallyLR implicit $w0
31 name: test_redxor_v2i1
33 tracksRegLiveness: true
40 ; CHECK-LABEL: name: test_redxor_v2i1
43 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
44 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)
45 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[UV]], [[UV1]]
46 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
47 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[XOR]], [[C]]
48 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)
49 ; CHECK-NEXT: RET_ReallyLR implicit $w0
50 %1:_(<2 x s32>) = COPY $d0
51 %0:_(<2 x s1>) = G_TRUNC %1(<2 x s32>)
52 %2:_(s1) = G_VECREDUCE_XOR %0(<2 x s1>)
53 %4:_(s32) = G_ZEXT %2(s1)
55 RET_ReallyLR implicit $w0
59 name: test_redxor_v4i1
61 tracksRegLiveness: true
68 ; CHECK-LABEL: name: test_redxor_v4i1
71 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
72 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16), [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
73 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s16)
74 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s16)
75 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
76 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s16)
77 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s16)
78 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
79 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[XOR]], [[XOR1]]
80 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
81 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[XOR2]], [[C]]
82 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)
83 ; CHECK-NEXT: RET_ReallyLR implicit $w0
84 %1:_(<4 x s16>) = COPY $d0
85 %0:_(<4 x s1>) = G_TRUNC %1(<4 x s16>)
86 %2:_(s1) = G_VECREDUCE_XOR %0(<4 x s1>)
87 %4:_(s32) = G_ZEXT %2(s1)
89 RET_ReallyLR implicit $w0
93 name: test_redxor_v8i1
95 tracksRegLiveness: true
102 ; CHECK-LABEL: name: test_redxor_v8i1
103 ; CHECK: liveins: $d0
105 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
106 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8), [[UV4:%[0-9]+]]:_(s8), [[UV5:%[0-9]+]]:_(s8), [[UV6:%[0-9]+]]:_(s8), [[UV7:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[COPY]](<8 x s8>)
107 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s8)
108 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s8)
109 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
110 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
111 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
112 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
113 ; CHECK-NEXT: [[ANYEXT4:%[0-9]+]]:_(s32) = G_ANYEXT [[UV4]](s8)
114 ; CHECK-NEXT: [[ANYEXT5:%[0-9]+]]:_(s32) = G_ANYEXT [[UV5]](s8)
115 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT4]], [[ANYEXT5]]
116 ; CHECK-NEXT: [[ANYEXT6:%[0-9]+]]:_(s32) = G_ANYEXT [[UV6]](s8)
117 ; CHECK-NEXT: [[ANYEXT7:%[0-9]+]]:_(s32) = G_ANYEXT [[UV7]](s8)
118 ; CHECK-NEXT: [[XOR3:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT6]], [[ANYEXT7]]
119 ; CHECK-NEXT: [[XOR4:%[0-9]+]]:_(s32) = G_XOR [[XOR]], [[XOR1]]
120 ; CHECK-NEXT: [[XOR5:%[0-9]+]]:_(s32) = G_XOR [[XOR2]], [[XOR3]]
121 ; CHECK-NEXT: [[XOR6:%[0-9]+]]:_(s32) = G_XOR [[XOR4]], [[XOR5]]
122 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
123 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[XOR6]], [[C]]
124 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)
125 ; CHECK-NEXT: RET_ReallyLR implicit $w0
126 %1:_(<8 x s8>) = COPY $d0
127 %0:_(<8 x s1>) = G_TRUNC %1(<8 x s8>)
128 %2:_(s1) = G_VECREDUCE_XOR %0(<8 x s1>)
129 %4:_(s32) = G_ZEXT %2(s1)
131 RET_ReallyLR implicit $w0
135 name: test_redxor_v16i1
137 tracksRegLiveness: true
142 machineFunctionInfo: {}
147 ; CHECK-LABEL: name: test_redxor_v16i1
148 ; CHECK: liveins: $q0
150 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
151 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8), [[UV4:%[0-9]+]]:_(s8), [[UV5:%[0-9]+]]:_(s8), [[UV6:%[0-9]+]]:_(s8), [[UV7:%[0-9]+]]:_(s8), [[UV8:%[0-9]+]]:_(s8), [[UV9:%[0-9]+]]:_(s8), [[UV10:%[0-9]+]]:_(s8), [[UV11:%[0-9]+]]:_(s8), [[UV12:%[0-9]+]]:_(s8), [[UV13:%[0-9]+]]:_(s8), [[UV14:%[0-9]+]]:_(s8), [[UV15:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[COPY]](<16 x s8>)
152 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s8)
153 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s8)
154 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
155 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
156 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
157 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
158 ; CHECK-NEXT: [[ANYEXT4:%[0-9]+]]:_(s32) = G_ANYEXT [[UV4]](s8)
159 ; CHECK-NEXT: [[ANYEXT5:%[0-9]+]]:_(s32) = G_ANYEXT [[UV5]](s8)
160 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT4]], [[ANYEXT5]]
161 ; CHECK-NEXT: [[ANYEXT6:%[0-9]+]]:_(s32) = G_ANYEXT [[UV6]](s8)
162 ; CHECK-NEXT: [[ANYEXT7:%[0-9]+]]:_(s32) = G_ANYEXT [[UV7]](s8)
163 ; CHECK-NEXT: [[XOR3:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT6]], [[ANYEXT7]]
164 ; CHECK-NEXT: [[ANYEXT8:%[0-9]+]]:_(s32) = G_ANYEXT [[UV8]](s8)
165 ; CHECK-NEXT: [[ANYEXT9:%[0-9]+]]:_(s32) = G_ANYEXT [[UV9]](s8)
166 ; CHECK-NEXT: [[XOR4:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT8]], [[ANYEXT9]]
167 ; CHECK-NEXT: [[ANYEXT10:%[0-9]+]]:_(s32) = G_ANYEXT [[UV10]](s8)
168 ; CHECK-NEXT: [[ANYEXT11:%[0-9]+]]:_(s32) = G_ANYEXT [[UV11]](s8)
169 ; CHECK-NEXT: [[XOR5:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT10]], [[ANYEXT11]]
170 ; CHECK-NEXT: [[ANYEXT12:%[0-9]+]]:_(s32) = G_ANYEXT [[UV12]](s8)
171 ; CHECK-NEXT: [[ANYEXT13:%[0-9]+]]:_(s32) = G_ANYEXT [[UV13]](s8)
172 ; CHECK-NEXT: [[XOR6:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT12]], [[ANYEXT13]]
173 ; CHECK-NEXT: [[ANYEXT14:%[0-9]+]]:_(s32) = G_ANYEXT [[UV14]](s8)
174 ; CHECK-NEXT: [[ANYEXT15:%[0-9]+]]:_(s32) = G_ANYEXT [[UV15]](s8)
175 ; CHECK-NEXT: [[XOR7:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT14]], [[ANYEXT15]]
176 ; CHECK-NEXT: [[XOR8:%[0-9]+]]:_(s32) = G_XOR [[XOR]], [[XOR1]]
177 ; CHECK-NEXT: [[XOR9:%[0-9]+]]:_(s32) = G_XOR [[XOR2]], [[XOR3]]
178 ; CHECK-NEXT: [[XOR10:%[0-9]+]]:_(s32) = G_XOR [[XOR4]], [[XOR5]]
179 ; CHECK-NEXT: [[XOR11:%[0-9]+]]:_(s32) = G_XOR [[XOR6]], [[XOR7]]
180 ; CHECK-NEXT: [[XOR12:%[0-9]+]]:_(s32) = G_XOR [[XOR8]], [[XOR9]]
181 ; CHECK-NEXT: [[XOR13:%[0-9]+]]:_(s32) = G_XOR [[XOR10]], [[XOR11]]
182 ; CHECK-NEXT: [[XOR14:%[0-9]+]]:_(s32) = G_XOR [[XOR12]], [[XOR13]]
183 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
184 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[XOR14]], [[C]]
185 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)
186 ; CHECK-NEXT: RET_ReallyLR implicit $w0
187 %1:_(<16 x s8>) = COPY $q0
188 %0:_(<16 x s1>) = G_TRUNC %1(<16 x s8>)
189 %2:_(s1) = G_VECREDUCE_XOR %0(<16 x s1>)
190 %4:_(s32) = G_ZEXT %2(s1)
192 RET_ReallyLR implicit $w0
196 name: test_redxor_v1i8
198 tracksRegLiveness: true
205 ; CHECK-LABEL: name: test_redxor_v1i8
206 ; CHECK: liveins: $d0
208 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
209 ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(s64) = G_BITCAST [[COPY]](<8 x s8>)
210 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[BITCAST]](s64)
211 ; CHECK-NEXT: $w0 = COPY [[TRUNC]](s32)
212 ; CHECK-NEXT: RET_ReallyLR implicit $w0
213 %1:_(<8 x s8>) = COPY $d0
214 %11:_(s64) = G_BITCAST %1(<8 x s8>)
215 %0:_(s8) = G_TRUNC %11(s64)
216 %9:_(s8) = G_VECREDUCE_XOR %0(s8)
217 %10:_(s32) = G_ANYEXT %9(s8)
219 RET_ReallyLR implicit $w0
223 name: test_redxor_v3i8
225 tracksRegLiveness: true
232 liveins: $w0, $w1, $w2
234 ; CHECK-LABEL: name: test_redxor_v3i8
235 ; CHECK: liveins: $w0, $w1, $w2
237 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
238 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
239 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
240 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[COPY]], [[COPY1]]
241 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[XOR]], [[COPY2]]
242 ; CHECK-NEXT: $w0 = COPY [[XOR1]](s32)
243 ; CHECK-NEXT: RET_ReallyLR implicit $w0
247 %4:_(<3 x s32>) = G_BUILD_VECTOR %1(s32), %2(s32), %3(s32)
248 %0:_(<3 x s8>) = G_TRUNC %4(<3 x s32>)
249 %5:_(s8) = G_VECREDUCE_XOR %0(<3 x s8>)
250 %6:_(s32) = G_ANYEXT %5(s8)
252 RET_ReallyLR implicit $w0
256 name: test_redxor_v4i8
258 tracksRegLiveness: true
265 ; CHECK-LABEL: name: test_redxor_v4i8
266 ; CHECK: liveins: $d0
268 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
269 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16), [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
270 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s16)
271 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s16)
272 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
273 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s16)
274 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s16)
275 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
276 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[XOR]], [[XOR1]]
277 ; CHECK-NEXT: $w0 = COPY [[XOR2]](s32)
278 ; CHECK-NEXT: RET_ReallyLR implicit $w0
279 %1:_(<4 x s16>) = COPY $d0
280 %0:_(<4 x s8>) = G_TRUNC %1(<4 x s16>)
281 %2:_(s8) = G_VECREDUCE_XOR %0(<4 x s8>)
282 %3:_(s32) = G_ANYEXT %2(s8)
284 RET_ReallyLR implicit $w0
288 name: test_redxor_v8i8
290 tracksRegLiveness: true
297 ; CHECK-LABEL: name: test_redxor_v8i8
298 ; CHECK: liveins: $d0
300 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
301 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8), [[UV4:%[0-9]+]]:_(s8), [[UV5:%[0-9]+]]:_(s8), [[UV6:%[0-9]+]]:_(s8), [[UV7:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[COPY]](<8 x s8>)
302 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s8)
303 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s8)
304 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
305 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
306 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
307 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
308 ; CHECK-NEXT: [[ANYEXT4:%[0-9]+]]:_(s32) = G_ANYEXT [[UV4]](s8)
309 ; CHECK-NEXT: [[ANYEXT5:%[0-9]+]]:_(s32) = G_ANYEXT [[UV5]](s8)
310 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT4]], [[ANYEXT5]]
311 ; CHECK-NEXT: [[ANYEXT6:%[0-9]+]]:_(s32) = G_ANYEXT [[UV6]](s8)
312 ; CHECK-NEXT: [[ANYEXT7:%[0-9]+]]:_(s32) = G_ANYEXT [[UV7]](s8)
313 ; CHECK-NEXT: [[XOR3:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT6]], [[ANYEXT7]]
314 ; CHECK-NEXT: [[XOR4:%[0-9]+]]:_(s32) = G_XOR [[XOR]], [[XOR1]]
315 ; CHECK-NEXT: [[XOR5:%[0-9]+]]:_(s32) = G_XOR [[XOR2]], [[XOR3]]
316 ; CHECK-NEXT: [[XOR6:%[0-9]+]]:_(s32) = G_XOR [[XOR4]], [[XOR5]]
317 ; CHECK-NEXT: $w0 = COPY [[XOR6]](s32)
318 ; CHECK-NEXT: RET_ReallyLR implicit $w0
319 %0:_(<8 x s8>) = COPY $d0
320 %1:_(s8) = G_VECREDUCE_XOR %0(<8 x s8>)
321 %2:_(s32) = G_ANYEXT %1(s8)
323 RET_ReallyLR implicit $w0
327 name: test_redxor_v16i8
329 tracksRegLiveness: true
336 ; CHECK-LABEL: name: test_redxor_v16i8
337 ; CHECK: liveins: $q0
339 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
340 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<8 x s8>), [[UV1:%[0-9]+]]:_(<8 x s8>) = G_UNMERGE_VALUES [[COPY]](<16 x s8>)
341 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<8 x s8>) = G_XOR [[UV]], [[UV1]]
342 ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8), [[UV4:%[0-9]+]]:_(s8), [[UV5:%[0-9]+]]:_(s8), [[UV6:%[0-9]+]]:_(s8), [[UV7:%[0-9]+]]:_(s8), [[UV8:%[0-9]+]]:_(s8), [[UV9:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[XOR]](<8 x s8>)
343 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
344 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
345 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
346 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV4]](s8)
347 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV5]](s8)
348 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
349 ; CHECK-NEXT: [[ANYEXT4:%[0-9]+]]:_(s32) = G_ANYEXT [[UV6]](s8)
350 ; CHECK-NEXT: [[ANYEXT5:%[0-9]+]]:_(s32) = G_ANYEXT [[UV7]](s8)
351 ; CHECK-NEXT: [[XOR3:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT4]], [[ANYEXT5]]
352 ; CHECK-NEXT: [[ANYEXT6:%[0-9]+]]:_(s32) = G_ANYEXT [[UV8]](s8)
353 ; CHECK-NEXT: [[ANYEXT7:%[0-9]+]]:_(s32) = G_ANYEXT [[UV9]](s8)
354 ; CHECK-NEXT: [[XOR4:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT6]], [[ANYEXT7]]
355 ; CHECK-NEXT: [[XOR5:%[0-9]+]]:_(s32) = G_XOR [[XOR1]], [[XOR2]]
356 ; CHECK-NEXT: [[XOR6:%[0-9]+]]:_(s32) = G_XOR [[XOR3]], [[XOR4]]
357 ; CHECK-NEXT: [[XOR7:%[0-9]+]]:_(s32) = G_XOR [[XOR5]], [[XOR6]]
358 ; CHECK-NEXT: $w0 = COPY [[XOR7]](s32)
359 ; CHECK-NEXT: RET_ReallyLR implicit $w0
360 %0:_(<16 x s8>) = COPY $q0
361 %1:_(s8) = G_VECREDUCE_XOR %0(<16 x s8>)
362 %2:_(s32) = G_ANYEXT %1(s8)
364 RET_ReallyLR implicit $w0
368 name: test_redxor_v32i8
370 tracksRegLiveness: true
378 ; CHECK-LABEL: name: test_redxor_v32i8
379 ; CHECK: liveins: $q0, $q1
381 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
382 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<16 x s8>) = COPY $q1
383 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<16 x s8>) = G_XOR [[COPY]], [[COPY1]]
384 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<8 x s8>), [[UV1:%[0-9]+]]:_(<8 x s8>) = G_UNMERGE_VALUES [[XOR]](<16 x s8>)
385 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(<8 x s8>) = G_XOR [[UV]], [[UV1]]
386 ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8), [[UV4:%[0-9]+]]:_(s8), [[UV5:%[0-9]+]]:_(s8), [[UV6:%[0-9]+]]:_(s8), [[UV7:%[0-9]+]]:_(s8), [[UV8:%[0-9]+]]:_(s8), [[UV9:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[XOR1]](<8 x s8>)
387 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
388 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
389 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
390 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV4]](s8)
391 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV5]](s8)
392 ; CHECK-NEXT: [[XOR3:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
393 ; CHECK-NEXT: [[ANYEXT4:%[0-9]+]]:_(s32) = G_ANYEXT [[UV6]](s8)
394 ; CHECK-NEXT: [[ANYEXT5:%[0-9]+]]:_(s32) = G_ANYEXT [[UV7]](s8)
395 ; CHECK-NEXT: [[XOR4:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT4]], [[ANYEXT5]]
396 ; CHECK-NEXT: [[ANYEXT6:%[0-9]+]]:_(s32) = G_ANYEXT [[UV8]](s8)
397 ; CHECK-NEXT: [[ANYEXT7:%[0-9]+]]:_(s32) = G_ANYEXT [[UV9]](s8)
398 ; CHECK-NEXT: [[XOR5:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT6]], [[ANYEXT7]]
399 ; CHECK-NEXT: [[XOR6:%[0-9]+]]:_(s32) = G_XOR [[XOR2]], [[XOR3]]
400 ; CHECK-NEXT: [[XOR7:%[0-9]+]]:_(s32) = G_XOR [[XOR4]], [[XOR5]]
401 ; CHECK-NEXT: [[XOR8:%[0-9]+]]:_(s32) = G_XOR [[XOR6]], [[XOR7]]
402 ; CHECK-NEXT: $w0 = COPY [[XOR8]](s32)
403 ; CHECK-NEXT: RET_ReallyLR implicit $w0
404 %1:_(<16 x s8>) = COPY $q0
405 %2:_(<16 x s8>) = COPY $q1
406 %0:_(<32 x s8>) = G_CONCAT_VECTORS %1(<16 x s8>), %2(<16 x s8>)
407 %3:_(s8) = G_VECREDUCE_XOR %0(<32 x s8>)
408 %4:_(s32) = G_ANYEXT %3(s8)
410 RET_ReallyLR implicit $w0
414 name: test_redxor_v4i16
416 tracksRegLiveness: true
423 ; CHECK-LABEL: name: test_redxor_v4i16
424 ; CHECK: liveins: $d0
426 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
427 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16), [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
428 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s16)
429 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s16)
430 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
431 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s16)
432 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s16)
433 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
434 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[XOR]], [[XOR1]]
435 ; CHECK-NEXT: $w0 = COPY [[XOR2]](s32)
436 ; CHECK-NEXT: RET_ReallyLR implicit $w0
437 %0:_(<4 x s16>) = COPY $d0
438 %1:_(s16) = G_VECREDUCE_XOR %0(<4 x s16>)
439 %2:_(s32) = G_ANYEXT %1(s16)
441 RET_ReallyLR implicit $w0
445 name: test_redxor_v8i16
447 tracksRegLiveness: true
454 ; CHECK-LABEL: name: test_redxor_v8i16
455 ; CHECK: liveins: $q0
457 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $q0
458 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s16>), [[UV1:%[0-9]+]]:_(<4 x s16>) = G_UNMERGE_VALUES [[COPY]](<8 x s16>)
459 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<4 x s16>) = G_XOR [[UV]], [[UV1]]
460 ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16), [[UV4:%[0-9]+]]:_(s16), [[UV5:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[XOR]](<4 x s16>)
461 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s16)
462 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s16)
463 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
464 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV4]](s16)
465 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV5]](s16)
466 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
467 ; CHECK-NEXT: [[XOR3:%[0-9]+]]:_(s32) = G_XOR [[XOR1]], [[XOR2]]
468 ; CHECK-NEXT: $w0 = COPY [[XOR3]](s32)
469 ; CHECK-NEXT: RET_ReallyLR implicit $w0
470 %0:_(<8 x s16>) = COPY $q0
471 %1:_(s16) = G_VECREDUCE_XOR %0(<8 x s16>)
472 %2:_(s32) = G_ANYEXT %1(s16)
474 RET_ReallyLR implicit $w0
478 name: test_redxor_v16i16
480 tracksRegLiveness: true
488 ; CHECK-LABEL: name: test_redxor_v16i16
489 ; CHECK: liveins: $q0, $q1
491 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $q0
492 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s16>) = COPY $q1
493 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<8 x s16>) = G_XOR [[COPY]], [[COPY1]]
494 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s16>), [[UV1:%[0-9]+]]:_(<4 x s16>) = G_UNMERGE_VALUES [[XOR]](<8 x s16>)
495 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(<4 x s16>) = G_XOR [[UV]], [[UV1]]
496 ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16), [[UV4:%[0-9]+]]:_(s16), [[UV5:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[XOR1]](<4 x s16>)
497 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s16)
498 ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s16)
499 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT]], [[ANYEXT1]]
500 ; CHECK-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV4]](s16)
501 ; CHECK-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV5]](s16)
502 ; CHECK-NEXT: [[XOR3:%[0-9]+]]:_(s32) = G_XOR [[ANYEXT2]], [[ANYEXT3]]
503 ; CHECK-NEXT: [[XOR4:%[0-9]+]]:_(s32) = G_XOR [[XOR2]], [[XOR3]]
504 ; CHECK-NEXT: $w0 = COPY [[XOR4]](s32)
505 ; CHECK-NEXT: RET_ReallyLR implicit $w0
506 %1:_(<8 x s16>) = COPY $q0
507 %2:_(<8 x s16>) = COPY $q1
508 %0:_(<16 x s16>) = G_CONCAT_VECTORS %1(<8 x s16>), %2(<8 x s16>)
509 %3:_(s16) = G_VECREDUCE_XOR %0(<16 x s16>)
510 %4:_(s32) = G_ANYEXT %3(s16)
512 RET_ReallyLR implicit $w0
516 name: test_redxor_v2i32
518 tracksRegLiveness: true
525 ; CHECK-LABEL: name: test_redxor_v2i32
526 ; CHECK: liveins: $d0
528 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
529 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)
530 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[UV]], [[UV1]]
531 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY [[XOR]](s32)
532 ; CHECK-NEXT: $w0 = COPY [[COPY1]](s32)
533 ; CHECK-NEXT: RET_ReallyLR implicit $w0
534 %0:_(<2 x s32>) = COPY $d0
535 %1:_(s32) = G_VECREDUCE_XOR %0(<2 x s32>)
537 RET_ReallyLR implicit $w0
541 name: test_redxor_v4i32
543 tracksRegLiveness: true
550 ; CHECK-LABEL: name: test_redxor_v4i32
551 ; CHECK: liveins: $q0
553 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
554 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
555 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<2 x s32>) = G_XOR [[UV]], [[UV1]]
556 ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[XOR]](<2 x s32>)
557 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[UV2]], [[UV3]]
558 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY [[XOR1]](s32)
559 ; CHECK-NEXT: $w0 = COPY [[COPY1]](s32)
560 ; CHECK-NEXT: RET_ReallyLR implicit $w0
561 %0:_(<4 x s32>) = COPY $q0
562 %1:_(s32) = G_VECREDUCE_XOR %0(<4 x s32>)
564 RET_ReallyLR implicit $w0
568 name: test_redxor_v8i32
570 tracksRegLiveness: true
578 ; CHECK-LABEL: name: test_redxor_v8i32
579 ; CHECK: liveins: $q0, $q1
581 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
582 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
583 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<4 x s32>) = G_XOR [[COPY]], [[COPY1]]
584 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[XOR]](<4 x s32>)
585 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(<2 x s32>) = G_XOR [[UV]], [[UV1]]
586 ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[XOR1]](<2 x s32>)
587 ; CHECK-NEXT: [[XOR2:%[0-9]+]]:_(s32) = G_XOR [[UV2]], [[UV3]]
588 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY [[XOR2]](s32)
589 ; CHECK-NEXT: $w0 = COPY [[COPY2]](s32)
590 ; CHECK-NEXT: RET_ReallyLR implicit $w0
591 %1:_(<4 x s32>) = COPY $q0
592 %2:_(<4 x s32>) = COPY $q1
593 %0:_(<8 x s32>) = G_CONCAT_VECTORS %1(<4 x s32>), %2(<4 x s32>)
594 %3:_(s32) = G_VECREDUCE_XOR %0(<8 x s32>)
596 RET_ReallyLR implicit $w0
600 name: test_redxor_v2i64
602 tracksRegLiveness: true
609 ; CHECK-LABEL: name: test_redxor_v2i64
610 ; CHECK: liveins: $q0
612 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s64>) = COPY $q0
613 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](<2 x s64>)
614 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[UV]], [[UV1]]
615 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY [[XOR]](s64)
616 ; CHECK-NEXT: $x0 = COPY [[COPY1]](s64)
617 ; CHECK-NEXT: RET_ReallyLR implicit $x0
618 %0:_(<2 x s64>) = COPY $q0
619 %1:_(s64) = G_VECREDUCE_XOR %0(<2 x s64>)
621 RET_ReallyLR implicit $x0
625 name: test_redxor_v4i64
627 tracksRegLiveness: true
635 ; CHECK-LABEL: name: test_redxor_v4i64
636 ; CHECK: liveins: $q0, $q1
638 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s64>) = COPY $q0
639 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s64>) = COPY $q1
640 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<2 x s64>) = G_XOR [[COPY]], [[COPY1]]
641 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[XOR]](<2 x s64>)
642 ; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s64) = G_XOR [[UV]], [[UV1]]
643 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY [[XOR1]](s64)
644 ; CHECK-NEXT: $x0 = COPY [[COPY2]](s64)
645 ; CHECK-NEXT: RET_ReallyLR implicit $x0
646 %1:_(<2 x s64>) = COPY $q0
647 %2:_(<2 x s64>) = COPY $q1
648 %0:_(<4 x s64>) = G_CONCAT_VECTORS %1(<2 x s64>), %2(<2 x s64>)
649 %3:_(s64) = G_VECREDUCE_XOR %0(<4 x s64>)
651 RET_ReallyLR implicit $x0