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