[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / combine-add-of-sub.mir
blobac42d2da16d5696de7349a6c859e255746236db8
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
4 ...
5 ---
6 name:            simplify_to_x
7 tracksRegLiveness: true
8 body:             |
9   bb.0:
10     liveins: $w0, $w1
11     ; (x + y) - y -> x
12     ; CHECK-LABEL: name: simplify_to_x
13     ; CHECK: liveins: $w0, $w1
14     ; CHECK-NEXT: {{  $}}
15     ; CHECK-NEXT: %x:_(s32) = COPY $w0
16     ; CHECK-NEXT: $w0 = COPY %x(s32)
17     ; CHECK-NEXT: RET_ReallyLR implicit $w0
18     %x:_(s32) = COPY $w0
19     %y:_(s32) = COPY $w1
20     %add:_(s32) = G_ADD %x, %y
21     %sub:_(s32) = G_SUB %add, %y
22     $w0 = COPY %sub(s32)
23     RET_ReallyLR implicit $w0
24 ...
25 ---
26 name:            simplify_to_y
27 tracksRegLiveness: true
28 body:             |
29   bb.0:
30     liveins: $w0, $w1
31     ; (x + y) - x -> y
32     ; CHECK-LABEL: name: simplify_to_y
33     ; CHECK: liveins: $w0, $w1
34     ; CHECK-NEXT: {{  $}}
35     ; CHECK-NEXT: %y:_(s32) = COPY $w1
36     ; CHECK-NEXT: $w0 = COPY %y(s32)
37     ; CHECK-NEXT: RET_ReallyLR implicit $w0
38     %x:_(s32) = COPY $w0
39     %y:_(s32) = COPY $w1
40     %add:_(s32) = G_ADD %x, %y
41     %sub:_(s32) = G_SUB %add, %x
42     $w0 = COPY %sub(s32)
43     RET_ReallyLR implicit $w0
44 ...
45 ---
46 name:            simplify_to_constant_x
47 tracksRegLiveness: true
48 body:             |
49   bb.0:
50     liveins: $w0, $w1
51     ; (x + 1) - 1 -> x
52     ; CHECK-LABEL: name: simplify_to_constant_x
53     ; CHECK: liveins: $w0, $w1
54     ; CHECK-NEXT: {{  $}}
55     ; CHECK-NEXT: %x:_(s32) = COPY $w0
56     ; CHECK-NEXT: $w0 = COPY %x(s32)
57     ; CHECK-NEXT: RET_ReallyLR implicit $w0
58     %x:_(s32) = COPY $w0
59     %y1:_(s32) = G_CONSTANT i32 1
60     %y2:_(s32) = G_CONSTANT i32 1
61     %add:_(s32) = G_ADD %x, %y1
62     %sub:_(s32) = G_SUB %add, %y2
63     $w0 = COPY %sub(s32)
64     RET_ReallyLR implicit $w0
65 ...
66 ---
67 name:            simplify_to_constant_y
68 tracksRegLiveness: true
69 body:             |
70   bb.0:
71     liveins: $w0, $w1
72     ; (x + y) - x -> y
73     ; CHECK-LABEL: name: simplify_to_constant_y
74     ; CHECK: liveins: $w0, $w1
75     ; CHECK-NEXT: {{  $}}
76     ; CHECK-NEXT: %y:_(s32) = COPY $w1
77     ; CHECK-NEXT: $w0 = COPY %y(s32)
78     ; CHECK-NEXT: RET_ReallyLR implicit $w0
79     %x1:_(s32) = G_CONSTANT i32 1
80     %x2:_(s32) = G_CONSTANT i32 1
81     %y:_(s32) = COPY $w1
82     %add:_(s32) = G_ADD %x1, %y
83     %sub:_(s32) = G_SUB %add, %x2
84     $w0 = COPY %sub(s32)
85     RET_ReallyLR implicit $w0
86 ...
87 ---
88 name:            vector_simplify_to_x
89 tracksRegLiveness: true
90 body:             |
91   bb.0:
92     liveins: $d0, $d1
93     ; (x + y) - y -> x
94     ; CHECK-LABEL: name: vector_simplify_to_x
95     ; CHECK: liveins: $d0, $d1
96     ; CHECK-NEXT: {{  $}}
97     ; CHECK-NEXT: %x:_(<2 x s32>) = COPY $d0
98     ; CHECK-NEXT: $d0 = COPY %x(<2 x s32>)
99     ; CHECK-NEXT: RET_ReallyLR implicit $d0
100     %x:_(<2 x s32>) = COPY $d0
101     %y:_(<2 x s32>) = COPY $d1
102     %add:_(<2 x s32>) = G_ADD %x, %y
103     %sub:_(<2 x s32>) = G_SUB %add, %y
104     $d0 = COPY %sub(<2 x s32>)
105     RET_ReallyLR implicit $d0
108 name:            splat_simplify_to_x
109 tracksRegLiveness: true
110 body:             |
111   bb.0:
112     liveins: $d0, $d1
113     ; (x + 1) - 1 -> x
114     ; CHECK-LABEL: name: splat_simplify_to_x
115     ; CHECK: liveins: $d0, $d1
116     ; CHECK-NEXT: {{  $}}
117     ; CHECK-NEXT: %x:_(<2 x s32>) = COPY $d0
118     ; CHECK-NEXT: $d0 = COPY %x(<2 x s32>)
119     ; CHECK-NEXT: RET_ReallyLR implicit $d0
120     %x:_(<2 x s32>) = COPY $d0
121     %cst:_(s32) = G_CONSTANT i32 1
122     %y1:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
123     %y2:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
124     %add:_(<2 x s32>) = G_ADD %x, %y1
125     %sub:_(<2 x s32>) = G_SUB %add, %y2
126     $d0 = COPY %sub(<2 x s32>)
127     RET_ReallyLR implicit $d0
130 name:            unique_registers_no_fold
131 tracksRegLiveness: true
132 body:             |
133   bb.0:
134     liveins: $w0, $w1, $w2
135     ; CHECK-LABEL: name: unique_registers_no_fold
136     ; CHECK: liveins: $w0, $w1, $w2
137     ; CHECK-NEXT: {{  $}}
138     ; CHECK-NEXT: %x:_(s32) = COPY $w0
139     ; CHECK-NEXT: %y:_(s32) = COPY $w1
140     ; CHECK-NEXT: %z:_(s32) = COPY $w2
141     ; CHECK-NEXT: %add:_(s32) = G_ADD %y, %x
142     ; CHECK-NEXT: %sub:_(s32) = G_SUB %add, %z
143     ; CHECK-NEXT: $w0 = COPY %sub(s32)
144     ; CHECK-NEXT: RET_ReallyLR implicit $w0
145     %x:_(s32) = COPY $w0
146     %y:_(s32) = COPY $w1
147     %z:_(s32) = COPY $w2
148     %add:_(s32) = G_ADD %y, %x
149     %sub:_(s32) = G_SUB %add, %z
150     $w0 = COPY %sub(s32)
151     RET_ReallyLR implicit $w0
154 name:            unique_constants_no_fold
155 tracksRegLiveness: true
156 body:             |
157   bb.0:
158     liveins: $w0, $w1
159     ; (x + y) - x -> y
160     ; CHECK-LABEL: name: unique_constants_no_fold
161     ; CHECK: liveins: $w0, $w1
162     ; CHECK-NEXT: {{  $}}
163     ; CHECK-NEXT: %x1:_(s32) = G_CONSTANT i32 1
164     ; CHECK-NEXT: %x2:_(s32) = G_CONSTANT i32 2
165     ; CHECK-NEXT: %y:_(s32) = COPY $w1
166     ; CHECK-NEXT: %add:_(s32) = G_ADD %y, %x1
167     ; CHECK-NEXT: %sub:_(s32) = G_SUB %add, %x2
168     ; CHECK-NEXT: $w0 = COPY %sub(s32)
169     ; CHECK-NEXT: RET_ReallyLR implicit $w0
170     %x1:_(s32) = G_CONSTANT i32 1
171     %x2:_(s32) = G_CONSTANT i32 2
172     %y:_(s32) = COPY $w1
173     %add:_(s32) = G_ADD %x1, %y
174     %sub:_(s32) = G_SUB %add, %x2
175     $w0 = COPY %sub(s32)
176     RET_ReallyLR implicit $w0
179 name:            simplify_to_neg_y
180 tracksRegLiveness: true
181 body:             |
182   bb.0:
183     liveins: $w0, $w1
184     ; x - (y + x) -> 0 - y
185     ; CHECK-LABEL: name: simplify_to_neg_y
186     ; CHECK: liveins: $w0, $w1
187     ; CHECK-NEXT: {{  $}}
188     ; CHECK-NEXT: %y:_(s32) = COPY $w1
189     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
190     ; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %y
191     ; CHECK-NEXT: $w0 = COPY %sub(s32)
192     ; CHECK-NEXT: RET_ReallyLR implicit $w0
193     %x:_(s32) = COPY $w0
194     %y:_(s32) = COPY $w1
195     %add:_(s32) = G_ADD %x, %y
196     %sub:_(s32) = G_SUB %x, %add
197     $w0 = COPY %sub(s32)
198     RET_ReallyLR implicit $w0
201 name:            simplify_to_neg_x
202 tracksRegLiveness: true
203 body:             |
204   bb.0:
205     liveins: $w0, $w1
206     ; y - (y + x) -> 0 - x
207     ; CHECK-LABEL: name: simplify_to_neg_x
208     ; CHECK: liveins: $w0, $w1
209     ; CHECK-NEXT: {{  $}}
210     ; CHECK-NEXT: %x:_(s32) = COPY $w0
211     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
212     ; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %x
213     ; CHECK-NEXT: $w0 = COPY %sub(s32)
214     ; CHECK-NEXT: RET_ReallyLR implicit $w0
215     %x:_(s32) = COPY $w0
216     %y:_(s32) = COPY $w1
217     %add:_(s32) = G_ADD %x, %y
218     %sub:_(s32) = G_SUB %y, %add
219     $w0 = COPY %sub(s32)
220     RET_ReallyLR implicit $w0
223 name:            simplify_to_neg_y_constant
224 tracksRegLiveness: true
225 body:             |
226   bb.0:
227     liveins: $w0, $w1
228     ; x - (y + x) -> 0 - y
229     ; CHECK-LABEL: name: simplify_to_neg_y_constant
230     ; CHECK: liveins: $w0, $w1
231     ; CHECK-NEXT: {{  $}}
232     ; CHECK-NEXT: %y:_(s32) = COPY $w1
233     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
234     ; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %y
235     ; CHECK-NEXT: $w0 = COPY %sub(s32)
236     ; CHECK-NEXT: RET_ReallyLR implicit $w0
237     %x1:_(s32) = G_CONSTANT i32 1
238     %x2:_(s32) = G_CONSTANT i32 1
239     %y:_(s32) = COPY $w1
240     %add:_(s32) = G_ADD %x1, %y
241     %sub:_(s32) = G_SUB %x2, %add
242     $w0 = COPY %sub(s32)
243     RET_ReallyLR implicit $w0
246 name:            simplify_to_neg_x_constant
247 tracksRegLiveness: true
248 body:             |
249   bb.0:
250     liveins: $w0, $w1
251     ; y - (y + x) -> 0 - x
252     ; CHECK-LABEL: name: simplify_to_neg_x_constant
253     ; CHECK: liveins: $w0, $w1
254     ; CHECK-NEXT: {{  $}}
255     ; CHECK-NEXT: %x:_(s32) = COPY $w0
256     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
257     ; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %x
258     ; CHECK-NEXT: $w0 = COPY %sub(s32)
259     ; CHECK-NEXT: RET_ReallyLR implicit $w0
260     %x:_(s32) = COPY $w0
261     %y1:_(s32) = G_CONSTANT i32 1
262     %y2:_(s32) = G_CONSTANT i32 1
263     %add:_(s32) = G_ADD %x, %y1
264     %sub:_(s32) = G_SUB %y2, %add
265     $w0 = COPY %sub(s32)
266     RET_ReallyLR implicit $w0
269 name:            vector_simplify_to_neg_x
270 tracksRegLiveness: true
271 body:             |
272   bb.0:
273     liveins: $d0, $d1
274     ; y - (y + x) -> 0 - x
275     ; CHECK-LABEL: name: vector_simplify_to_neg_x
276     ; CHECK: liveins: $d0, $d1
277     ; CHECK-NEXT: {{  $}}
278     ; CHECK-NEXT: %x:_(<2 x s32>) = COPY $d0
279     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
280     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32)
281     ; CHECK-NEXT: %sub:_(<2 x s32>) = G_SUB [[BUILD_VECTOR]], %x
282     ; CHECK-NEXT: $d0 = COPY %sub(<2 x s32>)
283     ; CHECK-NEXT: RET_ReallyLR implicit $d0
284     %x:_(<2 x s32>) = COPY $d0
285     %y:_(<2 x s32>) = COPY $d1
286     %add:_(<2 x s32>) = G_ADD %x, %y
287     %sub:_(<2 x s32>) = G_SUB %y, %add
288     $d0 = COPY %sub(<2 x s32>)
289     RET_ReallyLR implicit $d0
292 name:            vector_simplify_to_neg_y_constant
293 tracksRegLiveness: true
294 body:             |
295   bb.0:
296     liveins: $d0, $d1
297     ; x - (y + x) -> 0 - y
298     ; CHECK-LABEL: name: vector_simplify_to_neg_y_constant
299     ; CHECK: liveins: $d0, $d1
300     ; CHECK-NEXT: {{  $}}
301     ; CHECK-NEXT: %y:_(<2 x s32>) = COPY $d1
302     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
303     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32)
304     ; CHECK-NEXT: %sub:_(<2 x s32>) = G_SUB [[BUILD_VECTOR]], %y
305     ; CHECK-NEXT: $d0 = COPY %sub(<2 x s32>)
306     ; CHECK-NEXT: RET_ReallyLR implicit $d0
307     %cst:_(s32) = G_CONSTANT i32 1
308     %x1:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
309     %x2:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
310     %y:_(<2 x s32>) = COPY $d1
311     %add:_(<2 x s32>) = G_ADD %x1, %y
312     %sub:_(<2 x s32>) = G_SUB %x2, %add
313     $d0 = COPY %sub(<2 x s32>)
314     RET_ReallyLR implicit $d0
317 name:            unique_registers_neg_no_fold
318 tracksRegLiveness: true
319 body:             |
320   bb.0:
321     liveins: $w0, $w1, $w2
322     ; y - (y + x) -> 0 - x
323     ; CHECK-LABEL: name: unique_registers_neg_no_fold
324     ; CHECK: liveins: $w0, $w1, $w2
325     ; CHECK-NEXT: {{  $}}
326     ; CHECK-NEXT: %x:_(s32) = COPY $w0
327     ; CHECK-NEXT: %y:_(s32) = COPY $w1
328     ; CHECK-NEXT: %z:_(s32) = COPY $w2
329     ; CHECK-NEXT: %add:_(s32) = G_ADD %x, %y
330     ; CHECK-NEXT: %sub:_(s32) = G_SUB %z, %add
331     ; CHECK-NEXT: $w0 = COPY %sub(s32)
332     ; CHECK-NEXT: RET_ReallyLR implicit $w0
333     %x:_(s32) = COPY $w0
334     %y:_(s32) = COPY $w1
335     %z:_(s32) = COPY $w2
336     %add:_(s32) = G_ADD %x, %y
337     %sub:_(s32) = G_SUB %z, %add
338     $w0 = COPY %sub(s32)
339     RET_ReallyLR implicit $w0
342 name:            wrong_constant_neg_no_fold
343 tracksRegLiveness: true
344 body:             |
345   bb.0:
346     liveins: $w0, $w1
347     ; x - (y + x) -> 0 - y
348     ; CHECK-LABEL: name: wrong_constant_neg_no_fold
349     ; CHECK: liveins: $w0, $w1
350     ; CHECK-NEXT: {{  $}}
351     ; CHECK-NEXT: %x1:_(s32) = G_CONSTANT i32 1
352     ; CHECK-NEXT: %x2:_(s32) = G_CONSTANT i32 2
353     ; CHECK-NEXT: %y:_(s32) = COPY $w1
354     ; CHECK-NEXT: %add:_(s32) = G_ADD %y, %x1
355     ; CHECK-NEXT: %sub:_(s32) = G_SUB %x2, %add
356     ; CHECK-NEXT: $w0 = COPY %sub(s32)
357     ; CHECK-NEXT: RET_ReallyLR implicit $w0
358     %x1:_(s32) = G_CONSTANT i32 1
359     %x2:_(s32) = G_CONSTANT i32 2
360     %y:_(s32) = COPY $w1
361     %add:_(s32) = G_ADD %x1, %y
362     %sub:_(s32) = G_SUB %x2, %add
363     $w0 = COPY %sub(s32)
364     RET_ReallyLR implicit $w0