xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-prop-extends-phi.mir (revision 1833e3fafa229c0a784005fe2925290406154117)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple aarch64-apple-darwin -debugify-and-strip-all-safe -run-pass=aarch64-prelegalizer-combiner -global-isel -verify-machineinstrs %s -o - | FileCheck %s
3
4# Check that we propagate the G_SEXT to the sources of the phi operand.
5---
6name:            sext_icst_through_phi
7tracksRegLiveness: true
8body:             |
9  ; CHECK-LABEL: name: sext_icst_through_phi
10  ; CHECK: bb.0.entry:
11  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
12  ; CHECK-NEXT:   liveins: $w0, $w1
13  ; CHECK-NEXT: {{  $}}
14  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
15  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
16  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
17  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
18  ; CHECK-NEXT:   G_BR %bb.1
19  ; CHECK-NEXT: {{  $}}
20  ; CHECK-NEXT: bb.1:
21  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
22  ; CHECK-NEXT: {{  $}}
23  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
24  ; CHECK-NEXT:   G_BR %bb.3
25  ; CHECK-NEXT: {{  $}}
26  ; CHECK-NEXT: bb.2:
27  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
28  ; CHECK-NEXT: {{  $}}
29  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 10
30  ; CHECK-NEXT: {{  $}}
31  ; CHECK-NEXT: bb.3:
32  ; CHECK-NEXT:   %ext:_(s64) = G_PHI [[C]](s64), %bb.1, [[C1]](s64), %bb.2
33  ; CHECK-NEXT:   $x0 = COPY %ext(s64)
34  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
35  bb.1.entry:
36    liveins: $w0, $w1
37
38    %0:_(s32) = COPY $w0
39    %1:_(s32) = COPY $w1
40    %zero:_(s32) = G_CONSTANT i32 0
41    %one:_(s32) = G_CONSTANT i32 2
42    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
43    G_BRCOND %cmp(s1), %bb.2
44    G_BR %bb.3
45
46  bb.2:
47    %cst32_4:_(s32) = G_CONSTANT i32 4
48    G_BR %bb.4
49
50  bb.3:
51    %cst32_10:_(s32) = G_CONSTANT i32 10
52
53  bb.4:
54    %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
55    %ext:_(s64) = G_SEXT %phi
56    $x0 = COPY %ext(s64)
57    RET_ReallyLR implicit $x0
58
59...
60
61# Check that we propagate the G_ZEXT to the sources of the phi operand.
62---
63name:            zext_icst_through_phi
64tracksRegLiveness: true
65body:             |
66  ; CHECK-LABEL: name: zext_icst_through_phi
67  ; CHECK: bb.0.entry:
68  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
69  ; CHECK-NEXT:   liveins: $w0, $w1
70  ; CHECK-NEXT: {{  $}}
71  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
72  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
73  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
74  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
75  ; CHECK-NEXT:   G_BR %bb.1
76  ; CHECK-NEXT: {{  $}}
77  ; CHECK-NEXT: bb.1:
78  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
79  ; CHECK-NEXT: {{  $}}
80  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
81  ; CHECK-NEXT:   G_BR %bb.3
82  ; CHECK-NEXT: {{  $}}
83  ; CHECK-NEXT: bb.2:
84  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
85  ; CHECK-NEXT: {{  $}}
86  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 10
87  ; CHECK-NEXT: {{  $}}
88  ; CHECK-NEXT: bb.3:
89  ; CHECK-NEXT:   %ext:_(s64) = G_PHI [[C]](s64), %bb.1, [[C1]](s64), %bb.2
90  ; CHECK-NEXT:   $x0 = COPY %ext(s64)
91  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
92  bb.1.entry:
93    liveins: $w0, $w1
94
95    %0:_(s32) = COPY $w0
96    %1:_(s32) = COPY $w1
97    %zero:_(s32) = G_CONSTANT i32 0
98    %one:_(s32) = G_CONSTANT i32 2
99    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
100    G_BRCOND %cmp(s1), %bb.2
101    G_BR %bb.3
102
103  bb.2:
104    %cst32_4:_(s32) = G_CONSTANT i32 4
105    G_BR %bb.4
106
107  bb.3:
108    %cst32_10:_(s32) = G_CONSTANT i32 10
109
110  bb.4:
111    %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
112    %ext:_(s64) = G_ZEXT %phi
113    $x0 = COPY %ext(s64)
114    RET_ReallyLR implicit $x0
115
116...
117
118# Don't handle vectors because of potential cost issues.
119---
120name:            sext_load_through_phi_vector
121tracksRegLiveness: true
122body:             |
123  ; CHECK-LABEL: name: sext_load_through_phi_vector
124  ; CHECK: bb.0.entry:
125  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
126  ; CHECK-NEXT:   liveins: $x0, $q0, $q1
127  ; CHECK-NEXT: {{  $}}
128  ; CHECK-NEXT:   %ptr:_(p0) = COPY $x0
129  ; CHECK-NEXT:   %cmp:_(s1) = G_IMPLICIT_DEF
130  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
131  ; CHECK-NEXT:   G_BR %bb.1
132  ; CHECK-NEXT: {{  $}}
133  ; CHECK-NEXT: bb.1:
134  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
135  ; CHECK-NEXT: {{  $}}
136  ; CHECK-NEXT:   %ld1:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
137  ; CHECK-NEXT:   G_BR %bb.3
138  ; CHECK-NEXT: {{  $}}
139  ; CHECK-NEXT: bb.2:
140  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
141  ; CHECK-NEXT: {{  $}}
142  ; CHECK-NEXT:   %ld2:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
143  ; CHECK-NEXT: {{  $}}
144  ; CHECK-NEXT: bb.3:
145  ; CHECK-NEXT:   %phi:_(<4 x s32>) = G_PHI %ld1(<4 x s32>), %bb.1, %ld2(<4 x s32>), %bb.2
146  ; CHECK-NEXT:   %ext:_(<4 x s64>) = G_SEXT %phi(<4 x s32>)
147  ; CHECK-NEXT:   G_STORE %ext(<4 x s64>), %ptr(p0) :: (store (<4 x s64>))
148  ; CHECK-NEXT:   RET_ReallyLR
149  bb.1.entry:
150    liveins: $x0, $q0, $q1
151
152    %0:_(<4 x s32>) = COPY $q0
153    %1:_(<4 x s32>) = COPY $q1
154    %ptr:_(p0) = COPY $x0
155    %cmp:_(s1) = G_IMPLICIT_DEF
156    G_BRCOND %cmp(s1), %bb.2
157    G_BR %bb.3
158
159  bb.2:
160    %ld1:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
161    G_BR %bb.4
162
163  bb.3:
164    %ld2:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
165
166  bb.4:
167    %phi:_(<4 x s32>) = G_PHI %ld1(<4 x s32>), %bb.2, %ld2(<4 x s32>), %bb.3
168    %ext:_(<4 x s64>) = G_SEXT %phi
169    G_STORE %ext(<4 x s64>), %ptr(p0) :: (store (<4 x s64>))
170    RET_ReallyLR
171
172...
173
174
175# Check that we don't propagate if the extend is used by a G_PTR_ADD, which on
176# AArch64 has a good chance of folding in the extend.
177---
178name:            sext_icst_through_phi_used_by_ptradd
179tracksRegLiveness: true
180body:             |
181  ; CHECK-LABEL: name: sext_icst_through_phi_used_by_ptradd
182  ; CHECK: bb.0.entry:
183  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
184  ; CHECK-NEXT:   liveins: $w0, $w1, $x2
185  ; CHECK-NEXT: {{  $}}
186  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
187  ; CHECK-NEXT:   %base:_(p0) = COPY $x2
188  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
189  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
190  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
191  ; CHECK-NEXT:   G_BR %bb.1
192  ; CHECK-NEXT: {{  $}}
193  ; CHECK-NEXT: bb.1:
194  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
195  ; CHECK-NEXT: {{  $}}
196  ; CHECK-NEXT:   %cst32_4:_(s32) = G_CONSTANT i32 4
197  ; CHECK-NEXT:   G_BR %bb.3
198  ; CHECK-NEXT: {{  $}}
199  ; CHECK-NEXT: bb.2:
200  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
201  ; CHECK-NEXT: {{  $}}
202  ; CHECK-NEXT:   %cst32_10:_(s32) = G_CONSTANT i32 10
203  ; CHECK-NEXT: {{  $}}
204  ; CHECK-NEXT: bb.3:
205  ; CHECK-NEXT:   %phi:_(s32) = G_PHI %cst32_4(s32), %bb.1, %cst32_10(s32), %bb.2
206  ; CHECK-NEXT:   %ext:_(s64) = G_SEXT %phi(s32)
207  ; CHECK-NEXT:   %ptr:_(p0) = G_PTR_ADD %base, %ext(s64)
208  ; CHECK-NEXT:   $x0 = COPY %ptr(p0)
209  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
210  bb.1.entry:
211    liveins: $w0, $w1, $x2
212
213    %0:_(s32) = COPY $w0
214    %1:_(s32) = COPY $w1
215    %base:_(p0) = COPY $x2
216    %zero:_(s32) = G_CONSTANT i32 0
217    %one:_(s32) = G_CONSTANT i32 2
218    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
219    G_BRCOND %cmp(s1), %bb.2
220    G_BR %bb.3
221
222  bb.2:
223    %cst32_4:_(s32) = G_CONSTANT i32 4
224    G_BR %bb.4
225
226  bb.3:
227    %cst32_10:_(s32) = G_CONSTANT i32 10
228
229  bb.4:
230    %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
231    %ext:_(s64) = G_SEXT %phi
232    %ptr:_(p0) = G_PTR_ADD %base, %ext
233    $x0 = COPY %ptr(p0)
234    RET_ReallyLR implicit $x0
235
236...
237
238# Same as above but we do it here because the extend has multiple users, so the
239# it probably won't cost extra instructions if we remove it.
240---
241name:            sext_icst_through_phi_used_by_ptradd_multiuse
242tracksRegLiveness: true
243body:             |
244  ; CHECK-LABEL: name: sext_icst_through_phi_used_by_ptradd_multiuse
245  ; CHECK: bb.0.entry:
246  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
247  ; CHECK-NEXT:   liveins: $w0, $w1, $x2
248  ; CHECK-NEXT: {{  $}}
249  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
250  ; CHECK-NEXT:   %base:_(p0) = COPY $x2
251  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
252  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
253  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
254  ; CHECK-NEXT:   G_BR %bb.1
255  ; CHECK-NEXT: {{  $}}
256  ; CHECK-NEXT: bb.1:
257  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
258  ; CHECK-NEXT: {{  $}}
259  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
260  ; CHECK-NEXT:   G_BR %bb.3
261  ; CHECK-NEXT: {{  $}}
262  ; CHECK-NEXT: bb.2:
263  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
264  ; CHECK-NEXT: {{  $}}
265  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 10
266  ; CHECK-NEXT: {{  $}}
267  ; CHECK-NEXT: bb.3:
268  ; CHECK-NEXT:   %ext:_(s64) = G_PHI [[C]](s64), %bb.1, [[C1]](s64), %bb.2
269  ; CHECK-NEXT:   %ptr:_(p0) = G_PTR_ADD %base, %ext(s64)
270  ; CHECK-NEXT:   $x0 = COPY %ptr(p0)
271  ; CHECK-NEXT:   $x1 = COPY %ext(s64)
272  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
273  bb.1.entry:
274    liveins: $w0, $w1, $x2
275
276    %0:_(s32) = COPY $w0
277    %1:_(s32) = COPY $w1
278    %base:_(p0) = COPY $x2
279    %zero:_(s32) = G_CONSTANT i32 0
280    %one:_(s32) = G_CONSTANT i32 2
281    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
282    G_BRCOND %cmp(s1), %bb.2
283    G_BR %bb.3
284
285  bb.2:
286    %cst32_4:_(s32) = G_CONSTANT i32 4
287    G_BR %bb.4
288
289  bb.3:
290    %cst32_10:_(s32) = G_CONSTANT i32 10
291
292  bb.4:
293    %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
294    %ext:_(s64) = G_SEXT %phi
295    %ptr:_(p0) = G_PTR_ADD %base, %ext
296    $x0 = COPY %ptr(p0)
297    $x1 = COPY %ext(s64)
298    RET_ReallyLR implicit $x0
299
300...
301
302# Check we don't propagate if there are more than 2 unique incoming values in the phi.
303# Doing so might cause too much code bloat.
304---
305name:            zext_icst_through_phi_too_many_incoming
306tracksRegLiveness: true
307body:             |
308  ; CHECK-LABEL: name: zext_icst_through_phi_too_many_incoming
309  ; CHECK: bb.0.entry:
310  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
311  ; CHECK-NEXT:   liveins: $w0, $w1
312  ; CHECK-NEXT: {{  $}}
313  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
314  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
315  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
316  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
317  ; CHECK-NEXT:   G_BR %bb.1
318  ; CHECK-NEXT: {{  $}}
319  ; CHECK-NEXT: bb.1:
320  ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
321  ; CHECK-NEXT: {{  $}}
322  ; CHECK-NEXT:   %cst32_4:_(s32) = G_CONSTANT i32 4
323  ; CHECK-NEXT:   %cond:_(s1) = G_IMPLICIT_DEF
324  ; CHECK-NEXT:   G_BRCOND %cond(s1), %bb.3
325  ; CHECK-NEXT:   G_BR %bb.4
326  ; CHECK-NEXT: {{  $}}
327  ; CHECK-NEXT: bb.2:
328  ; CHECK-NEXT:   successors: %bb.4(0x80000000)
329  ; CHECK-NEXT: {{  $}}
330  ; CHECK-NEXT:   %cst32_10:_(s32) = G_CONSTANT i32 10
331  ; CHECK-NEXT:   G_BR %bb.4
332  ; CHECK-NEXT: {{  $}}
333  ; CHECK-NEXT: bb.3:
334  ; CHECK-NEXT:   successors: %bb.4(0x80000000)
335  ; CHECK-NEXT: {{  $}}
336  ; CHECK-NEXT:   %cst32_42:_(s32) = G_CONSTANT i32 42
337  ; CHECK-NEXT: {{  $}}
338  ; CHECK-NEXT: bb.4:
339  ; CHECK-NEXT:   %phi:_(s32) = G_PHI %cst32_4(s32), %bb.1, %cst32_10(s32), %bb.2, %cst32_42(s32), %bb.3
340  ; CHECK-NEXT:   %ext:_(s64) = G_ZEXT %phi(s32)
341  ; CHECK-NEXT:   $x0 = COPY %ext(s64)
342  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
343  bb.1.entry:
344    liveins: $w0, $w1
345
346    %0:_(s32) = COPY $w0
347    %1:_(s32) = COPY $w1
348    %zero:_(s32) = G_CONSTANT i32 0
349    %one:_(s32) = G_CONSTANT i32 2
350    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
351    G_BRCOND %cmp(s1), %bb.2
352    G_BR %bb.3
353
354  bb.2:
355    %cst32_4:_(s32) = G_CONSTANT i32 4
356    %cond:_(s1) = G_IMPLICIT_DEF
357    G_BRCOND %cond, %bb.5
358    G_BR %bb.4
359
360  bb.3:
361    %cst32_10:_(s32) = G_CONSTANT i32 10
362    G_BR %bb.4
363
364  bb.5:
365    %cst32_42:_(s32) = G_CONSTANT i32 42
366
367  bb.4:
368    %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3, %cst32_42(s32), %bb.5
369    %ext:_(s64) = G_ZEXT %phi
370    $x0 = COPY %ext(s64)
371    RET_ReallyLR implicit $x0
372
373...
374
375# Check that we don't propagate if the extension would be of a non-allowed inst.
376---
377name:            sext_add_through_phi
378tracksRegLiveness: true
379body:             |
380  ; CHECK-LABEL: name: sext_add_through_phi
381  ; CHECK: bb.0.entry:
382  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
383  ; CHECK-NEXT:   liveins: $w0, $w1
384  ; CHECK-NEXT: {{  $}}
385  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
386  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
387  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
388  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
389  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
390  ; CHECK-NEXT:   G_BR %bb.1
391  ; CHECK-NEXT: {{  $}}
392  ; CHECK-NEXT: bb.1:
393  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
394  ; CHECK-NEXT: {{  $}}
395  ; CHECK-NEXT:   %add:_(s32) = G_ADD [[COPY]], [[COPY1]]
396  ; CHECK-NEXT:   G_BR %bb.3
397  ; CHECK-NEXT: {{  $}}
398  ; CHECK-NEXT: bb.2:
399  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
400  ; CHECK-NEXT: {{  $}}
401  ; CHECK-NEXT:   %cst32_10:_(s32) = G_CONSTANT i32 10
402  ; CHECK-NEXT: {{  $}}
403  ; CHECK-NEXT: bb.3:
404  ; CHECK-NEXT:   %phi:_(s32) = G_PHI %add(s32), %bb.1, %cst32_10(s32), %bb.2
405  ; CHECK-NEXT:   %ext:_(s64) = G_SEXT %phi(s32)
406  ; CHECK-NEXT:   $x0 = COPY %ext(s64)
407  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
408  bb.1.entry:
409    liveins: $w0, $w1
410
411    %0:_(s32) = COPY $w0
412    %1:_(s32) = COPY $w1
413    %zero:_(s32) = G_CONSTANT i32 0
414    %one:_(s32) = G_CONSTANT i32 2
415    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
416    G_BRCOND %cmp(s1), %bb.2
417    G_BR %bb.3
418
419  bb.2:
420    %add:_(s32) = G_ADD %0, %1
421    G_BR %bb.4
422
423  bb.3:
424    %cst32_10:_(s32) = G_CONSTANT i32 10
425
426  bb.4:
427    %phi:_(s32) = G_PHI %add(s32), %bb.2, %cst32_10(s32), %bb.3
428    %ext:_(s64) = G_SEXT %phi
429    $x0 = COPY %ext(s64)
430    RET_ReallyLR implicit $x0
431
432...
433
434# Same as above but allowed with a G_ANYEXT.
435---
436name:            anyext_add_through_phi
437tracksRegLiveness: true
438body:             |
439  ; CHECK-LABEL: name: anyext_add_through_phi
440  ; CHECK: bb.0.entry:
441  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
442  ; CHECK-NEXT:   liveins: $w0, $w1
443  ; CHECK-NEXT: {{  $}}
444  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
445  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
446  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
447  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
448  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
449  ; CHECK-NEXT:   G_BR %bb.1
450  ; CHECK-NEXT: {{  $}}
451  ; CHECK-NEXT: bb.1:
452  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
453  ; CHECK-NEXT: {{  $}}
454  ; CHECK-NEXT:   %add:_(s32) = G_ADD [[COPY]], [[COPY1]]
455  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT %add(s32)
456  ; CHECK-NEXT:   G_BR %bb.3
457  ; CHECK-NEXT: {{  $}}
458  ; CHECK-NEXT: bb.2:
459  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
460  ; CHECK-NEXT: {{  $}}
461  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 10
462  ; CHECK-NEXT: {{  $}}
463  ; CHECK-NEXT: bb.3:
464  ; CHECK-NEXT:   %ext:_(s64) = G_PHI [[ANYEXT]](s64), %bb.1, [[C]](s64), %bb.2
465  ; CHECK-NEXT:   $x0 = COPY %ext(s64)
466  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
467  bb.1.entry:
468    liveins: $w0, $w1
469
470    %0:_(s32) = COPY $w0
471    %1:_(s32) = COPY $w1
472    %zero:_(s32) = G_CONSTANT i32 0
473    %one:_(s32) = G_CONSTANT i32 2
474    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
475    G_BRCOND %cmp(s1), %bb.2
476    G_BR %bb.3
477
478  bb.2:
479    %add:_(s32) = G_ADD %0, %1
480    G_BR %bb.4
481
482  bb.3:
483    %cst32_10:_(s32) = G_CONSTANT i32 10
484
485  bb.4:
486    %phi:_(s32) = G_PHI %add(s32), %bb.2, %cst32_10(s32), %bb.3
487    %ext:_(s64) = G_ANYEXT %phi
488    $x0 = COPY %ext(s64)
489    RET_ReallyLR implicit $x0
490
491...
492# Same as above but with a source MI with multiple destination operands.
493---
494name:            anyext_add_through_phi_multiple_operands
495tracksRegLiveness: true
496body:             |
497  ; CHECK-LABEL: name: anyext_add_through_phi_multiple_operands
498  ; CHECK: bb.0.entry:
499  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
500  ; CHECK-NEXT:   liveins: $w0, $w1
501  ; CHECK-NEXT: {{  $}}
502  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
503  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
504  ; CHECK-NEXT:   %one:_(s32) = G_CONSTANT i32 2
505  ; CHECK-NEXT:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
506  ; CHECK-NEXT:   G_BRCOND %cmp(s1), %bb.2
507  ; CHECK-NEXT:   G_BR %bb.1
508  ; CHECK-NEXT: {{  $}}
509  ; CHECK-NEXT: bb.1:
510  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
511  ; CHECK-NEXT: {{  $}}
512  ; CHECK-NEXT:   %big0:_(s64) = G_SEXT [[COPY]](s32)
513  ; CHECK-NEXT:   %big1:_(s64) = G_SEXT [[COPY1]](s32)
514  ; CHECK-NEXT:   %add:_(s64) = G_ADD %big0, %big1
515  ; CHECK-NEXT:   %first:_(s32), %second:_(s32) = G_UNMERGE_VALUES %add(s64)
516  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT %second(s32)
517  ; CHECK-NEXT:   G_BR %bb.3
518  ; CHECK-NEXT: {{  $}}
519  ; CHECK-NEXT: bb.2:
520  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
521  ; CHECK-NEXT: {{  $}}
522  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 10
523  ; CHECK-NEXT: {{  $}}
524  ; CHECK-NEXT: bb.3:
525  ; CHECK-NEXT:   %ext:_(s64) = G_PHI [[ANYEXT]](s64), %bb.1, [[C]](s64), %bb.2
526  ; CHECK-NEXT:   $x0 = COPY %ext(s64)
527  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
528  bb.1.entry:
529    liveins: $w0, $w1
530
531    %0:_(s32) = COPY $w0
532    %1:_(s32) = COPY $w1
533    %zero:_(s32) = G_CONSTANT i32 0
534    %one:_(s32) = G_CONSTANT i32 2
535    %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
536    G_BRCOND %cmp(s1), %bb.2
537    G_BR %bb.3
538
539  bb.2:
540    %big0:_(s64) = G_SEXT %0
541    %big1:_(s64) = G_SEXT %1
542    %add:_(s64) = G_ADD %big0, %big1
543    %first:_(s32), %second:_(s32) = G_UNMERGE_VALUES %add:_(s64)
544    G_BR %bb.4
545
546  bb.3:
547    %cst32_10:_(s32) = G_CONSTANT i32 10
548
549  bb.4:
550    %phi:_(s32) = G_PHI %second, %bb.2, %cst32_10, %bb.3
551    %ext:_(s64) = G_ANYEXT %phi
552    $x0 = COPY %ext(s64)
553    RET_ReallyLR implicit $x0
554
555...
556