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