xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/combine-icmp-of-binop-to-icmp-of-0.mir (revision 036a13065b7a744efcc48cdc0bca3b878ed906fd)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
3
4# Test:
5#  (X + Y) == X --> Y == 0
6#  (X - Y) == X --> Y == 0
7#  (X ^ Y) == X --> Y == 0
8#  (X + Y) != X --> Y != 0
9#  (X - Y) != X --> Y != 0
10#  (X ^ Y) != X --> Y != 0
11#
12# And all commuted cases.
13
14...
15---
16name:            add_scalar_eq
17tracksRegLiveness: true
18body:             |
19  bb.0:
20    liveins: $w0, $w1
21    ; CHECK-LABEL: name: add_scalar_eq
22    ; CHECK: liveins: $w0, $w1
23    ; CHECK-NEXT: {{  $}}
24    ; CHECK-NEXT: %y:_(s32) = COPY $w1
25    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
26    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
27    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
28    ; CHECK-NEXT: $w0 = COPY %ext(s32)
29    ; CHECK-NEXT: RET_ReallyLR implicit $w0
30    %x:_(s32) = COPY $w0
31    %y:_(s32) = COPY $w1
32    %op:_(s32) = G_ADD %x, %y
33    %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %x
34    %ext:_(s32) = G_ZEXT %cmp(s1)
35    $w0 = COPY %ext(s32)
36    RET_ReallyLR implicit $w0
37...
38---
39name:            add_vector_eq
40tracksRegLiveness: true
41body:             |
42  bb.0:
43    liveins: $q0, $q1
44    ; CHECK-LABEL: name: add_vector_eq
45    ; CHECK: liveins: $q0, $q1
46    ; CHECK-NEXT: {{  $}}
47    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
48    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
49    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
50    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
51    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
52    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
53    ; CHECK-NEXT: RET_ReallyLR implicit $d0
54    %x:_(<4 x s32>) = COPY $q0
55    %y:_(<4 x s32>) = COPY $q1
56    %op:_(<4 x s32>) = G_ADD %x, %y
57    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %op(<4 x s32>), %x
58    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
59    $d0 = COPY %ext(<4 x s16>)
60    RET_ReallyLR implicit $d0
61...
62---
63name:            add_scalar_eq_commuted_in_op
64tracksRegLiveness: true
65body:             |
66  bb.0:
67    liveins: $w0, $w1
68    ; CHECK-LABEL: name: add_scalar_eq_commuted_in_op
69    ; CHECK: liveins: $w0, $w1
70    ; CHECK-NEXT: {{  $}}
71    ; CHECK-NEXT: %y:_(s32) = COPY $w1
72    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
73    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
74    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
75    ; CHECK-NEXT: $w0 = COPY %ext(s32)
76    ; CHECK-NEXT: RET_ReallyLR implicit $w0
77    %x:_(s32) = COPY $w0
78    %y:_(s32) = COPY $w1
79    %op:_(s32) = G_ADD %y, %x
80    %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %x
81    %ext:_(s32) = G_ZEXT %cmp(s1)
82    $w0 = COPY %ext(s32)
83    RET_ReallyLR implicit $w0
84...
85---
86name:            add_vector_eq_commuted_in_op
87tracksRegLiveness: true
88body:             |
89  bb.0:
90    liveins: $q0, $q1
91    ; CHECK-LABEL: name: add_vector_eq_commuted_in_op
92    ; CHECK: liveins: $q0, $q1
93    ; CHECK-NEXT: {{  $}}
94    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
95    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
96    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
97    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
98    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
99    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
100    ; CHECK-NEXT: RET_ReallyLR implicit $d0
101    %x:_(<4 x s32>) = COPY $q0
102    %y:_(<4 x s32>) = COPY $q1
103    %op:_(<4 x s32>) = G_ADD %y, %x
104    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %op(<4 x s32>), %x
105    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
106    $d0 = COPY %ext(<4 x s16>)
107    RET_ReallyLR implicit $d0
108...
109---
110name:            add_scalar_eq_commuted_in_cmp
111tracksRegLiveness: true
112body:             |
113  bb.0:
114    liveins: $w0, $w1
115    ; CHECK-LABEL: name: add_scalar_eq_commuted_in_cmp
116    ; CHECK: liveins: $w0, $w1
117    ; CHECK-NEXT: {{  $}}
118    ; CHECK-NEXT: %y:_(s32) = COPY $w1
119    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
120    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
121    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
122    ; CHECK-NEXT: $w0 = COPY %ext(s32)
123    ; CHECK-NEXT: RET_ReallyLR implicit $w0
124    %x:_(s32) = COPY $w0
125    %y:_(s32) = COPY $w1
126    %op:_(s32) = G_ADD %x, %y
127    %cmp:_(s1) = G_ICMP intpred(eq), %x(s32), %op
128    %ext:_(s32) = G_ZEXT %cmp(s1)
129    $w0 = COPY %ext(s32)
130    RET_ReallyLR implicit $w0
131...
132---
133name:            add_vector_eq_commuted_in_cmp
134tracksRegLiveness: true
135body:             |
136  bb.0:
137    liveins: $q0, $q1
138    ; CHECK-LABEL: name: add_vector_eq_commuted_in_cmp
139    ; CHECK: liveins: $q0, $q1
140    ; CHECK-NEXT: {{  $}}
141    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
142    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
143    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
144    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
145    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
146    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
147    ; CHECK-NEXT: RET_ReallyLR implicit $d0
148    %x:_(<4 x s32>) = COPY $q0
149    %y:_(<4 x s32>) = COPY $q1
150    %op:_(<4 x s32>) = G_ADD %x, %y
151    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %x(<4 x s32>), %op
152    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
153    $d0 = COPY %ext(<4 x s16>)
154    RET_ReallyLR implicit $d0
155...
156---
157name:            xor_scalar_eq
158tracksRegLiveness: true
159body:             |
160  bb.0:
161    liveins: $w0, $w1
162    ; CHECK-LABEL: name: xor_scalar_eq
163    ; CHECK: liveins: $w0, $w1
164    ; CHECK-NEXT: {{  $}}
165    ; CHECK-NEXT: %y:_(s32) = COPY $w1
166    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
167    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
168    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
169    ; CHECK-NEXT: $w0 = COPY %ext(s32)
170    ; CHECK-NEXT: RET_ReallyLR implicit $w0
171    %x:_(s32) = COPY $w0
172    %y:_(s32) = COPY $w1
173    %op:_(s32) = G_XOR %x, %y
174    %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %x
175    %ext:_(s32) = G_ZEXT %cmp(s1)
176    $w0 = COPY %ext(s32)
177    RET_ReallyLR implicit $w0
178...
179---
180name:            xor_vector_eq
181tracksRegLiveness: true
182body:             |
183  bb.0:
184    liveins: $q0, $q1
185    ; CHECK-LABEL: name: xor_vector_eq
186    ; CHECK: liveins: $q0, $q1
187    ; CHECK-NEXT: {{  $}}
188    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
189    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
190    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
191    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
192    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
193    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
194    ; CHECK-NEXT: RET_ReallyLR implicit $d0
195    %x:_(<4 x s32>) = COPY $q0
196    %y:_(<4 x s32>) = COPY $q1
197    %op:_(<4 x s32>) = G_XOR %x, %y
198    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %op(<4 x s32>), %x
199    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
200    $d0 = COPY %ext(<4 x s16>)
201    RET_ReallyLR implicit $d0
202...
203---
204name:            xor_scalar_eq_commuted_in_op
205tracksRegLiveness: true
206body:             |
207  bb.0:
208    liveins: $w0, $w1
209    ; CHECK-LABEL: name: xor_scalar_eq_commuted_in_op
210    ; CHECK: liveins: $w0, $w1
211    ; CHECK-NEXT: {{  $}}
212    ; CHECK-NEXT: %y:_(s32) = COPY $w1
213    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
214    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
215    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
216    ; CHECK-NEXT: $w0 = COPY %ext(s32)
217    ; CHECK-NEXT: RET_ReallyLR implicit $w0
218    %x:_(s32) = COPY $w0
219    %y:_(s32) = COPY $w1
220    %op:_(s32) = G_XOR %y, %x
221    %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %x
222    %ext:_(s32) = G_ZEXT %cmp(s1)
223    $w0 = COPY %ext(s32)
224    RET_ReallyLR implicit $w0
225...
226---
227name:            xor_vector_eq_commuted_in_op
228tracksRegLiveness: true
229body:             |
230  bb.0:
231    liveins: $q0, $q1
232    ; CHECK-LABEL: name: xor_vector_eq_commuted_in_op
233    ; CHECK: liveins: $q0, $q1
234    ; CHECK-NEXT: {{  $}}
235    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
236    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
237    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
238    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
239    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
240    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
241    ; CHECK-NEXT: RET_ReallyLR implicit $d0
242    %x:_(<4 x s32>) = COPY $q0
243    %y:_(<4 x s32>) = COPY $q1
244    %op:_(<4 x s32>) = G_XOR %y, %x
245    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %op(<4 x s32>), %x
246    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
247    $d0 = COPY %ext(<4 x s16>)
248    RET_ReallyLR implicit $d0
249...
250---
251name:            xor_scalar_eq_commuted_in_cmp
252tracksRegLiveness: true
253body:             |
254  bb.0:
255    liveins: $w0, $w1
256    ; CHECK-LABEL: name: xor_scalar_eq_commuted_in_cmp
257    ; CHECK: liveins: $w0, $w1
258    ; CHECK-NEXT: {{  $}}
259    ; CHECK-NEXT: %y:_(s32) = COPY $w1
260    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
261    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
262    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
263    ; CHECK-NEXT: $w0 = COPY %ext(s32)
264    ; CHECK-NEXT: RET_ReallyLR implicit $w0
265    %x:_(s32) = COPY $w0
266    %y:_(s32) = COPY $w1
267    %op:_(s32) = G_XOR %x, %y
268    %cmp:_(s1) = G_ICMP intpred(eq), %x(s32), %op
269    %ext:_(s32) = G_ZEXT %cmp(s1)
270    $w0 = COPY %ext(s32)
271    RET_ReallyLR implicit $w0
272...
273---
274name:            xor_vector_eq_commuted_in_cmp
275tracksRegLiveness: true
276body:             |
277  bb.0:
278    liveins: $q0, $q1
279    ; CHECK-LABEL: name: xor_vector_eq_commuted_in_cmp
280    ; CHECK: liveins: $q0, $q1
281    ; CHECK-NEXT: {{  $}}
282    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
283    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
284    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
285    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
286    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
287    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
288    ; CHECK-NEXT: RET_ReallyLR implicit $d0
289    %x:_(<4 x s32>) = COPY $q0
290    %y:_(<4 x s32>) = COPY $q1
291    %op:_(<4 x s32>) = G_XOR %x, %y
292    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %x(<4 x s32>), %op
293    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
294    $d0 = COPY %ext(<4 x s16>)
295    RET_ReallyLR implicit $d0
296...
297---
298name:            sub_scalar_eq
299tracksRegLiveness: true
300body:             |
301  bb.0:
302    liveins: $w0, $w1
303    ; CHECK-LABEL: name: sub_scalar_eq
304    ; CHECK: liveins: $w0, $w1
305    ; CHECK-NEXT: {{  $}}
306    ; CHECK-NEXT: %y:_(s32) = COPY $w1
307    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
308    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
309    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
310    ; CHECK-NEXT: $w0 = COPY %ext(s32)
311    ; CHECK-NEXT: RET_ReallyLR implicit $w0
312    %x:_(s32) = COPY $w0
313    %y:_(s32) = COPY $w1
314    %op:_(s32) = G_SUB %x, %y
315    %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %x
316    %ext:_(s32) = G_ZEXT %cmp(s1)
317    $w0 = COPY %ext(s32)
318    RET_ReallyLR implicit $w0
319...
320---
321name:            sub_vector_eq
322tracksRegLiveness: true
323body:             |
324  bb.0:
325    liveins: $q0, $q1
326    ; CHECK-LABEL: name: sub_vector_eq
327    ; CHECK: liveins: $q0, $q1
328    ; CHECK-NEXT: {{  $}}
329    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
330    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
331    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
332    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
333    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
334    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
335    ; CHECK-NEXT: RET_ReallyLR implicit $d0
336    %x:_(<4 x s32>) = COPY $q0
337    %y:_(<4 x s32>) = COPY $q1
338    %op:_(<4 x s32>) = G_SUB %x, %y
339    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %op(<4 x s32>), %x
340    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
341    $d0 = COPY %ext(<4 x s16>)
342    RET_ReallyLR implicit $d0
343...
344---
345name:            sub_scalar_eq_commuted_in_cmp
346tracksRegLiveness: true
347body:             |
348  bb.0:
349    liveins: $w0, $w1
350    ; CHECK-LABEL: name: sub_scalar_eq_commuted_in_cmp
351    ; CHECK: liveins: $w0, $w1
352    ; CHECK-NEXT: {{  $}}
353    ; CHECK-NEXT: %y:_(s32) = COPY $w1
354    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
355    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %y(s32), [[C]]
356    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
357    ; CHECK-NEXT: $w0 = COPY %ext(s32)
358    ; CHECK-NEXT: RET_ReallyLR implicit $w0
359    %x:_(s32) = COPY $w0
360    %y:_(s32) = COPY $w1
361    %op:_(s32) = G_SUB %x, %y
362    %cmp:_(s1) = G_ICMP intpred(eq), %x(s32), %op
363    %ext:_(s32) = G_ZEXT %cmp(s1)
364    $w0 = COPY %ext(s32)
365    RET_ReallyLR implicit $w0
366...
367---
368name:            sub_vector_eq_commuted_in_cmp
369tracksRegLiveness: true
370body:             |
371  bb.0:
372    liveins: $q0, $q1
373    ; CHECK-LABEL: name: sub_vector_eq_commuted_in_cmp
374    ; CHECK: liveins: $q0, $q1
375    ; CHECK-NEXT: {{  $}}
376    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
377    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
378    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
379    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %y(<4 x s32>), [[BUILD_VECTOR]]
380    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
381    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
382    ; CHECK-NEXT: RET_ReallyLR implicit $d0
383    %x:_(<4 x s32>) = COPY $q0
384    %y:_(<4 x s32>) = COPY $q1
385    %op:_(<4 x s32>) = G_SUB %x, %y
386    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %x(<4 x s32>), %op
387    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
388    $d0 = COPY %ext(<4 x s16>)
389    RET_ReallyLR implicit $d0
390...
391---
392name:            add_scalar_ne
393tracksRegLiveness: true
394body:             |
395  bb.0:
396    liveins: $w0, $w1
397    ; CHECK-LABEL: name: add_scalar_ne
398    ; CHECK: liveins: $w0, $w1
399    ; CHECK-NEXT: {{  $}}
400    ; CHECK-NEXT: %y:_(s32) = COPY $w1
401    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
402    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
403    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
404    ; CHECK-NEXT: $w0 = COPY %ext(s32)
405    ; CHECK-NEXT: RET_ReallyLR implicit $w0
406    %x:_(s32) = COPY $w0
407    %y:_(s32) = COPY $w1
408    %op:_(s32) = G_ADD %x, %y
409    %cmp:_(s1) = G_ICMP intpred(ne), %op(s32), %x
410    %ext:_(s32) = G_ZEXT %cmp(s1)
411    $w0 = COPY %ext(s32)
412    RET_ReallyLR implicit $w0
413...
414---
415name:            add_vector_ne
416tracksRegLiveness: true
417body:             |
418  bb.0:
419    liveins: $q0, $q1
420    ; CHECK-LABEL: name: add_vector_ne
421    ; CHECK: liveins: $q0, $q1
422    ; CHECK-NEXT: {{  $}}
423    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
424    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
425    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
426    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
427    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
428    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
429    ; CHECK-NEXT: RET_ReallyLR implicit $d0
430    %x:_(<4 x s32>) = COPY $q0
431    %y:_(<4 x s32>) = COPY $q1
432    %op:_(<4 x s32>) = G_ADD %x, %y
433    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %op(<4 x s32>), %x
434    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
435    $d0 = COPY %ext(<4 x s16>)
436    RET_ReallyLR implicit $d0
437...
438---
439name:            add_scalar_ne_commuted_in_op
440tracksRegLiveness: true
441body:             |
442  bb.0:
443    liveins: $w0, $w1
444    ; CHECK-LABEL: name: add_scalar_ne_commuted_in_op
445    ; CHECK: liveins: $w0, $w1
446    ; CHECK-NEXT: {{  $}}
447    ; CHECK-NEXT: %y:_(s32) = COPY $w1
448    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
449    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
450    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
451    ; CHECK-NEXT: $w0 = COPY %ext(s32)
452    ; CHECK-NEXT: RET_ReallyLR implicit $w0
453    %x:_(s32) = COPY $w0
454    %y:_(s32) = COPY $w1
455    %op:_(s32) = G_ADD %y, %x
456    %cmp:_(s1) = G_ICMP intpred(ne), %op(s32), %x
457    %ext:_(s32) = G_ZEXT %cmp(s1)
458    $w0 = COPY %ext(s32)
459    RET_ReallyLR implicit $w0
460...
461---
462name:            add_vector_ne_commuted_in_op
463tracksRegLiveness: true
464body:             |
465  bb.0:
466    liveins: $q0, $q1
467    ; CHECK-LABEL: name: add_vector_ne_commuted_in_op
468    ; CHECK: liveins: $q0, $q1
469    ; CHECK-NEXT: {{  $}}
470    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
471    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
472    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
473    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
474    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
475    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
476    ; CHECK-NEXT: RET_ReallyLR implicit $d0
477    %x:_(<4 x s32>) = COPY $q0
478    %y:_(<4 x s32>) = COPY $q1
479    %op:_(<4 x s32>) = G_ADD %y, %x
480    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %op(<4 x s32>), %x
481    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
482    $d0 = COPY %ext(<4 x s16>)
483    RET_ReallyLR implicit $d0
484...
485---
486name:            add_scalar_ne_commuted_in_cmp
487tracksRegLiveness: true
488body:             |
489  bb.0:
490    liveins: $w0, $w1
491    ; CHECK-LABEL: name: add_scalar_ne_commuted_in_cmp
492    ; CHECK: liveins: $w0, $w1
493    ; CHECK-NEXT: {{  $}}
494    ; CHECK-NEXT: %y:_(s32) = COPY $w1
495    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
496    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
497    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
498    ; CHECK-NEXT: $w0 = COPY %ext(s32)
499    ; CHECK-NEXT: RET_ReallyLR implicit $w0
500    %x:_(s32) = COPY $w0
501    %y:_(s32) = COPY $w1
502    %op:_(s32) = G_ADD %x, %y
503    %cmp:_(s1) = G_ICMP intpred(ne), %x(s32), %op
504    %ext:_(s32) = G_ZEXT %cmp(s1)
505    $w0 = COPY %ext(s32)
506    RET_ReallyLR implicit $w0
507...
508---
509name:            add_vector_ne_commuted_in_cmp
510tracksRegLiveness: true
511body:             |
512  bb.0:
513    liveins: $q0, $q1
514    ; CHECK-LABEL: name: add_vector_ne_commuted_in_cmp
515    ; CHECK: liveins: $q0, $q1
516    ; CHECK-NEXT: {{  $}}
517    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
518    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
519    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
520    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
521    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
522    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
523    ; CHECK-NEXT: RET_ReallyLR implicit $d0
524    %x:_(<4 x s32>) = COPY $q0
525    %y:_(<4 x s32>) = COPY $q1
526    %op:_(<4 x s32>) = G_ADD %x, %y
527    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %x(<4 x s32>), %op
528    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
529    $d0 = COPY %ext(<4 x s16>)
530    RET_ReallyLR implicit $d0
531...
532---
533name:            xor_scalar_ne
534tracksRegLiveness: true
535body:             |
536  bb.0:
537    liveins: $w0, $w1
538    ; CHECK-LABEL: name: xor_scalar_ne
539    ; CHECK: liveins: $w0, $w1
540    ; CHECK-NEXT: {{  $}}
541    ; CHECK-NEXT: %y:_(s32) = COPY $w1
542    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
543    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
544    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
545    ; CHECK-NEXT: $w0 = COPY %ext(s32)
546    ; CHECK-NEXT: RET_ReallyLR implicit $w0
547    %x:_(s32) = COPY $w0
548    %y:_(s32) = COPY $w1
549    %op:_(s32) = G_XOR %x, %y
550    %cmp:_(s1) = G_ICMP intpred(ne), %op(s32), %x
551    %ext:_(s32) = G_ZEXT %cmp(s1)
552    $w0 = COPY %ext(s32)
553    RET_ReallyLR implicit $w0
554...
555---
556name:            xor_vector_ne
557tracksRegLiveness: true
558body:             |
559  bb.0:
560    liveins: $q0, $q1
561    ; CHECK-LABEL: name: xor_vector_ne
562    ; CHECK: liveins: $q0, $q1
563    ; CHECK-NEXT: {{  $}}
564    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
565    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
566    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
567    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
568    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
569    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
570    ; CHECK-NEXT: RET_ReallyLR implicit $d0
571    %x:_(<4 x s32>) = COPY $q0
572    %y:_(<4 x s32>) = COPY $q1
573    %op:_(<4 x s32>) = G_XOR %x, %y
574    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %op(<4 x s32>), %x
575    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
576    $d0 = COPY %ext(<4 x s16>)
577    RET_ReallyLR implicit $d0
578...
579---
580name:            xor_scalar_ne_commuted_in_op
581tracksRegLiveness: true
582body:             |
583  bb.0:
584    liveins: $w0, $w1
585    ; CHECK-LABEL: name: xor_scalar_ne_commuted_in_op
586    ; CHECK: liveins: $w0, $w1
587    ; CHECK-NEXT: {{  $}}
588    ; CHECK-NEXT: %y:_(s32) = COPY $w1
589    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
590    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
591    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
592    ; CHECK-NEXT: $w0 = COPY %ext(s32)
593    ; CHECK-NEXT: RET_ReallyLR implicit $w0
594    %x:_(s32) = COPY $w0
595    %y:_(s32) = COPY $w1
596    %op:_(s32) = G_XOR %y, %x
597    %cmp:_(s1) = G_ICMP intpred(ne), %op(s32), %x
598    %ext:_(s32) = G_ZEXT %cmp(s1)
599    $w0 = COPY %ext(s32)
600    RET_ReallyLR implicit $w0
601...
602---
603name:            xor_vector_ne_commuted_in_op
604tracksRegLiveness: true
605body:             |
606  bb.0:
607    liveins: $q0, $q1
608    ; CHECK-LABEL: name: xor_vector_ne_commuted_in_op
609    ; CHECK: liveins: $q0, $q1
610    ; CHECK-NEXT: {{  $}}
611    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
612    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
613    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
614    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
615    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
616    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
617    ; CHECK-NEXT: RET_ReallyLR implicit $d0
618    %x:_(<4 x s32>) = COPY $q0
619    %y:_(<4 x s32>) = COPY $q1
620    %op:_(<4 x s32>) = G_XOR %y, %x
621    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %op(<4 x s32>), %x
622    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
623    $d0 = COPY %ext(<4 x s16>)
624    RET_ReallyLR implicit $d0
625...
626---
627name:            xor_scalar_ne_commuted_in_cmp
628tracksRegLiveness: true
629body:             |
630  bb.0:
631    liveins: $w0, $w1
632    ; CHECK-LABEL: name: xor_scalar_ne_commuted_in_cmp
633    ; CHECK: liveins: $w0, $w1
634    ; CHECK-NEXT: {{  $}}
635    ; CHECK-NEXT: %y:_(s32) = COPY $w1
636    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
637    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
638    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
639    ; CHECK-NEXT: $w0 = COPY %ext(s32)
640    ; CHECK-NEXT: RET_ReallyLR implicit $w0
641    %x:_(s32) = COPY $w0
642    %y:_(s32) = COPY $w1
643    %op:_(s32) = G_XOR %x, %y
644    %cmp:_(s1) = G_ICMP intpred(ne), %x(s32), %op
645    %ext:_(s32) = G_ZEXT %cmp(s1)
646    $w0 = COPY %ext(s32)
647    RET_ReallyLR implicit $w0
648...
649---
650name:            xor_vector_ne_commuted_in_cmp
651tracksRegLiveness: true
652body:             |
653  bb.0:
654    liveins: $q0, $q1
655    ; CHECK-LABEL: name: xor_vector_ne_commuted_in_cmp
656    ; CHECK: liveins: $q0, $q1
657    ; CHECK-NEXT: {{  $}}
658    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
659    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
660    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
661    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
662    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
663    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
664    ; CHECK-NEXT: RET_ReallyLR implicit $d0
665    %x:_(<4 x s32>) = COPY $q0
666    %y:_(<4 x s32>) = COPY $q1
667    %op:_(<4 x s32>) = G_XOR %x, %y
668    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %x(<4 x s32>), %op
669    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
670    $d0 = COPY %ext(<4 x s16>)
671    RET_ReallyLR implicit $d0
672...
673---
674name:            sub_scalar_ne
675tracksRegLiveness: true
676body:             |
677  bb.0:
678    liveins: $w0, $w1
679    ; CHECK-LABEL: name: sub_scalar_ne
680    ; CHECK: liveins: $w0, $w1
681    ; CHECK-NEXT: {{  $}}
682    ; CHECK-NEXT: %y:_(s32) = COPY $w1
683    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
684    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
685    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
686    ; CHECK-NEXT: $w0 = COPY %ext(s32)
687    ; CHECK-NEXT: RET_ReallyLR implicit $w0
688    %x:_(s32) = COPY $w0
689    %y:_(s32) = COPY $w1
690    %op:_(s32) = G_SUB %x, %y
691    %cmp:_(s1) = G_ICMP intpred(ne), %op(s32), %x
692    %ext:_(s32) = G_ZEXT %cmp(s1)
693    $w0 = COPY %ext(s32)
694    RET_ReallyLR implicit $w0
695...
696---
697name:            sub_vector_ne
698tracksRegLiveness: true
699body:             |
700  bb.0:
701    liveins: $q0, $q1
702    ; CHECK-LABEL: name: sub_vector_ne
703    ; CHECK: liveins: $q0, $q1
704    ; CHECK-NEXT: {{  $}}
705    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
706    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
707    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
708    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
709    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
710    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
711    ; CHECK-NEXT: RET_ReallyLR implicit $d0
712    %x:_(<4 x s32>) = COPY $q0
713    %y:_(<4 x s32>) = COPY $q1
714    %op:_(<4 x s32>) = G_SUB %x, %y
715    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %op(<4 x s32>), %x
716    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
717    $d0 = COPY %ext(<4 x s16>)
718    RET_ReallyLR implicit $d0
719...
720---
721name:            sub_scalar_ne_commuted_in_cmp
722tracksRegLiveness: true
723body:             |
724  bb.0:
725    liveins: $w0, $w1
726    ; CHECK-LABEL: name: sub_scalar_ne_commuted_in_cmp
727    ; CHECK: liveins: $w0, $w1
728    ; CHECK-NEXT: {{  $}}
729    ; CHECK-NEXT: %y:_(s32) = COPY $w1
730    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
731    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(ne), %y(s32), [[C]]
732    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
733    ; CHECK-NEXT: $w0 = COPY %ext(s32)
734    ; CHECK-NEXT: RET_ReallyLR implicit $w0
735    %x:_(s32) = COPY $w0
736    %y:_(s32) = COPY $w1
737    %op:_(s32) = G_SUB %x, %y
738    %cmp:_(s1) = G_ICMP intpred(ne), %x(s32), %op
739    %ext:_(s32) = G_ZEXT %cmp(s1)
740    $w0 = COPY %ext(s32)
741    RET_ReallyLR implicit $w0
742...
743---
744name:            sub_vector_ne_commuted_in_cmp
745tracksRegLiveness: true
746body:             |
747  bb.0:
748    liveins: $q0, $q1
749    ; CHECK-LABEL: name: sub_vector_ne_commuted_in_cmp
750    ; CHECK: liveins: $q0, $q1
751    ; CHECK-NEXT: {{  $}}
752    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
753    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
754    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
755    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %y(<4 x s32>), [[BUILD_VECTOR]]
756    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
757    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
758    ; CHECK-NEXT: RET_ReallyLR implicit $d0
759    %x:_(<4 x s32>) = COPY $q0
760    %y:_(<4 x s32>) = COPY $q1
761    %op:_(<4 x s32>) = G_SUB %x, %y
762    %cmp:_(<4 x s1>) = G_ICMP intpred(ne), %x(<4 x s32>), %op
763    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
764    $d0 = COPY %ext(<4 x s16>)
765    RET_ReallyLR implicit $d0
766...
767---
768name:            dont_combine_sub_scalar_eq_commuted_in_op
769tracksRegLiveness: true
770body:             |
771  bb.0:
772    liveins: $w0, $w1
773    ; CHECK-LABEL: name: dont_combine_sub_scalar_eq_commuted_in_op
774    ; CHECK: liveins: $w0, $w1
775    ; CHECK-NEXT: {{  $}}
776    ; CHECK-NEXT: %x:_(s32) = COPY $w0
777    ; CHECK-NEXT: %y:_(s32) = COPY $w1
778    ; CHECK-NEXT: %op:_(s32) = G_SUB %y, %x
779    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %x
780    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
781    ; CHECK-NEXT: $w0 = COPY %ext(s32)
782    ; CHECK-NEXT: RET_ReallyLR implicit $w0
783    %x:_(s32) = COPY $w0
784    %y:_(s32) = COPY $w1
785    %op:_(s32) = G_SUB %y, %x
786    %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %x
787    %ext:_(s32) = G_ZEXT %cmp(s1)
788    $w0 = COPY %ext(s32)
789    RET_ReallyLR implicit $w0
790...
791---
792name:            dont_combine_sub_vector_eq_commuted_in_op
793tracksRegLiveness: true
794body:             |
795  bb.0:
796    liveins: $q0, $q1
797    ; CHECK-LABEL: name: dont_combine_sub_vector_eq_commuted_in_op
798    ; CHECK: liveins: $q0, $q1
799    ; CHECK-NEXT: {{  $}}
800    ; CHECK-NEXT: %x:_(<4 x s32>) = COPY $q0
801    ; CHECK-NEXT: %y:_(<4 x s32>) = COPY $q1
802    ; CHECK-NEXT: %op:_(<4 x s32>) = G_SUB %y, %x
803    ; CHECK-NEXT: %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %op(<4 x s32>), %x
804    ; CHECK-NEXT: %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
805    ; CHECK-NEXT: $d0 = COPY %ext(<4 x s16>)
806    ; CHECK-NEXT: RET_ReallyLR implicit $d0
807    %x:_(<4 x s32>) = COPY $q0
808    %y:_(<4 x s32>) = COPY $q1
809    %op:_(<4 x s32>) = G_SUB %y, %x
810    %cmp:_(<4 x s1>) = G_ICMP intpred(eq), %op(<4 x s32>), %x
811    %ext:_(<4 x s16>) = G_ANYEXT %cmp(<4 x s1>)
812    $d0 = COPY %ext(<4 x s16>)
813    RET_ReallyLR implicit $d0
814...
815---
816name:            dont_combine_not_equality
817tracksRegLiveness: true
818body:             |
819  bb.0:
820    liveins: $w0, $w1
821    ; CHECK-LABEL: name: dont_combine_not_equality
822    ; CHECK: liveins: $w0, $w1
823    ; CHECK-NEXT: {{  $}}
824    ; CHECK-NEXT: %x:_(s32) = COPY $w0
825    ; CHECK-NEXT: %y:_(s32) = COPY $w1
826    ; CHECK-NEXT: %op:_(s32) = G_ADD %x, %y
827    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(slt), %op(s32), %x
828    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
829    ; CHECK-NEXT: $w0 = COPY %ext(s32)
830    ; CHECK-NEXT: RET_ReallyLR implicit $w0
831    %x:_(s32) = COPY $w0
832    %y:_(s32) = COPY $w1
833    %op:_(s32) = G_ADD %x, %y
834    %cmp:_(s1) = G_ICMP intpred(slt), %op(s32), %x
835    %ext:_(s32) = G_ZEXT %cmp(s1)
836    $w0 = COPY %ext(s32)
837    RET_ReallyLR implicit $w0
838...
839---
840name:            dont_combine_unique_operands
841tracksRegLiveness: true
842body:             |
843  bb.0:
844    liveins: $w0, $w1, $w2
845    ; CHECK-LABEL: name: dont_combine_unique_operands
846    ; CHECK: liveins: $w0, $w1, $w2
847    ; CHECK-NEXT: {{  $}}
848    ; CHECK-NEXT: %x:_(s32) = COPY $w0
849    ; CHECK-NEXT: %y:_(s32) = COPY $w1
850    ; CHECK-NEXT: %z:_(s32) = COPY $w2
851    ; CHECK-NEXT: %op:_(s32) = G_ADD %x, %y
852    ; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %z
853    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %cmp(s1)
854    ; CHECK-NEXT: $w0 = COPY %ext(s32)
855    ; CHECK-NEXT: RET_ReallyLR implicit $w0
856    %x:_(s32) = COPY $w0
857    %y:_(s32) = COPY $w1
858    %z:_(s32) = COPY $w2
859    %op:_(s32) = G_ADD %x, %y
860    %cmp:_(s1) = G_ICMP intpred(eq), %op(s32), %z
861    %ext:_(s32) = G_ZEXT %cmp(s1)
862    $w0 = COPY %ext(s32)
863    RET_ReallyLR implicit $w0
864