xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/legalize-phi.mir (revision 143be6a60186d6c1a6a298d0b7acdc1a4d69a321)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -O0 -mtriple=aarch64-unknown-unknown -verify-machineinstrs -global-isel-abort=0 -run-pass=legalizer %s -o - | FileCheck %s
3---
4name:            legalize_phi
5alignment:       4
6exposesReturnsTwice: false
7legalized:       false
8regBankSelected: false
9selected:        false
10tracksRegLiveness: true
11registers:
12  - { id: 0, class: _, preferred-register: '' }
13  - { id: 1, class: _, preferred-register: '' }
14  - { id: 2, class: _, preferred-register: '' }
15  - { id: 3, class: _, preferred-register: '' }
16  - { id: 4, class: _, preferred-register: '' }
17  - { id: 5, class: _, preferred-register: '' }
18  - { id: 6, class: _, preferred-register: '' }
19  - { id: 7, class: _, preferred-register: '' }
20  - { id: 8, class: _, preferred-register: '' }
21  - { id: 9, class: _, preferred-register: '' }
22  - { id: 10, class: _, preferred-register: '' }
23liveins:
24body:             |
25  ; CHECK-LABEL: name: legalize_phi
26  ; CHECK: bb.0:
27  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
28  ; CHECK-NEXT:   liveins: $w0
29  ; CHECK-NEXT: {{  $}}
30  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
31  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
32  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
33  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
34  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
35  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
36  ; CHECK-NEXT:   G_BR %bb.2
37  ; CHECK-NEXT: {{  $}}
38  ; CHECK-NEXT: bb.1:
39  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
40  ; CHECK-NEXT: {{  $}}
41  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
42  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
43  ; CHECK-NEXT:   G_BR %bb.3
44  ; CHECK-NEXT: {{  $}}
45  ; CHECK-NEXT: bb.2:
46  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
47  ; CHECK-NEXT: {{  $}}
48  ; CHECK-NEXT:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]
49  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
50  ; CHECK-NEXT: {{  $}}
51  ; CHECK-NEXT: bb.3:
52  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC]](s16), %bb.1, [[TRUNC1]](s16), %bb.2
53  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
54  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
55  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C3]]
56  ; CHECK-NEXT:   $w0 = COPY [[AND]](s32)
57  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
58  bb.0:
59   ; Test that we insert legalization artifacts(Truncs here) into the correct BBs
60   ; while legalizing the G_PHI to s16.
61
62
63    successors: %bb.1(0x40000000), %bb.2(0x40000000)
64    liveins: $w0
65
66    %0(s32) = COPY $w0
67    %1(s32) = G_CONSTANT i32 0
68    %3(s32) = G_CONSTANT i32 1
69    %6(s32) = G_CONSTANT i32 2
70    %2(s1) = G_ICMP intpred(ugt), %0(s32), %1
71    G_BRCOND %2(s1), %bb.1
72    G_BR %bb.2
73
74  bb.1:
75    successors: %bb.3(0x80000000)
76
77    %4(s32) = G_ADD %0, %3
78    %5(s1) = G_TRUNC %4(s32)
79    G_BR %bb.3
80
81  bb.2:
82    successors: %bb.3(0x80000000)
83
84    %7(s32) = G_ADD %0, %6
85    %8(s1) = G_TRUNC %7(s32)
86
87  bb.3:
88    %9(s1) = G_PHI %5(s1), %bb.1, %8(s1), %bb.2
89    %11:_(s1) = G_PHI %5(s1), %bb.1, %8(s1), %bb.2
90    %10(s32) = G_ZEXT %9(s1)
91    $w0 = COPY %10(s32)
92    RET_ReallyLR implicit $w0
93
94...
95---
96name:            legalize_phi_ptr
97alignment:       4
98exposesReturnsTwice: false
99legalized:       false
100regBankSelected: false
101selected:        false
102tracksRegLiveness: true
103registers:
104  - { id: 0, class: _, preferred-register: '' }
105  - { id: 1, class: _, preferred-register: '' }
106  - { id: 2, class: _, preferred-register: '' }
107  - { id: 3, class: _, preferred-register: '' }
108  - { id: 4, class: _, preferred-register: '' }
109  - { id: 5, class: _, preferred-register: '' }
110liveins:
111body:             |
112  ; CHECK-LABEL: name: legalize_phi_ptr
113  ; CHECK: bb.0:
114  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
115  ; CHECK-NEXT:   liveins: $w2, $x0, $x1
116  ; CHECK-NEXT: {{  $}}
117  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x0
118  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
119  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
120  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
121  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C]]
122  ; CHECK-NEXT:   G_BRCOND [[AND]](s32), %bb.1
123  ; CHECK-NEXT:   G_BR %bb.2
124  ; CHECK-NEXT: {{  $}}
125  ; CHECK-NEXT: bb.1:
126  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
127  ; CHECK-NEXT: {{  $}}
128  ; CHECK-NEXT: bb.2:
129  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(p0) = G_PHI [[COPY]](p0), %bb.0, [[COPY1]](p0), %bb.1
130  ; CHECK-NEXT:   $x0 = COPY [[PHI]](p0)
131  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
132  bb.1:
133
134    successors: %bb.2, %bb.3
135    liveins: $w2, $x0, $x1
136
137    %0(p0) = COPY $x0
138    %1(p0) = COPY $x1
139    %4(s32) = COPY $w2
140    %2(s1) = G_TRUNC %4(s32)
141    G_BRCOND %2(s1), %bb.2
142    G_BR %bb.3
143
144  bb.2:
145    successors: %bb.3
146
147  bb.3:
148    %3(p0) = G_PHI %0(p0), %bb.1, %1(p0), %bb.2
149    $x0 = COPY %3(p0)
150    RET_ReallyLR implicit $x0
151
152...
153---
154name:            legalize_phi_empty
155alignment:       4
156exposesReturnsTwice: false
157legalized:       false
158regBankSelected: false
159selected:        false
160tracksRegLiveness: true
161registers:
162  - { id: 0, class: _, preferred-register: '' }
163  - { id: 1, class: _, preferred-register: '' }
164  - { id: 2, class: _, preferred-register: '' }
165  - { id: 3, class: _, preferred-register: '' }
166  - { id: 4, class: _, preferred-register: '' }
167  - { id: 5, class: _, preferred-register: '' }
168  - { id: 6, class: _, preferred-register: '' }
169  - { id: 7, class: _, preferred-register: '' }
170  - { id: 8, class: _, preferred-register: '' }
171  - { id: 9, class: _, preferred-register: '' }
172  - { id: 10, class: _, preferred-register: '' }
173liveins:
174body:             |
175  ; CHECK-LABEL: name: legalize_phi_empty
176  ; CHECK: bb.0:
177  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
178  ; CHECK-NEXT:   liveins: $w0
179  ; CHECK-NEXT: {{  $}}
180  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
181  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
182  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
183  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
184  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
185  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
186  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
187  ; CHECK-NEXT:   G_BR %bb.2
188  ; CHECK-NEXT: {{  $}}
189  ; CHECK-NEXT: bb.1:
190  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
191  ; CHECK-NEXT: {{  $}}
192  ; CHECK-NEXT:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]
193  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
194  ; CHECK-NEXT:   G_BR %bb.3
195  ; CHECK-NEXT: {{  $}}
196  ; CHECK-NEXT: bb.2:
197  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
198  ; CHECK-NEXT: {{  $}}
199  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
200  ; CHECK-NEXT: {{  $}}
201  ; CHECK-NEXT: bb.3:
202  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC]](s16), %bb.1, [[TRUNC1]](s16), %bb.2
203  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
204  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
205  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C3]]
206  ; CHECK-NEXT:   $w0 = COPY [[AND]](s32)
207  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
208  bb.0:
209    successors: %bb.1(0x40000000), %bb.2(0x40000000)
210    liveins: $w0
211   ; Test that we properly legalize a phi with a predecessor that's empty
212
213
214
215
216    %0(s32) = COPY $w0
217    %1(s32) = G_CONSTANT i32 0
218    %3(s32) = G_CONSTANT i32 3
219    %6(s32) = G_CONSTANT i32 1
220    %2(s1) = G_ICMP intpred(ugt), %0(s32), %1
221    %4(s32) = G_ADD %0, %3
222    %5(s1) = G_TRUNC %4(s32)
223    G_BRCOND %2(s1), %bb.1
224    G_BR %bb.2
225
226  bb.1:
227    successors: %bb.3(0x80000000)
228
229    %7(s32) = G_ADD %0, %6
230    %8(s1) = G_TRUNC %7(s32)
231    G_BR %bb.3
232
233  bb.2:
234    successors: %bb.3(0x80000000)
235
236
237  bb.3:
238    %9(s1) = G_PHI %8(s1), %bb.1, %5(s1), %bb.2
239    %10(s32) = G_ZEXT %9(s1)
240    $w0 = COPY %10(s32)
241    RET_ReallyLR implicit $w0
242
243...
244---
245name:            legalize_phi_loop
246alignment:       4
247exposesReturnsTwice: false
248legalized:       false
249regBankSelected: false
250selected:        false
251tracksRegLiveness: true
252registers:
253  - { id: 0, class: _, preferred-register: '' }
254  - { id: 1, class: _, preferred-register: '' }
255  - { id: 2, class: _, preferred-register: '' }
256  - { id: 3, class: _, preferred-register: '' }
257  - { id: 4, class: _, preferred-register: '' }
258  - { id: 5, class: _, preferred-register: '' }
259  - { id: 6, class: _, preferred-register: '' }
260  - { id: 7, class: _, preferred-register: '' }
261liveins:
262body:             |
263  ; CHECK-LABEL: name: legalize_phi_loop
264  ; CHECK: bb.0:
265  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
266  ; CHECK-NEXT:   liveins: $w0
267  ; CHECK-NEXT: {{  $}}
268  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
269  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
270  ; CHECK-NEXT: {{  $}}
271  ; CHECK-NEXT: bb.1:
272  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
273  ; CHECK-NEXT: {{  $}}
274  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[C]](s16), %bb.0, %14(s16), %bb.1
275  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
276  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
277  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ANYEXT]], [[C1]]
278  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
279  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C2]]
280  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[AND]](s32), [[COPY]]
281  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
282  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
283  ; CHECK-NEXT: {{  $}}
284  ; CHECK-NEXT: bb.2:
285  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
286  ; CHECK-NEXT:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C3]]
287  ; CHECK-NEXT:   $w0 = COPY [[AND1]](s32)
288  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
289  bb.0:
290    successors: %bb.1(0x80000000)
291    liveins: $w0
292   ; Test that we properly legalize a phi that uses a value from the same BB
293
294    %0(s32) = COPY $w0
295    %2(s8) = G_CONSTANT i8 1
296    %7(s8) = G_CONSTANT i8 0
297
298  bb.1:
299    successors: %bb.1(0x40000000), %bb.3(0x40000000)
300
301    %1(s8) = G_PHI %7(s8), %bb.0, %3(s8), %bb.1
302    %3(s8) = G_ADD %1, %2
303    %4(s32) = G_ZEXT %3(s8)
304    %5(s1) = G_ICMP intpred(ugt), %4(s32), %0
305    G_BRCOND %5(s1), %bb.1
306
307  bb.3:
308    %6(s32) = G_ZEXT %3(s8)
309    $w0 = COPY %6(s32)
310    RET_ReallyLR implicit $w0
311
312...
313---
314name:            legalize_phi_cycle
315alignment:       4
316exposesReturnsTwice: false
317legalized:       false
318regBankSelected: false
319selected:        false
320tracksRegLiveness: true
321registers:
322  - { id: 0, class: _, preferred-register: '' }
323  - { id: 1, class: _, preferred-register: '' }
324  - { id: 2, class: _, preferred-register: '' }
325  - { id: 3, class: _, preferred-register: '' }
326  - { id: 4, class: _, preferred-register: '' }
327liveins:
328body:             |
329  ; CHECK-LABEL: name: legalize_phi_cycle
330  ; CHECK: bb.0:
331  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
332  ; CHECK-NEXT:   liveins: $w0
333  ; CHECK-NEXT: {{  $}}
334  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
335  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
336  ; CHECK-NEXT: {{  $}}
337  ; CHECK-NEXT: bb.1:
338  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
339  ; CHECK-NEXT: {{  $}}
340  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[C]](s16), %bb.0, [[PHI]](s16), %bb.1
341  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
342  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
343  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C1]]
344  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[AND]](s32), [[COPY]]
345  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
346  ; CHECK-NEXT: {{  $}}
347  ; CHECK-NEXT: bb.2:
348  ; CHECK-NEXT:   $w0 = COPY [[AND]](s32)
349  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
350  bb.0:
351    successors: %bb.1(0x80000000)
352    liveins: $w0
353   ; Test that we properly legalize a phi that uses itself
354
355
356    %0(s32) = COPY $w0
357    %4(s8) = G_CONSTANT i8 0
358
359  bb.1:
360    successors: %bb.1(0x40000000), %bb.3(0x40000000)
361
362    %1(s8) = G_PHI %4(s8), %bb.0, %1(s8), %bb.1
363    %2(s32) = G_ZEXT %1(s8)
364    %3(s1) = G_ICMP intpred(ugt), %2(s32), %0
365    G_BRCOND %3(s1), %bb.1
366
367  bb.3:
368    $w0 = COPY %2(s32)
369    RET_ReallyLR implicit $w0
370
371...
372---
373name:            legalize_phi_same_bb
374alignment:       4
375exposesReturnsTwice: false
376legalized:       false
377regBankSelected: false
378selected:        false
379tracksRegLiveness: true
380registers:
381  - { id: 0, class: _, preferred-register: '' }
382  - { id: 1, class: _, preferred-register: '' }
383  - { id: 2, class: _, preferred-register: '' }
384  - { id: 3, class: _, preferred-register: '' }
385  - { id: 4, class: _, preferred-register: '' }
386  - { id: 5, class: _, preferred-register: '' }
387  - { id: 6, class: _, preferred-register: '' }
388  - { id: 7, class: _, preferred-register: '' }
389  - { id: 8, class: _, preferred-register: '' }
390  - { id: 9, class: _, preferred-register: '' }
391  - { id: 10, class: _, preferred-register: '' }
392  - { id: 11, class: _, preferred-register: '' }
393  - { id: 12, class: _, preferred-register: '' }
394  - { id: 13, class: _, preferred-register: '' }
395  - { id: 14, class: _, preferred-register: '' }
396liveins:
397body:             |
398  ; CHECK-LABEL: name: legalize_phi_same_bb
399  ; CHECK: bb.0:
400  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
401  ; CHECK-NEXT:   liveins: $w0
402  ; CHECK-NEXT: {{  $}}
403  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
404  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
405  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
406  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
407  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
408  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
409  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
410  ; CHECK-NEXT:   G_BR %bb.2
411  ; CHECK-NEXT: {{  $}}
412  ; CHECK-NEXT: bb.1:
413  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
414  ; CHECK-NEXT: {{  $}}
415  ; CHECK-NEXT:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]
416  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
417  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
418  ; CHECK-NEXT:   G_BR %bb.3
419  ; CHECK-NEXT: {{  $}}
420  ; CHECK-NEXT: bb.2:
421  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
422  ; CHECK-NEXT: {{  $}}
423  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s16) = G_CONSTANT i16 42
424  ; CHECK-NEXT:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
425  ; CHECK-NEXT: {{  $}}
426  ; CHECK-NEXT: bb.3:
427  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.1, [[TRUNC2]](s16), %bb.2
428  ; CHECK-NEXT:   [[PHI1:%[0-9]+]]:_(s16) = G_PHI [[TRUNC]](s16), %bb.1, [[C3]](s16), %bb.2
429  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
430  ; CHECK-NEXT:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
431  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C4]]
432  ; CHECK-NEXT:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI1]](s16)
433  ; CHECK-NEXT:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[ANYEXT1]], [[C4]]
434  ; CHECK-NEXT:   [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[AND1]]
435  ; CHECK-NEXT:   $w0 = COPY [[ADD2]](s32)
436  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
437  bb.0:
438    successors: %bb.1(0x40000000), %bb.2(0x40000000)
439    liveins: $w0
440   ; Make sure that we correctly insert the new legalized G_PHI at the
441   ; correct location (ie make sure G_PHIs are the first insts in the BB).
442
443
444
445
446    %0(s32) = COPY $w0
447    %1(s32) = G_CONSTANT i32 0
448    %3(s32) = G_CONSTANT i32 3
449    %6(s32) = G_CONSTANT i32 1
450    %14(s8) = G_CONSTANT i8 42
451    %2(s1) = G_ICMP intpred(ugt), %0(s32), %1
452    %4(s32) = G_ADD %0, %3
453    %5(s8) = G_TRUNC %4(s32)
454    G_BRCOND %2(s1), %bb.1
455    G_BR %bb.2
456
457  bb.1:
458    successors: %bb.3(0x80000000)
459
460    %7(s32) = G_ADD %0, %6
461    %8(s8) = G_TRUNC %7(s32)
462    G_BR %bb.3
463
464  bb.2:
465    successors: %bb.3(0x80000000)
466
467
468  bb.3:
469    %9(s8) = G_PHI %8(s8), %bb.1, %5(s8), %bb.2
470    %10(s8) = G_PHI %8(s8), %bb.1, %14(s8), %bb.2
471    %11(s32) = G_ZEXT %9(s8)
472    %12(s32) = G_ZEXT %10(s8)
473    %13(s32) = G_ADD %11, %12
474    $w0 = COPY %13(s32)
475    RET_ReallyLR implicit $w0
476
477...
478---
479name:            legalize_phi_diff_bb
480alignment:       4
481exposesReturnsTwice: false
482legalized:       false
483regBankSelected: false
484selected:        false
485tracksRegLiveness: true
486registers:
487  - { id: 0, class: _, preferred-register: '' }
488  - { id: 1, class: _, preferred-register: '' }
489  - { id: 2, class: _, preferred-register: '' }
490  - { id: 3, class: _, preferred-register: '' }
491  - { id: 4, class: _, preferred-register: '' }
492  - { id: 5, class: _, preferred-register: '' }
493  - { id: 6, class: _, preferred-register: '' }
494  - { id: 7, class: _, preferred-register: '' }
495  - { id: 8, class: _, preferred-register: '' }
496  - { id: 9, class: _, preferred-register: '' }
497  - { id: 10, class: _, preferred-register: '' }
498  - { id: 11, class: _, preferred-register: '' }
499  - { id: 12, class: _, preferred-register: '' }
500  - { id: 13, class: _, preferred-register: '' }
501  - { id: 14, class: _, preferred-register: '' }
502  - { id: 15, class: _, preferred-register: '' }
503liveins:
504body:             |
505  ; CHECK-LABEL: name: legalize_phi_diff_bb
506  ; CHECK: bb.0:
507  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
508  ; CHECK-NEXT:   liveins: $w0, $w1
509  ; CHECK-NEXT: {{  $}}
510  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
511  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
512  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
513  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
514  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
515  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 44
516  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
517  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
518  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
519  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
520  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
521  ; CHECK-NEXT:   G_BR %bb.2
522  ; CHECK-NEXT: {{  $}}
523  ; CHECK-NEXT: bb.1:
524  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
525  ; CHECK-NEXT: {{  $}}
526  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.0, %22(s16), %bb.1
527  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
528  ; CHECK-NEXT:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
529  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C4]]
530  ; CHECK-NEXT:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[C2]]
531  ; CHECK-NEXT:   [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[ADD1]](s32), [[C3]]
532  ; CHECK-NEXT:   [[C5:%[0-9]+]]:_(s16) = G_CONSTANT i16 43
533  ; CHECK-NEXT:   G_BRCOND [[ICMP1]](s32), %bb.2
534  ; CHECK-NEXT:   G_BR %bb.1
535  ; CHECK-NEXT: {{  $}}
536  ; CHECK-NEXT: bb.2:
537  ; CHECK-NEXT:   [[PHI1:%[0-9]+]]:_(s16) = G_PHI [[PHI]](s16), %bb.1, [[TRUNC]](s16), %bb.0
538  ; CHECK-NEXT:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI1]](s16)
539  ; CHECK-NEXT:   [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
540  ; CHECK-NEXT:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[ANYEXT1]], [[C6]]
541  ; CHECK-NEXT:   $w0 = COPY [[AND1]](s32)
542  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
543  bb.0:
544    successors: %bb.1(0x40000000), %bb.3(0x40000000)
545    liveins: $w0, $w1
546   ; Make sure that we correctly legalize PHIs sharing common defs
547   ; in different BBs.
548
549
550
551    %0(s32) = COPY $w0
552    %1(s32) = COPY $w1
553    %2(s32) = G_CONSTANT i32 0
554    %4(s32) = G_CONSTANT i32 3
555    %9(s32) = G_CONSTANT i32 1
556    %11(s32) = G_CONSTANT i32 44
557    %15(s8) = G_CONSTANT i8 43
558    %3(s1) = G_ICMP intpred(ugt), %0(s32), %2
559    %5(s32) = G_ADD %0, %4
560    %6(s8) = G_TRUNC %5(s32)
561    G_BRCOND %3(s1), %bb.1
562    G_BR %bb.3
563
564  bb.1:
565    successors: %bb.3(0x40000000), %bb.1(0x40000000)
566
567    %7(s8) = G_PHI %6(s8), %bb.0, %15(s8), %bb.1
568    %8(s32) = G_ZEXT %7(s8)
569    %10(s32) = G_ADD %8, %9
570    %12(s1) = G_ICMP intpred(ugt), %10(s32), %11
571    G_BRCOND %12(s1), %bb.3
572    G_BR %bb.1
573
574  bb.3:
575    %13(s8) = G_PHI %7(s8), %bb.1, %6(s8), %bb.0
576    %14(s32) = G_ZEXT %13(s8)
577    $w0 = COPY %14(s32)
578    RET_ReallyLR implicit $w0
579
580...
581---
582name:            legalize_phi_check_insertpt
583alignment:       4
584exposesReturnsTwice: false
585legalized:       false
586regBankSelected: false
587selected:        false
588tracksRegLiveness: true
589body:             |
590  ; CHECK-LABEL: name: legalize_phi_check_insertpt
591  ; CHECK: bb.0:
592  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
593  ; CHECK-NEXT:   liveins: $x0, $x1
594  ; CHECK-NEXT: {{  $}}
595  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $x0
596  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
597  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
598  ; CHECK-NEXT:   G_BR %bb.1
599  ; CHECK-NEXT: {{  $}}
600  ; CHECK-NEXT: bb.1:
601  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s64) = G_PHI [[DEF]](s64), %bb.0
602  ; CHECK-NEXT:   [[PHI1:%[0-9]+]]:_(s64) = G_PHI [[DEF]](s64), %bb.0
603  ; CHECK-NEXT:   [[PHI2:%[0-9]+]]:_(s64) = G_PHI [[COPY]](s64), %bb.0
604  ; CHECK-NEXT:   [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[PHI]](s64), [[PHI1]](s64)
605  ; CHECK-NEXT:   G_STORE [[MV]](s128), [[COPY1]](p0) :: (store (s128))
606  ; CHECK-NEXT:   G_STORE [[PHI2]](s64), [[COPY1]](p0) :: (store (s64))
607  ; CHECK-NEXT:   RET_ReallyLR
608  ; Check that the G_MERGE here gets inserted after all the PHIs.
609  bb.0:
610    successors: %bb.1(0x40000000)
611    liveins: $x0, $x1
612
613    %0:_(s64) = COPY $x0
614    %1:_(p0) = COPY $x1
615    %2:_(s128) = G_IMPLICIT_DEF
616    G_BR %bb.1
617
618  bb.1:
619    %3:_(s128) = G_PHI %2(s128), %bb.0
620    %4:_(s64) = G_PHI %0(s64), %bb.0
621    G_STORE %3(s128), %1(p0) :: (store (s128))
622    G_STORE %4(s64), %1(p0) :: (store (s64))
623    RET_ReallyLR
624
625...
626---
627name:            legalize_phi_vector
628tracksRegLiveness: true
629body:             |
630  ; CHECK-LABEL: name: legalize_phi_vector
631  ; CHECK: bb.0:
632  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
633  ; CHECK-NEXT:   liveins: $q0, $x1
634  ; CHECK-NEXT: {{  $}}
635  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
636  ; CHECK-NEXT:   G_BR %bb.1
637  ; CHECK-NEXT: {{  $}}
638  ; CHECK-NEXT: bb.1:
639  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(<16 x s8>) = G_PHI [[COPY]](<16 x s8>), %bb.0
640  ; CHECK-NEXT:   $q0 = COPY [[PHI]](<16 x s8>)
641  ; CHECK-NEXT:   RET_ReallyLR
642  bb.0:
643    successors: %bb.1
644    liveins: $q0, $x1
645
646    %0:_(<16 x s8>) = COPY $q0
647    G_BR %bb.1
648
649  bb.1:
650    %3:_(<16 x s8>) = G_PHI %0(<16 x s8>), %bb.0
651    $q0 = COPY %3(<16 x s8>)
652    RET_ReallyLR
653...
654---
655name:             s88
656tracksRegLiveness: true
657liveins:
658body:             |
659  ; CHECK-LABEL: name: s88
660  ; CHECK: bb.0:
661  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
662  ; CHECK-NEXT:   liveins: $x0
663  ; CHECK-NEXT: {{  $}}
664  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
665  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
666  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[DEF]], [[C]]
667  ; CHECK-NEXT:   G_BRCOND [[AND]](s32), %bb.1
668  ; CHECK-NEXT:   G_BR %bb.2
669  ; CHECK-NEXT: {{  $}}
670  ; CHECK-NEXT: bb.1:
671  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
672  ; CHECK-NEXT: {{  $}}
673  ; CHECK-NEXT:   [[DEF1:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
674  ; CHECK-NEXT:   G_BR %bb.3
675  ; CHECK-NEXT: {{  $}}
676  ; CHECK-NEXT: bb.2:
677  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
678  ; CHECK-NEXT: {{  $}}
679  ; CHECK-NEXT:   [[DEF2:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
680  ; CHECK-NEXT: {{  $}}
681  ; CHECK-NEXT: bb.3:
682  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s64) = G_PHI [[DEF1]](s64), %bb.1, [[DEF2]](s64), %bb.2
683  ; CHECK-NEXT:   $x0 = COPY [[PHI]](s64)
684  ; CHECK-NEXT:   RET_ReallyLR implicit $x0
685  bb.0:
686    successors: %bb.1(0x40000000), %bb.2(0x40000000)
687    liveins: $x0
688    %cond:_(s1) = G_IMPLICIT_DEF
689    G_BRCOND %cond(s1), %bb.1
690    G_BR %bb.2
691  bb.1:
692    successors: %bb.3(0x80000000)
693    %imp_1:_(s88) = G_IMPLICIT_DEF
694    G_BR %bb.3
695  bb.2:
696    successors: %bb.3(0x80000000)
697    %imp_2:_(s88) = G_IMPLICIT_DEF
698  bb.3:
699    %phi:_(s88) = G_PHI %imp_1:_(s88), %bb.1, %imp_2:_(s88), %bb.2
700    %trunc:_(s64) = G_TRUNC %phi
701    $x0 = COPY %trunc
702    RET_ReallyLR implicit $x0
703...
704---
705name:            v4s64
706alignment:       4
707tracksRegLiveness: true
708body:             |
709  ; CHECK-LABEL: name: v4s64
710  ; CHECK: bb.0:
711  ; CHECK-NEXT:   successors: %bb.1(0x50000000), %bb.2(0x30000000)
712  ; CHECK-NEXT:   liveins: $x0, $x1
713  ; CHECK-NEXT: {{  $}}
714  ; CHECK-NEXT:   %ptr1:_(p0) = COPY $x1
715  ; CHECK-NEXT:   %ptr2:_(p0) = COPY $x0
716  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(<2 x s64>) = G_LOAD %ptr1(p0) :: (load (<2 x s64>), align 32)
717  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
718  ; CHECK-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD %ptr1, [[C]](s64)
719  ; CHECK-NEXT:   [[LOAD1:%[0-9]+]]:_(<2 x s64>) = G_LOAD [[PTR_ADD]](p0) :: (load (<2 x s64>) from unknown-address + 16)
720  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
721  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
722  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[DEF]], [[C1]]
723  ; CHECK-NEXT:   G_BRCOND [[AND]](s32), %bb.2
724  ; CHECK-NEXT:   G_BR %bb.1
725  ; CHECK-NEXT: {{  $}}
726  ; CHECK-NEXT: bb.1:
727  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
728  ; CHECK-NEXT: {{  $}}
729  ; CHECK-NEXT:   [[LOAD2:%[0-9]+]]:_(<2 x s64>) = G_LOAD %ptr2(p0) :: (load (<2 x s64>), align 32)
730  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
731  ; CHECK-NEXT:   [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD %ptr2, [[C2]](s64)
732  ; CHECK-NEXT:   [[LOAD3:%[0-9]+]]:_(<2 x s64>) = G_LOAD [[PTR_ADD1]](p0) :: (load (<2 x s64>) from unknown-address + 16)
733  ; CHECK-NEXT: {{  $}}
734  ; CHECK-NEXT: bb.2:
735  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(<2 x s64>) = G_PHI [[LOAD2]](<2 x s64>), %bb.1, [[LOAD]](<2 x s64>), %bb.0
736  ; CHECK-NEXT:   [[PHI1:%[0-9]+]]:_(<2 x s64>) = G_PHI [[LOAD3]](<2 x s64>), %bb.1, [[LOAD1]](<2 x s64>), %bb.0
737  ; CHECK-NEXT:   $q0 = COPY [[PHI]](<2 x s64>)
738  ; CHECK-NEXT:   $q1 = COPY [[PHI1]](<2 x s64>)
739  ; CHECK-NEXT:   RET_ReallyLR implicit $q0, implicit $q1
740  bb.0:
741    successors: %bb.1(0x50000000), %bb.2(0x30000000)
742    liveins: $x0, $x1
743
744    %ptr1:_(p0) = COPY $x1
745    %ptr2:_(p0) = COPY $x0
746    %cond:_(s1) = G_IMPLICIT_DEF
747    %val_1:_(<4 x s64>) = G_LOAD %ptr1(p0) :: (load (<4 x s64>))
748    G_BRCOND %cond(s1), %bb.2
749    G_BR %bb.1
750  bb.1:
751    %val_2:_(<4 x s64>) = G_LOAD %ptr2(p0) :: (load (<4 x s64>))
752  bb.2:
753    %phi:_(<4 x s64>) = G_PHI %val_2(<4 x s64>), %bb.1, %val_1(<4 x s64>), %bb.0
754    %unmerge_1:_(<2 x s64>), %unmerge_2:_(<2 x s64>) = G_UNMERGE_VALUES %phi(<4 x s64>)
755    $q0 = COPY %unmerge_1(<2 x s64>)
756    $q1 = COPY %unmerge_2(<2 x s64>)
757    RET_ReallyLR implicit $q0, implicit $q1
758...
759---
760name:            v8s32
761alignment:       4
762tracksRegLiveness: true
763body:             |
764  ; CHECK-LABEL: name: v8s32
765  ; CHECK: bb.0:
766  ; CHECK-NEXT:   successors: %bb.1(0x50000000), %bb.2(0x30000000)
767  ; CHECK-NEXT:   liveins: $x0, $x1
768  ; CHECK-NEXT: {{  $}}
769  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
770  ; CHECK-NEXT:   [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
771  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
772  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[DEF1]], [[C]]
773  ; CHECK-NEXT:   G_BRCOND [[AND]](s32), %bb.2
774  ; CHECK-NEXT:   G_BR %bb.1
775  ; CHECK-NEXT: {{  $}}
776  ; CHECK-NEXT: bb.1:
777  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
778  ; CHECK-NEXT: {{  $}}
779  ; CHECK-NEXT:   [[DEF2:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
780  ; CHECK-NEXT: {{  $}}
781  ; CHECK-NEXT: bb.2:
782  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(<4 x s32>) = G_PHI [[DEF2]](<4 x s32>), %bb.1, [[DEF]](<4 x s32>), %bb.0
783  ; CHECK-NEXT:   %one:_(s64) = G_CONSTANT i64 1
784  ; CHECK-NEXT:   %extract:_(s32) = G_EXTRACT_VECTOR_ELT [[PHI]](<4 x s32>), %one(s64)
785  ; CHECK-NEXT:   $w0 = COPY %extract(s32)
786  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
787  bb.0:
788    successors: %bb.1(0x50000000), %bb.2(0x30000000)
789    liveins: $x0, $x1
790    %cond:_(s1) = G_IMPLICIT_DEF
791    %val_1:_(<8 x s32>) = G_IMPLICIT_DEF
792    G_BRCOND %cond(s1), %bb.2
793    G_BR %bb.1
794  bb.1:
795    %val_2:_(<8 x s32>) = G_IMPLICIT_DEF
796  bb.2:
797    %phi:_(<8 x s32>) = G_PHI %val_2(<8 x s32>), %bb.1, %val_1(<8 x s32>), %bb.0
798    %one:_(s64) = G_CONSTANT i64 1
799    %extract:_(s32) = G_EXTRACT_VECTOR_ELT %phi(<8 x s32>), %one(s64)
800    $w0 = COPY %extract
801    RET_ReallyLR implicit $w0
802...
803---
804name:            v16s16
805alignment:       4
806tracksRegLiveness: true
807body:             |
808  ; CHECK-LABEL: name: v16s16
809  ; CHECK: bb.0:
810  ; CHECK-NEXT:   successors: %bb.1(0x50000000), %bb.2(0x30000000)
811  ; CHECK-NEXT:   liveins: $x0, $x1
812  ; CHECK-NEXT: {{  $}}
813  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(<8 x s16>) = G_IMPLICIT_DEF
814  ; CHECK-NEXT:   [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
815  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
816  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[DEF1]], [[C]]
817  ; CHECK-NEXT:   G_BRCOND [[AND]](s32), %bb.2
818  ; CHECK-NEXT:   G_BR %bb.1
819  ; CHECK-NEXT: {{  $}}
820  ; CHECK-NEXT: bb.1:
821  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
822  ; CHECK-NEXT: {{  $}}
823  ; CHECK-NEXT:   [[DEF2:%[0-9]+]]:_(<8 x s16>) = G_IMPLICIT_DEF
824  ; CHECK-NEXT: {{  $}}
825  ; CHECK-NEXT: bb.2:
826  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(<8 x s16>) = G_PHI [[DEF2]](<8 x s16>), %bb.1, [[DEF]](<8 x s16>), %bb.0
827  ; CHECK-NEXT:   %one:_(s64) = G_CONSTANT i64 1
828  ; CHECK-NEXT:   %extract:_(s16) = G_EXTRACT_VECTOR_ELT [[PHI]](<8 x s16>), %one(s64)
829  ; CHECK-NEXT:   $h0 = COPY %extract(s16)
830  ; CHECK-NEXT:   RET_ReallyLR implicit $h0
831  bb.0:
832    successors: %bb.1(0x50000000), %bb.2(0x30000000)
833    liveins: $x0, $x1
834    %cond:_(s1) = G_IMPLICIT_DEF
835    %val_1:_(<16 x s16>) = G_IMPLICIT_DEF
836    G_BRCOND %cond(s1), %bb.2
837    G_BR %bb.1
838  bb.1:
839    %val_2:_(<16 x s16>) = G_IMPLICIT_DEF
840  bb.2:
841    %phi:_(<16 x s16>) = G_PHI %val_2(<16 x s16>), %bb.1, %val_1(<16 x s16>), %bb.0
842    %one:_(s64) = G_CONSTANT i64 1
843    %extract:_(s16) = G_EXTRACT_VECTOR_ELT %phi(<16 x s16>), %one(s64)
844    $h0 = COPY %extract
845    RET_ReallyLR implicit $h0
846...
847---
848name:            v32s8
849alignment:       4
850tracksRegLiveness: true
851body:             |
852  ; CHECK-LABEL: name: v32s8
853  ; CHECK: bb.0:
854  ; CHECK-NEXT:   successors: %bb.1(0x50000000), %bb.2(0x30000000)
855  ; CHECK-NEXT:   liveins: $x0, $x1
856  ; CHECK-NEXT: {{  $}}
857  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(<16 x s8>) = G_IMPLICIT_DEF
858  ; CHECK-NEXT:   [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
859  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
860  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[DEF1]], [[C]]
861  ; CHECK-NEXT:   G_BRCOND [[AND]](s32), %bb.2
862  ; CHECK-NEXT:   G_BR %bb.1
863  ; CHECK-NEXT: {{  $}}
864  ; CHECK-NEXT: bb.1:
865  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
866  ; CHECK-NEXT: {{  $}}
867  ; CHECK-NEXT:   [[DEF2:%[0-9]+]]:_(<16 x s8>) = G_IMPLICIT_DEF
868  ; CHECK-NEXT: {{  $}}
869  ; CHECK-NEXT: bb.2:
870  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(<16 x s8>) = G_PHI [[DEF2]](<16 x s8>), %bb.1, [[DEF]](<16 x s8>), %bb.0
871  ; CHECK-NEXT:   %one:_(s64) = G_CONSTANT i64 1
872  ; CHECK-NEXT:   %extract:_(s8) = G_EXTRACT_VECTOR_ELT [[PHI]](<16 x s8>), %one(s64)
873  ; CHECK-NEXT:   $b0 = COPY %extract(s8)
874  ; CHECK-NEXT:   RET_ReallyLR implicit $b0
875  bb.0:
876    successors: %bb.1(0x50000000), %bb.2(0x30000000)
877    liveins: $x0, $x1
878    %cond:_(s1) = G_IMPLICIT_DEF
879    %val_1:_(<32 x s8>) = G_IMPLICIT_DEF
880    G_BRCOND %cond(s1), %bb.2
881    G_BR %bb.1
882  bb.1:
883    %val_2:_(<32 x s8>) = G_IMPLICIT_DEF
884  bb.2:
885    %phi:_(<32 x s8>) = G_PHI %val_2(<32 x s8>), %bb.1, %val_1(<32 x s8>), %bb.0
886    %one:_(s64) = G_CONSTANT i64 1
887    %extract:_(s8) = G_EXTRACT_VECTOR_ELT %phi(<32 x s8>), %one(s64)
888    $b0 = COPY %extract
889    RET_ReallyLR implicit $b0
890...
891---
892name:            v4p0
893alignment:       4
894tracksRegLiveness: true
895body:             |
896  ; CHECK-LABEL: name: v4p0
897  ; CHECK: bb.0:
898  ; CHECK-NEXT:   successors: %bb.1(0x50000000), %bb.2(0x30000000)
899  ; CHECK-NEXT:   liveins: $x0, $x1
900  ; CHECK-NEXT: {{  $}}
901  ; CHECK-NEXT:   %ptr1:_(p0) = COPY $x1
902  ; CHECK-NEXT:   %ptr2:_(p0) = COPY $x0
903  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(<2 x s64>) = G_LOAD %ptr1(p0) :: (load (<2 x s64>), align 32)
904  ; CHECK-NEXT:   [[BITCAST:%[0-9]+]]:_(<2 x p0>) = G_BITCAST [[LOAD]](<2 x s64>)
905  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
906  ; CHECK-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD %ptr1, [[C]](s64)
907  ; CHECK-NEXT:   [[LOAD1:%[0-9]+]]:_(<2 x s64>) = G_LOAD [[PTR_ADD]](p0) :: (load (<2 x s64>) from unknown-address + 16)
908  ; CHECK-NEXT:   [[BITCAST1:%[0-9]+]]:_(<2 x p0>) = G_BITCAST [[LOAD1]](<2 x s64>)
909  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
910  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
911  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[DEF]], [[C1]]
912  ; CHECK-NEXT:   G_BRCOND [[AND]](s32), %bb.2
913  ; CHECK-NEXT:   G_BR %bb.1
914  ; CHECK-NEXT: {{  $}}
915  ; CHECK-NEXT: bb.1:
916  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
917  ; CHECK-NEXT: {{  $}}
918  ; CHECK-NEXT:   [[LOAD2:%[0-9]+]]:_(<2 x s64>) = G_LOAD %ptr2(p0) :: (load (<2 x s64>), align 32)
919  ; CHECK-NEXT:   [[BITCAST2:%[0-9]+]]:_(<2 x p0>) = G_BITCAST [[LOAD2]](<2 x s64>)
920  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
921  ; CHECK-NEXT:   [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD %ptr2, [[C2]](s64)
922  ; CHECK-NEXT:   [[LOAD3:%[0-9]+]]:_(<2 x s64>) = G_LOAD [[PTR_ADD1]](p0) :: (load (<2 x s64>) from unknown-address + 16)
923  ; CHECK-NEXT:   [[BITCAST3:%[0-9]+]]:_(<2 x p0>) = G_BITCAST [[LOAD3]](<2 x s64>)
924  ; CHECK-NEXT: {{  $}}
925  ; CHECK-NEXT: bb.2:
926  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(<2 x p0>) = G_PHI [[BITCAST2]](<2 x p0>), %bb.1, [[BITCAST]](<2 x p0>), %bb.0
927  ; CHECK-NEXT:   [[PHI1:%[0-9]+]]:_(<2 x p0>) = G_PHI [[BITCAST3]](<2 x p0>), %bb.1, [[BITCAST1]](<2 x p0>), %bb.0
928  ; CHECK-NEXT:   $q0 = COPY [[PHI]](<2 x p0>)
929  ; CHECK-NEXT:   $q1 = COPY [[PHI1]](<2 x p0>)
930  ; CHECK-NEXT:   RET_ReallyLR implicit $q0, implicit $q1
931  bb.0:
932    successors: %bb.1(0x50000000), %bb.2(0x30000000)
933    liveins: $x0, $x1
934
935    %ptr1:_(p0) = COPY $x1
936    %ptr2:_(p0) = COPY $x0
937    %cond:_(s1) = G_IMPLICIT_DEF
938    %val_1:_(<4 x p0>) = G_LOAD %ptr1(p0) :: (load (<4 x p0>))
939    G_BRCOND %cond(s1), %bb.2
940    G_BR %bb.1
941  bb.1:
942    %val_2:_(<4 x p0>) = G_LOAD %ptr2(p0) :: (load (<4 x p0>))
943  bb.2:
944    %phi:_(<4 x p0>) = G_PHI %val_2(<4 x p0>), %bb.1, %val_1(<4 x p0>), %bb.0
945    %unmerge_1:_(<2 x p0>), %unmerge_2:_(<2 x p0>) = G_UNMERGE_VALUES %phi(<4 x p0>)
946    $q0 = COPY %unmerge_1(<2 x p0>)
947    $q1 = COPY %unmerge_2(<2 x p0>)
948    RET_ReallyLR implicit $q0, implicit $q1
949