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=1 -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:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
28  ; CHECK:   liveins: $w0
29  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
30  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
31  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
32  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
33  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
34  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)
35  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
36  ; CHECK:   G_BR %bb.2
37  ; CHECK: bb.1:
38  ; CHECK:   successors: %bb.3(0x80000000)
39  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
40  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
41  ; CHECK:   G_BR %bb.3
42  ; CHECK: bb.2:
43  ; CHECK:   successors: %bb.3(0x80000000)
44  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]
45  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
46  ; CHECK: bb.3:
47  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.1, [[TRUNC2]](s16), %bb.2
48  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
49  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
50  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C3]]
51  ; CHECK:   $w0 = COPY [[AND]](s32)
52  ; CHECK:   RET_ReallyLR implicit $w0
53  bb.0:
54   ; Test that we insert legalization artifacts(Truncs here) into the correct BBs
55   ; while legalizing the G_PHI to s16.
56
57
58    successors: %bb.1(0x40000000), %bb.2(0x40000000)
59    liveins: $w0
60
61    %0(s32) = COPY $w0
62    %1(s32) = G_CONSTANT i32 0
63    %3(s32) = G_CONSTANT i32 1
64    %6(s32) = G_CONSTANT i32 2
65    %2(s1) = G_ICMP intpred(ugt), %0(s32), %1
66    G_BRCOND %2(s1), %bb.1
67    G_BR %bb.2
68
69  bb.1:
70    successors: %bb.3(0x80000000)
71
72    %4(s32) = G_ADD %0, %3
73    %5(s1) = G_TRUNC %4(s32)
74    G_BR %bb.3
75
76  bb.2:
77    successors: %bb.3(0x80000000)
78
79    %7(s32) = G_ADD %0, %6
80    %8(s1) = G_TRUNC %7(s32)
81
82  bb.3:
83    %9(s1) = G_PHI %5(s1), %bb.1, %8(s1), %bb.2
84    %11:_(s1) = G_PHI %5(s1), %bb.1, %8(s1), %bb.2
85    %10(s32) = G_ZEXT %9(s1)
86    $w0 = COPY %10(s32)
87    RET_ReallyLR implicit $w0
88
89...
90---
91name:            legalize_phi_ptr
92alignment:       4
93exposesReturnsTwice: false
94legalized:       false
95regBankSelected: false
96selected:        false
97tracksRegLiveness: true
98registers:
99  - { id: 0, class: _, preferred-register: '' }
100  - { id: 1, class: _, preferred-register: '' }
101  - { id: 2, class: _, preferred-register: '' }
102  - { id: 3, class: _, preferred-register: '' }
103  - { id: 4, class: _, preferred-register: '' }
104  - { id: 5, class: _, preferred-register: '' }
105liveins:
106body:             |
107  ; CHECK-LABEL: name: legalize_phi_ptr
108  ; CHECK: bb.0:
109  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
110  ; CHECK:   liveins: $w2, $x0, $x1
111  ; CHECK:   [[COPY:%[0-9]+]]:_(p0) = COPY $x0
112  ; CHECK:   [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
113  ; CHECK:   [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
114  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY2]](s32)
115  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
116  ; CHECK:   G_BR %bb.2
117  ; CHECK: bb.1:
118  ; CHECK:   successors: %bb.2(0x80000000)
119  ; CHECK: bb.2:
120  ; CHECK:   [[PHI:%[0-9]+]]:_(p0) = G_PHI [[COPY]](p0), %bb.0, [[COPY1]](p0), %bb.1
121  ; CHECK:   $x0 = COPY [[PHI]](p0)
122  ; CHECK:   RET_ReallyLR implicit $x0
123  bb.1:
124
125    successors: %bb.2, %bb.3
126    liveins: $w2, $x0, $x1
127
128    %0(p0) = COPY $x0
129    %1(p0) = COPY $x1
130    %4(s32) = COPY $w2
131    %2(s1) = G_TRUNC %4(s32)
132    G_BRCOND %2(s1), %bb.2
133    G_BR %bb.3
134
135  bb.2:
136    successors: %bb.3
137
138  bb.3:
139    %3(p0) = G_PHI %0(p0), %bb.1, %1(p0), %bb.2
140    $x0 = COPY %3(p0)
141    RET_ReallyLR implicit $x0
142
143...
144---
145name:            legalize_phi_empty
146alignment:       4
147exposesReturnsTwice: false
148legalized:       false
149regBankSelected: false
150selected:        false
151tracksRegLiveness: true
152registers:
153  - { id: 0, class: _, preferred-register: '' }
154  - { id: 1, class: _, preferred-register: '' }
155  - { id: 2, class: _, preferred-register: '' }
156  - { id: 3, class: _, preferred-register: '' }
157  - { id: 4, class: _, preferred-register: '' }
158  - { id: 5, class: _, preferred-register: '' }
159  - { id: 6, class: _, preferred-register: '' }
160  - { id: 7, class: _, preferred-register: '' }
161  - { id: 8, class: _, preferred-register: '' }
162  - { id: 9, class: _, preferred-register: '' }
163  - { id: 10, class: _, preferred-register: '' }
164liveins:
165body:             |
166  ; CHECK-LABEL: name: legalize_phi_empty
167  ; CHECK: bb.0:
168  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
169  ; CHECK:   liveins: $w0
170  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
171  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
172  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
173  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
174  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
175  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)
176  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
177  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
178  ; CHECK:   G_BR %bb.2
179  ; CHECK: bb.1:
180  ; CHECK:   successors: %bb.3(0x80000000)
181  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]
182  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
183  ; CHECK:   G_BR %bb.3
184  ; CHECK: bb.2:
185  ; CHECK:   successors: %bb.3(0x80000000)
186  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
187  ; CHECK: bb.3:
188  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.1, [[TRUNC2]](s16), %bb.2
189  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
190  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
191  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C3]]
192  ; CHECK:   $w0 = COPY [[AND]](s32)
193  ; CHECK:   RET_ReallyLR implicit $w0
194  bb.0:
195    successors: %bb.1(0x40000000), %bb.2(0x40000000)
196    liveins: $w0
197   ; Test that we properly legalize a phi with a predecessor that's empty
198
199
200
201
202    %0(s32) = COPY $w0
203    %1(s32) = G_CONSTANT i32 0
204    %3(s32) = G_CONSTANT i32 3
205    %6(s32) = G_CONSTANT i32 1
206    %2(s1) = G_ICMP intpred(ugt), %0(s32), %1
207    %4(s32) = G_ADD %0, %3
208    %5(s1) = G_TRUNC %4(s32)
209    G_BRCOND %2(s1), %bb.1
210    G_BR %bb.2
211
212  bb.1:
213    successors: %bb.3(0x80000000)
214
215    %7(s32) = G_ADD %0, %6
216    %8(s1) = G_TRUNC %7(s32)
217    G_BR %bb.3
218
219  bb.2:
220    successors: %bb.3(0x80000000)
221
222
223  bb.3:
224    %9(s1) = G_PHI %8(s1), %bb.1, %5(s1), %bb.2
225    %10(s32) = G_ZEXT %9(s1)
226    $w0 = COPY %10(s32)
227    RET_ReallyLR implicit $w0
228
229...
230---
231name:            legalize_phi_loop
232alignment:       4
233exposesReturnsTwice: false
234legalized:       false
235regBankSelected: false
236selected:        false
237tracksRegLiveness: true
238registers:
239  - { id: 0, class: _, preferred-register: '' }
240  - { id: 1, class: _, preferred-register: '' }
241  - { id: 2, class: _, preferred-register: '' }
242  - { id: 3, class: _, preferred-register: '' }
243  - { id: 4, class: _, preferred-register: '' }
244  - { id: 5, class: _, preferred-register: '' }
245  - { id: 6, class: _, preferred-register: '' }
246  - { id: 7, class: _, preferred-register: '' }
247liveins:
248body:             |
249  ; CHECK-LABEL: name: legalize_phi_loop
250  ; CHECK: bb.0:
251  ; CHECK:   successors: %bb.1(0x80000000)
252  ; CHECK:   liveins: $w0
253  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
254  ; CHECK:   [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
255  ; CHECK: bb.1:
256  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
257  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[C]](s16), %bb.0, %13(s16), %bb.1
258  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
259  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
260  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ANYEXT]], [[C1]]
261  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
262  ; CHECK:   [[COPY1:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
263  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY1]], [[C2]]
264  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[AND]](s32), [[COPY]]
265  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)
266  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
267  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
268  ; CHECK: bb.2:
269  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
270  ; CHECK:   [[COPY2:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
271  ; CHECK:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C3]]
272  ; CHECK:   $w0 = COPY [[AND1]](s32)
273  ; CHECK:   RET_ReallyLR implicit $w0
274  bb.0:
275    successors: %bb.1(0x80000000)
276    liveins: $w0
277   ; Test that we properly legalize a phi that uses a value from the same BB
278
279    %0(s32) = COPY $w0
280    %2(s8) = G_CONSTANT i8 1
281    %7(s8) = G_CONSTANT i8 0
282
283  bb.1:
284    successors: %bb.1(0x40000000), %bb.3(0x40000000)
285
286    %1(s8) = G_PHI %7(s8), %bb.0, %3(s8), %bb.1
287    %3(s8) = G_ADD %1, %2
288    %4(s32) = G_ZEXT %3(s8)
289    %5(s1) = G_ICMP intpred(ugt), %4(s32), %0
290    G_BRCOND %5(s1), %bb.1
291
292  bb.3:
293    %6(s32) = G_ZEXT %3(s8)
294    $w0 = COPY %6(s32)
295    RET_ReallyLR implicit $w0
296
297...
298---
299name:            legalize_phi_cycle
300alignment:       4
301exposesReturnsTwice: false
302legalized:       false
303regBankSelected: false
304selected:        false
305tracksRegLiveness: true
306registers:
307  - { id: 0, class: _, preferred-register: '' }
308  - { id: 1, class: _, preferred-register: '' }
309  - { id: 2, class: _, preferred-register: '' }
310  - { id: 3, class: _, preferred-register: '' }
311  - { id: 4, class: _, preferred-register: '' }
312liveins:
313body:             |
314  ; CHECK-LABEL: name: legalize_phi_cycle
315  ; CHECK: bb.0:
316  ; CHECK:   successors: %bb.1(0x80000000)
317  ; CHECK:   liveins: $w0
318  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
319  ; CHECK:   [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
320  ; CHECK: bb.1:
321  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
322  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[C]](s16), %bb.0, %7(s16), %bb.1
323  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
324  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
325  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C1]]
326  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[AND]](s32), [[COPY]]
327  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)
328  ; CHECK:   [[COPY1:%[0-9]+]]:_(s16) = COPY [[PHI]](s16)
329  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
330  ; CHECK: bb.2:
331  ; CHECK:   $w0 = COPY [[AND]](s32)
332  ; CHECK:   RET_ReallyLR implicit $w0
333  bb.0:
334    successors: %bb.1(0x80000000)
335    liveins: $w0
336   ; Test that we properly legalize a phi that uses itself
337
338
339    %0(s32) = COPY $w0
340    %4(s8) = G_CONSTANT i8 0
341
342  bb.1:
343    successors: %bb.1(0x40000000), %bb.3(0x40000000)
344
345    %1(s8) = G_PHI %4(s8), %bb.0, %1(s8), %bb.1
346    %2(s32) = G_ZEXT %1(s8)
347    %3(s1) = G_ICMP intpred(ugt), %2(s32), %0
348    G_BRCOND %3(s1), %bb.1
349
350  bb.3:
351    $w0 = COPY %2(s32)
352    RET_ReallyLR implicit $w0
353
354...
355---
356name:            legalize_phi_same_bb
357alignment:       4
358exposesReturnsTwice: false
359legalized:       false
360regBankSelected: false
361selected:        false
362tracksRegLiveness: true
363registers:
364  - { id: 0, class: _, preferred-register: '' }
365  - { id: 1, class: _, preferred-register: '' }
366  - { id: 2, class: _, preferred-register: '' }
367  - { id: 3, class: _, preferred-register: '' }
368  - { id: 4, class: _, preferred-register: '' }
369  - { id: 5, class: _, preferred-register: '' }
370  - { id: 6, class: _, preferred-register: '' }
371  - { id: 7, class: _, preferred-register: '' }
372  - { id: 8, class: _, preferred-register: '' }
373  - { id: 9, class: _, preferred-register: '' }
374  - { id: 10, class: _, preferred-register: '' }
375  - { id: 11, class: _, preferred-register: '' }
376  - { id: 12, class: _, preferred-register: '' }
377  - { id: 13, class: _, preferred-register: '' }
378  - { id: 14, class: _, preferred-register: '' }
379liveins:
380body:             |
381  ; CHECK-LABEL: name: legalize_phi_same_bb
382  ; CHECK: bb.0:
383  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
384  ; CHECK:   liveins: $w0
385  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
386  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
387  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
388  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
389  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
390  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)
391  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
392  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
393  ; CHECK:   G_BR %bb.2
394  ; CHECK: bb.1:
395  ; CHECK:   successors: %bb.3(0x80000000)
396  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]
397  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
398  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)
399  ; CHECK:   G_BR %bb.3
400  ; CHECK: bb.2:
401  ; CHECK:   successors: %bb.3(0x80000000)
402  ; CHECK:   [[C3:%[0-9]+]]:_(s16) = G_CONSTANT i16 42
403  ; CHECK:   [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
404  ; CHECK: bb.3:
405  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC2]](s16), %bb.1, [[TRUNC3]](s16), %bb.2
406  ; CHECK:   [[PHI1:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.1, [[C3]](s16), %bb.2
407  ; CHECK:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
408  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
409  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C4]]
410  ; CHECK:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI1]](s16)
411  ; CHECK:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[ANYEXT1]], [[C4]]
412  ; CHECK:   [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[AND1]]
413  ; CHECK:   $w0 = COPY [[ADD2]](s32)
414  ; CHECK:   RET_ReallyLR implicit $w0
415  bb.0:
416    successors: %bb.1(0x40000000), %bb.2(0x40000000)
417    liveins: $w0
418   ; Make sure that we correctly insert the new legalized G_PHI at the
419   ; correct location (ie make sure G_PHIs are the first insts in the BB).
420
421
422
423
424    %0(s32) = COPY $w0
425    %1(s32) = G_CONSTANT i32 0
426    %3(s32) = G_CONSTANT i32 3
427    %6(s32) = G_CONSTANT i32 1
428    %14(s8) = G_CONSTANT i8 42
429    %2(s1) = G_ICMP intpred(ugt), %0(s32), %1
430    %4(s32) = G_ADD %0, %3
431    %5(s8) = G_TRUNC %4(s32)
432    G_BRCOND %2(s1), %bb.1
433    G_BR %bb.2
434
435  bb.1:
436    successors: %bb.3(0x80000000)
437
438    %7(s32) = G_ADD %0, %6
439    %8(s8) = G_TRUNC %7(s32)
440    G_BR %bb.3
441
442  bb.2:
443    successors: %bb.3(0x80000000)
444
445
446  bb.3:
447    %9(s8) = G_PHI %8(s8), %bb.1, %5(s8), %bb.2
448    %10(s8) = G_PHI %8(s8), %bb.1, %14(s8), %bb.2
449    %11(s32) = G_ZEXT %9(s8)
450    %12(s32) = G_ZEXT %10(s8)
451    %13(s32) = G_ADD %11, %12
452    $w0 = COPY %13(s32)
453    RET_ReallyLR implicit $w0
454
455...
456---
457name:            legalize_phi_diff_bb
458alignment:       4
459exposesReturnsTwice: false
460legalized:       false
461regBankSelected: false
462selected:        false
463tracksRegLiveness: true
464registers:
465  - { id: 0, class: _, preferred-register: '' }
466  - { id: 1, class: _, preferred-register: '' }
467  - { id: 2, class: _, preferred-register: '' }
468  - { id: 3, class: _, preferred-register: '' }
469  - { id: 4, class: _, preferred-register: '' }
470  - { id: 5, class: _, preferred-register: '' }
471  - { id: 6, class: _, preferred-register: '' }
472  - { id: 7, class: _, preferred-register: '' }
473  - { id: 8, class: _, preferred-register: '' }
474  - { id: 9, class: _, preferred-register: '' }
475  - { id: 10, class: _, preferred-register: '' }
476  - { id: 11, class: _, preferred-register: '' }
477  - { id: 12, class: _, preferred-register: '' }
478  - { id: 13, class: _, preferred-register: '' }
479  - { id: 14, class: _, preferred-register: '' }
480  - { id: 15, class: _, preferred-register: '' }
481liveins:
482body:             |
483  ; CHECK-LABEL: name: legalize_phi_diff_bb
484  ; CHECK: bb.0:
485  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
486  ; CHECK:   liveins: $w0, $w1
487  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
488  ; CHECK:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
489  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
490  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
491  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
492  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 44
493  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]
494  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)
495  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]
496  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
497  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)
498  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
499  ; CHECK:   G_BR %bb.2
500  ; CHECK: bb.1:
501  ; CHECK:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
502  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC2]](s16), %bb.0, %21(s16), %bb.1
503  ; CHECK:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
504  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)
505  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C4]]
506  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[C2]]
507  ; CHECK:   [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[ADD1]](s32), [[C3]]
508  ; CHECK:   [[TRUNC3:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP1]](s32)
509  ; CHECK:   [[COPY2:%[0-9]+]]:_(s16) = COPY [[PHI]](s16)
510  ; CHECK:   [[C5:%[0-9]+]]:_(s16) = G_CONSTANT i16 43
511  ; CHECK:   G_BRCOND [[TRUNC3]](s1), %bb.2
512  ; CHECK:   G_BR %bb.1
513  ; CHECK: bb.2:
514  ; CHECK:   [[PHI1:%[0-9]+]]:_(s16) = G_PHI [[COPY2]](s16), %bb.1, [[TRUNC1]](s16), %bb.0
515  ; CHECK:   [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
516  ; CHECK:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI1]](s16)
517  ; CHECK:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[ANYEXT1]], [[C6]]
518  ; CHECK:   $w0 = COPY [[AND1]](s32)
519  ; CHECK:   RET_ReallyLR implicit $w0
520  bb.0:
521    successors: %bb.1(0x40000000), %bb.3(0x40000000)
522    liveins: $w0, $w1
523   ; Make sure that we correctly legalize PHIs sharing common defs
524   ; in different BBs.
525
526
527
528    %0(s32) = COPY $w0
529    %1(s32) = COPY $w1
530    %2(s32) = G_CONSTANT i32 0
531    %4(s32) = G_CONSTANT i32 3
532    %9(s32) = G_CONSTANT i32 1
533    %11(s32) = G_CONSTANT i32 44
534    %15(s8) = G_CONSTANT i8 43
535    %3(s1) = G_ICMP intpred(ugt), %0(s32), %2
536    %5(s32) = G_ADD %0, %4
537    %6(s8) = G_TRUNC %5(s32)
538    G_BRCOND %3(s1), %bb.1
539    G_BR %bb.3
540
541  bb.1:
542    successors: %bb.3(0x40000000), %bb.1(0x40000000)
543
544    %7(s8) = G_PHI %6(s8), %bb.0, %15(s8), %bb.1
545    %8(s32) = G_ZEXT %7(s8)
546    %10(s32) = G_ADD %8, %9
547    %12(s1) = G_ICMP intpred(ugt), %10(s32), %11
548    G_BRCOND %12(s1), %bb.3
549    G_BR %bb.1
550
551  bb.3:
552    %13(s8) = G_PHI %7(s8), %bb.1, %6(s8), %bb.0
553    %14(s32) = G_ZEXT %13(s8)
554    $w0 = COPY %14(s32)
555    RET_ReallyLR implicit $w0
556
557...
558---
559name:            legalize_phi_check_insertpt
560alignment:       4
561exposesReturnsTwice: false
562legalized:       false
563regBankSelected: false
564selected:        false
565tracksRegLiveness: true
566body:             |
567  ; CHECK-LABEL: name: legalize_phi_check_insertpt
568  ; CHECK: bb.0:
569  ; CHECK:   successors: %bb.1(0x80000000)
570  ; CHECK:   liveins: $x0, $x1
571  ; CHECK:   [[COPY:%[0-9]+]]:_(s64) = COPY $x0
572  ; CHECK:   [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
573  ; CHECK:   [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
574  ; CHECK:   G_BR %bb.1
575  ; CHECK: bb.1:
576  ; CHECK:   [[PHI:%[0-9]+]]:_(s64) = G_PHI [[DEF]](s64), %bb.0
577  ; CHECK:   [[PHI1:%[0-9]+]]:_(s64) = G_PHI [[DEF]](s64), %bb.0
578  ; CHECK:   [[PHI2:%[0-9]+]]:_(s64) = G_PHI [[COPY]](s64), %bb.0
579  ; CHECK:   [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[PHI]](s64), [[PHI1]](s64)
580  ; CHECK:   G_STORE [[MV]](s128), [[COPY1]](p0) :: (store 16)
581  ; CHECK:   G_STORE [[PHI2]](s64), [[COPY1]](p0) :: (store 8)
582  ; CHECK:   RET_ReallyLR
583  ; Check that the G_MERGE here gets inserted after all the PHIs.
584  bb.0:
585    successors: %bb.1(0x40000000)
586    liveins: $x0, $x1
587
588    %0:_(s64) = COPY $x0
589    %1:_(p0) = COPY $x1
590    %2:_(s128) = G_IMPLICIT_DEF
591    G_BR %bb.1
592
593  bb.1:
594    %3:_(s128) = G_PHI %2(s128), %bb.0
595    %4:_(s64) = G_PHI %0(s64), %bb.0
596    G_STORE %3(s128), %1(p0) :: (store 16)
597    G_STORE %4(s64), %1(p0) :: (store 8)
598    RET_ReallyLR
599
600...
601---
602name:            legalize_phi_vector
603tracksRegLiveness: true
604body:             |
605  ; CHECK-LABEL: name: legalize_phi_vector
606  ; CHECK: bb.0:
607  ; CHECK:   successors: %bb.1(0x80000000)
608  ; CHECK:   liveins: $q0, $x1
609  ; CHECK:   [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
610  ; CHECK:   G_BR %bb.1
611  ; CHECK: bb.1:
612  ; CHECK:   [[PHI:%[0-9]+]]:_(<16 x s8>) = G_PHI [[COPY]](<16 x s8>), %bb.0
613  ; CHECK:   $q0 = COPY [[PHI]](<16 x s8>)
614  ; CHECK:   RET_ReallyLR
615  bb.0:
616    successors: %bb.1
617    liveins: $q0, $x1
618
619    %0:_(<16 x s8>) = COPY $q0
620    G_BR %bb.1
621
622  bb.1:
623    %3:_(<16 x s8>) = G_PHI %0(<16 x s8>), %bb.0
624    $q0 = COPY %3(<16 x s8>)
625    RET_ReallyLR
626...
627