xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/uaddo-8-16-bits.mir (revision d365a45cb3eaa640b09874fb7984a6a69683c773)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -verify-machineinstrs -mtriple arm64-apple-ios -global-isel -run-pass=aarch64-prelegalizer-combiner -o - %s | FileCheck %s
3
4...
5---
6name:            can_fold_i8
7tracksRegLiveness: true
8body:             |
9  ; CHECK-LABEL: name: can_fold_i8
10  ; CHECK: bb.0.entry:
11  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
12  ; CHECK-NEXT:   liveins: $w0, $w1
13  ; CHECK-NEXT: {{  $}}
14  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
15  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 8
16  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
17  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 8
18  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_ZEXT]], [[ASSERT_ZEXT1]]
19  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 256
20  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C]]
21  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
22  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[AND]](s32), [[C1]]
23  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.2
24  ; CHECK-NEXT:   G_BR %bb.1
25  ; CHECK-NEXT: {{  $}}
26  ; CHECK-NEXT: bb.1:
27  ; CHECK-NEXT:   successors:
28  ; CHECK-NEXT: {{  $}}
29  ; CHECK-NEXT:   G_TRAP
30  ; CHECK-NEXT: {{  $}}
31  ; CHECK-NEXT: bb.2:
32  ; CHECK-NEXT:   $w0 = COPY [[ADD]](s32)
33  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
34  bb.1.entry:
35    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
36    liveins: $w0, $w1
37
38    %2:_(s32) = COPY $w0
39    %3:_(s32) = G_ASSERT_ZEXT %2, 8
40    %0:_(s8) = G_TRUNC %3(s32)
41    %4:_(s32) = COPY $w1
42    %5:_(s32) = G_ASSERT_ZEXT %4, 8
43    %1:_(s8) = G_TRUNC %5(s32)
44    %6:_(s8), %7:_(s1) = G_UADDO %0, %1
45    G_BRCOND %7(s1), %bb.2
46    G_BR %bb.3
47
48  bb.2:
49    successors:
50
51    G_TRAP
52
53  bb.3:
54    %8:_(s32) = G_ZEXT %6(s8)
55    $w0 = COPY %8(s32)
56    RET_ReallyLR implicit $w0
57
58...
59---
60name:            can_fold_i16_1_result_used_by_zext
61tracksRegLiveness: true
62body:             |
63  ; CHECK-LABEL: name: can_fold_i16_1_result_used_by_zext
64  ; CHECK: bb.0:
65  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
66  ; CHECK-NEXT:   liveins: $w0, $w1
67  ; CHECK-NEXT: {{  $}}
68  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
69  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
70  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
71  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
72  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_ZEXT]], [[ASSERT_ZEXT1]]
73  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65536
74  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C]]
75  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
76  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[AND]](s32), [[C1]]
77  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.2
78  ; CHECK-NEXT:   G_BR %bb.1
79  ; CHECK-NEXT: {{  $}}
80  ; CHECK-NEXT: bb.1:
81  ; CHECK-NEXT:   successors:
82  ; CHECK-NEXT: {{  $}}
83  ; CHECK-NEXT:   G_TRAP
84  ; CHECK-NEXT: {{  $}}
85  ; CHECK-NEXT: bb.2:
86  ; CHECK-NEXT:   $w0 = COPY [[ADD]](s32)
87  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
88  bb.1:
89    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
90    liveins: $w0, $w1
91
92    %2:_(s32) = COPY $w0
93    %3:_(s32) = G_ASSERT_ZEXT %2, 16
94    %0:_(s16) = G_TRUNC %3(s32)
95    %4:_(s32) = COPY $w1
96    %5:_(s32) = G_ASSERT_ZEXT %4, 16
97    %1:_(s16) = G_TRUNC %5(s32)
98    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
99    G_BRCOND %7(s1), %bb.2
100    G_BR %bb.3
101
102  bb.2:
103    successors:
104
105    G_TRAP
106
107  bb.3:
108    %8:_(s32) = G_ZEXT %6(s16)
109    $w0 = COPY %8(s32)
110    RET_ReallyLR implicit $w0
111
112...
113---
114name:            can_fold_i16_2_result_used_by_multiple_calls
115tracksRegLiveness: true
116body:             |
117  ; CHECK-LABEL: name: can_fold_i16_2_result_used_by_multiple_calls
118  ; CHECK: bb.0:
119  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
120  ; CHECK-NEXT:   liveins: $w0, $w1, $x2
121  ; CHECK-NEXT: {{  $}}
122  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
123  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
124  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
125  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
126  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_ZEXT]], [[ASSERT_ZEXT1]]
127  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65536
128  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C]]
129  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
130  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[AND]](s32), [[C1]]
131  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.2
132  ; CHECK-NEXT:   G_BR %bb.1
133  ; CHECK-NEXT: {{  $}}
134  ; CHECK-NEXT: bb.1:
135  ; CHECK-NEXT:   successors:
136  ; CHECK-NEXT: {{  $}}
137  ; CHECK-NEXT:   G_TRAP
138  ; CHECK-NEXT: {{  $}}
139  ; CHECK-NEXT: bb.2:
140  ; CHECK-NEXT:   liveins: $x2
141  ; CHECK-NEXT: {{  $}}
142  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
143  ; CHECK-NEXT:   $w0 = COPY [[ADD]](s32)
144  ; CHECK-NEXT:   BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
145  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
146  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
147  ; CHECK-NEXT:   $w0 = COPY [[ADD]](s32)
148  ; CHECK-NEXT:   BLR killed renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
149  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
150  ; CHECK-NEXT:   RET_ReallyLR
151  bb.1:
152    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
153    liveins: $w0, $w1, $x2
154
155    %2:_(s32) = COPY $w0
156    %3:_(s32) = G_ASSERT_ZEXT %2, 16
157    %0:_(s16) = G_TRUNC %3(s32)
158    %4:_(s32) = COPY $w1
159    %5:_(s32) = G_ASSERT_ZEXT %4, 16
160    %1:_(s16) = G_TRUNC %5(s32)
161    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
162    G_BRCOND %7(s1), %bb.2
163    G_BR %bb.3
164
165  bb.2:
166    successors:
167
168    G_TRAP
169
170  bb.3:
171    liveins: $x2
172
173    ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
174    %8:_(s32) = G_ANYEXT %6(s16)
175    $w0 = COPY %8(s32)
176    BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
177    ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
178    ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
179    $w0 = COPY %8(s32)
180    BLR killed renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
181    ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
182    RET_ReallyLR
183
184...
185---
186name:            can_fold_i16_3_result_used_by_anyext
187tracksRegLiveness: true
188body:             |
189  ; CHECK-LABEL: name: can_fold_i16_3_result_used_by_anyext
190  ; CHECK: bb.0:
191  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
192  ; CHECK-NEXT:   liveins: $w0, $w1
193  ; CHECK-NEXT: {{  $}}
194  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
195  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
196  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
197  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
198  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_ZEXT]], [[ASSERT_ZEXT1]]
199  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65536
200  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C]]
201  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
202  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[AND]](s32), [[C1]]
203  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.2
204  ; CHECK-NEXT:   G_BR %bb.1
205  ; CHECK-NEXT: {{  $}}
206  ; CHECK-NEXT: bb.1:
207  ; CHECK-NEXT:   successors:
208  ; CHECK-NEXT: {{  $}}
209  ; CHECK-NEXT:   G_TRAP
210  ; CHECK-NEXT: {{  $}}
211  ; CHECK-NEXT: bb.2:
212  ; CHECK-NEXT:   $w0 = COPY [[ADD]](s32)
213  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
214  bb.1:
215    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
216    liveins: $w0, $w1
217
218    %2:_(s32) = COPY $w0
219    %3:_(s32) = G_ASSERT_ZEXT %2, 16
220    %0:_(s16) = G_TRUNC %3(s32)
221    %4:_(s32) = COPY $w1
222    %5:_(s32) = G_ASSERT_ZEXT %4, 16
223    %1:_(s16) = G_TRUNC %5(s32)
224    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
225    G_BRCOND %7(s1), %bb.2
226    G_BR %bb.3
227
228  bb.2:
229    successors:
230
231    G_TRAP
232
233  bb.3:
234    %8:_(s32) = G_ANYEXT %6(s16)
235    $w0 = COPY %8(s32)
236    RET_ReallyLR implicit $w0
237
238...
239---
240name:            can_fold_i16_4_cond_dbg_user
241tracksRegLiveness: true
242body:             |
243  ; CHECK-LABEL: name: can_fold_i16_4_cond_dbg_user
244  ; CHECK: bb.0:
245  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
246  ; CHECK-NEXT:   liveins: $w0, $w1
247  ; CHECK-NEXT: {{  $}}
248  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
249  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
250  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
251  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
252  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_ZEXT]], [[ASSERT_ZEXT1]]
253  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65536
254  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C]]
255  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
256  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[AND]](s32), [[C1]]
257  ; CHECK-NEXT:   DBG_VALUE [[ICMP]](s1)
258  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.2
259  ; CHECK-NEXT:   G_BR %bb.1
260  ; CHECK-NEXT: {{  $}}
261  ; CHECK-NEXT: bb.1:
262  ; CHECK-NEXT:   successors:
263  ; CHECK-NEXT: {{  $}}
264  ; CHECK-NEXT:   G_TRAP
265  ; CHECK-NEXT: {{  $}}
266  ; CHECK-NEXT: bb.2:
267  ; CHECK-NEXT:   $w0 = COPY [[ADD]](s32)
268  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
269  bb.1:
270    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
271    liveins: $w0, $w1
272
273    %2:_(s32) = COPY $w0
274    %3:_(s32) = G_ASSERT_ZEXT %2, 16
275    %0:_(s16) = G_TRUNC %3(s32)
276    %4:_(s32) = COPY $w1
277    %5:_(s32) = G_ASSERT_ZEXT %4, 16
278    %1:_(s16) = G_TRUNC %5(s32)
279    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
280    DBG_VALUE %7(s1)
281    G_BRCOND %7(s1), %bb.2
282    G_BR %bb.3
283
284  bb.2:
285    successors:
286
287    G_TRAP
288
289  bb.3:
290    %8:_(s32) = G_ZEXT %6(s16)
291    $w0 = COPY %8(s32)
292    RET_ReallyLR implicit $w0
293
294...
295---
296name:            can_fold_i16_5_result_dbg_user
297tracksRegLiveness: true
298body:             |
299  ; CHECK-LABEL: name: can_fold_i16_5_result_dbg_user
300  ; CHECK: bb.0:
301  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
302  ; CHECK-NEXT:   liveins: $w0, $w1
303  ; CHECK-NEXT: {{  $}}
304  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
305  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
306  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
307  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
308  ; CHECK-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_ZEXT]], [[ASSERT_ZEXT1]]
309  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65536
310  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ADD]], [[C]]
311  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
312  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[AND]](s32), [[C1]]
313  ; CHECK-NEXT:   DBG_VALUE %6:_(s16)
314  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.2
315  ; CHECK-NEXT:   G_BR %bb.1
316  ; CHECK-NEXT: {{  $}}
317  ; CHECK-NEXT: bb.1:
318  ; CHECK-NEXT:   successors:
319  ; CHECK-NEXT: {{  $}}
320  ; CHECK-NEXT:   G_TRAP
321  ; CHECK-NEXT: {{  $}}
322  ; CHECK-NEXT: bb.2:
323  ; CHECK-NEXT:   $w0 = COPY [[ADD]](s32)
324  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
325  bb.1:
326    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
327    liveins: $w0, $w1
328
329    %2:_(s32) = COPY $w0
330    %3:_(s32) = G_ASSERT_ZEXT %2, 16
331    %0:_(s16) = G_TRUNC %3(s32)
332    %4:_(s32) = COPY $w1
333    %5:_(s32) = G_ASSERT_ZEXT %4, 16
334    %1:_(s16) = G_TRUNC %5(s32)
335    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
336    DBG_VALUE %6(s16)
337    G_BRCOND %7(s1), %bb.2
338    G_BR %bb.3
339
340  bb.2:
341    successors:
342
343    G_TRAP
344
345  bb.3:
346    %8:_(s32) = G_ZEXT %6(s16)
347    $w0 = COPY %8(s32)
348    RET_ReallyLR implicit $w0
349
350...
351---
352name:            cannot_fold_1_result_used_before_branch
353tracksRegLiveness: true
354body:             |
355  ; CHECK-LABEL: name: cannot_fold_1_result_used_before_branch
356  ; CHECK: bb.0:
357  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
358  ; CHECK-NEXT:   liveins: $w0, $w1, $x2
359  ; CHECK-NEXT: {{  $}}
360  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
361  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
362  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)
363  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
364  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
365  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT1]](s32)
366  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s16), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC]], [[TRUNC1]]
367  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
368  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UADDO]](s16)
369  ; CHECK-NEXT:   $w0 = COPY [[ANYEXT]](s32)
370  ; CHECK-NEXT:   BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
371  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
372  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
373  ; CHECK-NEXT:   [[XOR:%[0-9]+]]:_(s1) = G_XOR [[UADDO1]], [[C]]
374  ; CHECK-NEXT:   G_BRCOND [[XOR]](s1), %bb.2
375  ; CHECK-NEXT:   G_BR %bb.1
376  ; CHECK-NEXT: {{  $}}
377  ; CHECK-NEXT: bb.1:
378  ; CHECK-NEXT:   successors:
379  ; CHECK-NEXT: {{  $}}
380  ; CHECK-NEXT:   G_TRAP
381  ; CHECK-NEXT: {{  $}}
382  ; CHECK-NEXT: bb.2:
383  ; CHECK-NEXT:   liveins: $x2
384  ; CHECK-NEXT: {{  $}}
385  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
386  ; CHECK-NEXT:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UADDO]](s16)
387  ; CHECK-NEXT:   $w0 = COPY [[ANYEXT1]](s32)
388  ; CHECK-NEXT:   BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
389  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
390  ; CHECK-NEXT:   RET_ReallyLR
391  bb.1:
392    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
393    liveins: $w0, $w1, $x2
394
395    %2:_(s32) = COPY $w0
396    %3:_(s32) = G_ASSERT_ZEXT %2, 16
397    %0:_(s16) = G_TRUNC %3(s32)
398    %4:_(s32) = COPY $w1
399    %5:_(s32) = G_ASSERT_ZEXT %4, 16
400    %1:_(s16) = G_TRUNC %5(s32)
401    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
402    ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
403    %8:_(s32) = G_ANYEXT %6(s16)
404    $w0 = COPY %8(s32)
405    BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
406    ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
407    G_BRCOND %7(s1), %bb.2
408    G_BR %bb.3
409
410  bb.2:
411    successors:
412
413    G_TRAP
414
415  bb.3:
416    liveins: $x2
417
418    ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
419    %9:_(s32) = G_ANYEXT %6(s16)
420    $w0 = COPY %9(s32)
421    BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
422    ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
423    RET_ReallyLR
424
425...
426---
427name:            cannot_fold_2_result_used_in_fail_block
428tracksRegLiveness: true
429body:             |
430  ; CHECK-LABEL: name: cannot_fold_2_result_used_in_fail_block
431  ; CHECK: bb.0:
432  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
433  ; CHECK-NEXT:   liveins: $w0, $w1
434  ; CHECK-NEXT: {{  $}}
435  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
436  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
437  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)
438  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
439  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
440  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT1]](s32)
441  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 10
442  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s16), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC]], [[TRUNC1]]
443  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UADDO]](s16)
444  ; CHECK-NEXT:   G_BRCOND [[UADDO1]](s1), %bb.2
445  ; CHECK-NEXT:   G_BR %bb.1
446  ; CHECK-NEXT: {{  $}}
447  ; CHECK-NEXT: bb.1:
448  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(s32) = G_PHI [[C]](s32), %bb.2, [[ANYEXT]](s32), %bb.0
449  ; CHECK-NEXT:   $w0 = COPY [[PHI]](s32)
450  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
451  ; CHECK-NEXT: {{  $}}
452  ; CHECK-NEXT: bb.2:
453  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
454  ; CHECK-NEXT: {{  $}}
455  ; CHECK-NEXT:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UADDO]](s16)
456  ; CHECK-NEXT:   $w0 = COPY [[ANYEXT1]](s32)
457  ; CHECK-NEXT:   G_BR %bb.1
458  bb.1:
459    liveins: $w0, $w1
460
461    %2:_(s32) = COPY $w0
462    %3:_(s32) = G_ASSERT_ZEXT %2, 16
463    %0:_(s16) = G_TRUNC %3(s32)
464    %4:_(s32) = COPY $w1
465    %5:_(s32) = G_ASSERT_ZEXT %4, 16
466    %1:_(s16) = G_TRUNC %5(s32)
467    %11:_(s16) = G_CONSTANT i16 10
468    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
469    G_BRCOND %7(s1), %bb.3
470    G_BR %bb.2
471
472  bb.2:
473    %9:_(s16) = G_PHI %11(s16), %bb.3, %6(s16), %bb.1
474    %10:_(s32) = G_ANYEXT %9(s16)
475    $w0 = COPY %10(s32)
476    RET_ReallyLR implicit $w0
477
478  bb.3:
479    %8:_(s32) = G_ANYEXT %6(s16)
480    $w0 = COPY %8(s32)
481    G_BR %bb.2
482
483...
484---
485name:            cannot_fold_3_result_used_in_successor_before_fail_block
486tracksRegLiveness: true
487body:             |
488  ; CHECK-LABEL: name: cannot_fold_3_result_used_in_successor_before_fail_block
489  ; CHECK: bb.0:
490  ; CHECK-NEXT:   successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
491  ; CHECK-NEXT:   liveins: $w0, $w1, $x2
492  ; CHECK-NEXT: {{  $}}
493  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
494  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
495  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)
496  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
497  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
498  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT1]](s32)
499  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s16), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC]], [[TRUNC1]]
500  ; CHECK-NEXT:   G_BR %bb.1
501  ; CHECK-NEXT: {{  $}}
502  ; CHECK-NEXT: bb.1:
503  ; CHECK-NEXT:   successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
504  ; CHECK-NEXT:   liveins: $x2
505  ; CHECK-NEXT: {{  $}}
506  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UADDO]](s16)
507  ; CHECK-NEXT:   $w0 = COPY [[ANYEXT]](s32)
508  ; CHECK-NEXT:   BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
509  ; CHECK-NEXT:   G_BRCOND [[UADDO1]](s1), %bb.2
510  ; CHECK-NEXT:   G_BR %bb.3
511  ; CHECK-NEXT: {{  $}}
512  ; CHECK-NEXT: bb.2:
513  ; CHECK-NEXT:   successors:
514  ; CHECK-NEXT: {{  $}}
515  ; CHECK-NEXT:   G_TRAP
516  ; CHECK-NEXT: {{  $}}
517  ; CHECK-NEXT: bb.3:
518  ; CHECK-NEXT:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[UADDO]](s16)
519  ; CHECK-NEXT:   $w0 = COPY [[ZEXT]](s32)
520  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
521  bb.1:
522    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
523    liveins: $w0, $w1, $x2
524
525    %2:_(s32) = COPY $w0
526    %3:_(s32) = G_ASSERT_ZEXT %2, 16
527    %0:_(s16) = G_TRUNC %3(s32)
528    %4:_(s32) = COPY $w1
529    %5:_(s32) = G_ASSERT_ZEXT %4, 16
530    %1:_(s16) = G_TRUNC %5(s32)
531    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
532    G_BR %bb.4
533
534  bb.4:
535    liveins: $x2
536    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
537
538    %8:_(s32) = G_ANYEXT %6(s16)
539    $w0 = COPY %8(s32)
540    BLR renamable $x2, implicit-def dead $lr, implicit $sp, implicit $w0
541    G_BRCOND %7(s1), %bb.2
542    G_BR %bb.3
543
544  bb.2:
545    successors:
546
547    G_TRAP
548
549  bb.3:
550    %9:_(s32) = G_ZEXT %6(s16)
551    $w0 = COPY %9(s32)
552    RET_ReallyLR implicit $w0
553
554...
555---
556name:            cannot_fold_i8_trunc_i
557tracksRegLiveness: true
558body:             |
559  ; CHECK-LABEL: name: cannot_fold_i8_trunc_i
560  ; CHECK: bb.0:
561  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
562  ; CHECK-NEXT:   liveins: $w0, $w1
563  ; CHECK-NEXT: {{  $}}
564  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
565  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
566  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)
567  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
568  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 8
569  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[ASSERT_ZEXT1]](s32)
570  ; CHECK-NEXT:   [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16)
571  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s8), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC2]], [[TRUNC1]]
572  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
573  ; CHECK-NEXT:   [[XOR:%[0-9]+]]:_(s1) = G_XOR [[UADDO1]], [[C]]
574  ; CHECK-NEXT:   G_BRCOND [[XOR]](s1), %bb.2
575  ; CHECK-NEXT:   G_BR %bb.1
576  ; CHECK-NEXT: {{  $}}
577  ; CHECK-NEXT: bb.1:
578  ; CHECK-NEXT:   successors:
579  ; CHECK-NEXT: {{  $}}
580  ; CHECK-NEXT:   G_TRAP
581  ; CHECK-NEXT: {{  $}}
582  ; CHECK-NEXT: bb.2:
583  ; CHECK-NEXT:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[UADDO]](s8)
584  ; CHECK-NEXT:   $w0 = COPY [[ZEXT]](s32)
585  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
586  bb.1:
587    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
588    liveins: $w0, $w1
589
590    %2:_(s32) = COPY $w0
591    %3:_(s32) = G_ASSERT_ZEXT %2, 16
592    %0:_(s16) = G_TRUNC %3(s32)
593    %4:_(s32) = COPY $w1
594    %5:_(s32) = G_ASSERT_ZEXT %4, 8
595    %1:_(s8) = G_TRUNC %5(s32)
596    %6:_(s8) = G_TRUNC %0(s16)
597    %7:_(s8), %8:_(s1) = G_UADDO %6, %1
598    G_BRCOND %8(s1), %bb.2
599    G_BR %bb.3
600
601  bb.2:
602    successors:
603
604    G_TRAP
605
606  bb.3:
607    %9:_(s32) = G_ZEXT %7(s8)
608    $w0 = COPY %9(s32)
609    RET_ReallyLR implicit $w0
610
611...
612---
613name:            cannot_fold_i8_trunc_b
614tracksRegLiveness: true
615body:             |
616  ; CHECK-LABEL: name: cannot_fold_i8_trunc_b
617  ; CHECK: bb.0:
618  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
619  ; CHECK-NEXT:   liveins: $w0, $w1
620  ; CHECK-NEXT: {{  $}}
621  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
622  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 8
623  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[ASSERT_ZEXT]](s32)
624  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
625  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
626  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT1]](s32)
627  ; CHECK-NEXT:   [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC1]](s16)
628  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s8), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC]], [[TRUNC2]]
629  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
630  ; CHECK-NEXT:   [[XOR:%[0-9]+]]:_(s1) = G_XOR [[UADDO1]], [[C]]
631  ; CHECK-NEXT:   G_BRCOND [[XOR]](s1), %bb.2
632  ; CHECK-NEXT:   G_BR %bb.1
633  ; CHECK-NEXT: {{  $}}
634  ; CHECK-NEXT: bb.1:
635  ; CHECK-NEXT:   successors:
636  ; CHECK-NEXT: {{  $}}
637  ; CHECK-NEXT:   G_TRAP
638  ; CHECK-NEXT: {{  $}}
639  ; CHECK-NEXT: bb.2:
640  ; CHECK-NEXT:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[UADDO]](s8)
641  ; CHECK-NEXT:   $w0 = COPY [[ZEXT]](s32)
642  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
643  bb.1:
644    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
645    liveins: $w0, $w1
646
647    %2:_(s32) = COPY $w0
648    %3:_(s32) = G_ASSERT_ZEXT %2, 8
649    %0:_(s8) = G_TRUNC %3(s32)
650    %4:_(s32) = COPY $w1
651    %5:_(s32) = G_ASSERT_ZEXT %4, 16
652    %1:_(s16) = G_TRUNC %5(s32)
653    %6:_(s8) = G_TRUNC %1(s16)
654    %7:_(s8), %8:_(s1) = G_UADDO %0, %6
655    G_BRCOND %8(s1), %bb.2
656    G_BR %bb.3
657
658  bb.2:
659    successors:
660
661    G_TRAP
662
663  bb.3:
664    %9:_(s32) = G_ZEXT %7(s8)
665    $w0 = COPY %9(s32)
666    RET_ReallyLR implicit $w0
667
668...
669---
670name:            cannot_fold_i8_trunc_both
671tracksRegLiveness: true
672body:             |
673  ; CHECK-LABEL: name: cannot_fold_i8_trunc_both
674  ; CHECK: bb.0:
675  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
676  ; CHECK-NEXT:   liveins: $w0, $w1
677  ; CHECK-NEXT: {{  $}}
678  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
679  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
680  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)
681  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
682  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
683  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT1]](s32)
684  ; CHECK-NEXT:   [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16)
685  ; CHECK-NEXT:   [[TRUNC3:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC1]](s16)
686  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s8), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC2]], [[TRUNC3]]
687  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
688  ; CHECK-NEXT:   [[XOR:%[0-9]+]]:_(s1) = G_XOR [[UADDO1]], [[C]]
689  ; CHECK-NEXT:   G_BRCOND [[XOR]](s1), %bb.2
690  ; CHECK-NEXT:   G_BR %bb.1
691  ; CHECK-NEXT: {{  $}}
692  ; CHECK-NEXT: bb.1:
693  ; CHECK-NEXT:   successors:
694  ; CHECK-NEXT: {{  $}}
695  ; CHECK-NEXT:   G_TRAP
696  ; CHECK-NEXT: {{  $}}
697  ; CHECK-NEXT: bb.2:
698  ; CHECK-NEXT:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[UADDO]](s8)
699  ; CHECK-NEXT:   $w0 = COPY [[ZEXT]](s32)
700  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
701  bb.1:
702    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
703    liveins: $w0, $w1
704
705    %2:_(s32) = COPY $w0
706    %3:_(s32) = G_ASSERT_ZEXT %2, 16
707    %0:_(s16) = G_TRUNC %3(s32)
708    %4:_(s32) = COPY $w1
709    %5:_(s32) = G_ASSERT_ZEXT %4, 16
710    %1:_(s16) = G_TRUNC %5(s32)
711    %6:_(s8) = G_TRUNC %0(s16)
712    %7:_(s8) = G_TRUNC %1(s16)
713    %8:_(s8), %9:_(s1) = G_UADDO %6, %7
714    G_BRCOND %9(s1), %bb.2
715    G_BR %bb.3
716
717  bb.2:
718    successors:
719
720    G_TRAP
721
722  bb.3:
723    %10:_(s32) = G_ZEXT %8(s8)
724    $w0 = COPY %10(s32)
725    RET_ReallyLR implicit $w0
726
727...
728---
729name:            cannot_fold_overflow_status_used_in_select
730tracksRegLiveness: true
731body:             |
732  bb.1:
733    liveins: $w0, $w1
734
735    ; CHECK-LABEL: name: cannot_fold_overflow_status_used_in_select
736    ; CHECK: liveins: $w0, $w1
737    ; CHECK-NEXT: {{  $}}
738    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
739    ; CHECK-NEXT: [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
740    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)
741    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
742    ; CHECK-NEXT: [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
743    ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT1]](s32)
744    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 10
745    ; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s16), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC]], [[TRUNC1]]
746    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s16) = G_SELECT [[UADDO1]](s1), [[C]], [[UADDO]]
747    ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[SELECT]](s16)
748    ; CHECK-NEXT: $w0 = COPY [[ZEXT]](s32)
749    ; CHECK-NEXT: RET_ReallyLR implicit $w0
750    %2:_(s32) = COPY $w0
751    %3:_(s32) = G_ASSERT_ZEXT %2, 16
752    %0:_(s16) = G_TRUNC %3(s32)
753    %4:_(s32) = COPY $w1
754    %5:_(s32) = G_ASSERT_ZEXT %4, 16
755    %1:_(s16) = G_TRUNC %5(s32)
756    %9:_(s16) = G_CONSTANT i16 10
757    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
758    %8:_(s16) = G_SELECT %7(s1), %9, %6
759    %10:_(s32) = G_ZEXT %8(s16)
760    $w0 = COPY %10(s32)
761    RET_ReallyLR implicit $w0
762
763...
764---
765name:            cannot_fold_i16_inputs_not_assert_zext
766tracksRegLiveness: true
767body:             |
768  ; CHECK-LABEL: name: cannot_fold_i16_inputs_not_assert_zext
769  ; CHECK: bb.0:
770  ; CHECK-NEXT:   successors: %bb.1(0x00000800), %bb.2(0x7ffff800)
771  ; CHECK-NEXT:   liveins: $w0, $w1
772  ; CHECK-NEXT: {{  $}}
773  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
774  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
775  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
776  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)
777  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s16), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC]], [[TRUNC1]]
778  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
779  ; CHECK-NEXT:   [[XOR:%[0-9]+]]:_(s1) = G_XOR [[UADDO1]], [[C]]
780  ; CHECK-NEXT:   G_BRCOND [[XOR]](s1), %bb.2
781  ; CHECK-NEXT:   G_BR %bb.1
782  ; CHECK-NEXT: {{  $}}
783  ; CHECK-NEXT: bb.1:
784  ; CHECK-NEXT:   successors:
785  ; CHECK-NEXT: {{  $}}
786  ; CHECK-NEXT:   G_TRAP
787  ; CHECK-NEXT: {{  $}}
788  ; CHECK-NEXT: bb.2:
789  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UADDO]](s16)
790  ; CHECK-NEXT:   $w0 = COPY [[ANYEXT]](s32)
791  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
792  bb.1:
793    successors: %bb.2(0x00000800), %bb.3(0x7ffff800)
794    liveins: $w0, $w1
795
796    %2:_(s32) = COPY $w0
797    %0:_(s16) = G_TRUNC %2(s32)
798    %3:_(s32) = COPY $w1
799    %1:_(s16) = G_TRUNC %3(s32)
800    %4:_(s16), %5:_(s1) = G_UADDO %0, %1
801    G_BRCOND %5(s1), %bb.2
802    G_BR %bb.3
803
804  bb.2:
805    successors:
806
807    G_TRAP
808
809  bb.3:
810    %6:_(s32) = G_ANYEXT %4(s16)
811    $w0 = COPY %6(s32)
812    RET_ReallyLR implicit $w0
813
814...
815---
816name:            cannot_fold_branch_to_use_on_overflow
817tracksRegLiveness: true
818body:             |
819  ; CHECK-LABEL: name: cannot_fold_branch_to_use_on_overflow
820  ; CHECK: bb.0:
821  ; CHECK-NEXT:   successors: %bb.1(0x7ffff800), %bb.2(0x00000800)
822  ; CHECK-NEXT:   liveins: $w0, $w1
823  ; CHECK-NEXT: {{  $}}
824  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
825  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16
826  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)
827  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
828  ; CHECK-NEXT:   [[ASSERT_ZEXT1:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY1]], 16
829  ; CHECK-NEXT:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT1]](s32)
830  ; CHECK-NEXT:   [[UADDO:%[0-9]+]]:_(s16), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[TRUNC]], [[TRUNC1]]
831  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
832  ; CHECK-NEXT:   [[XOR:%[0-9]+]]:_(s1) = G_XOR [[UADDO1]], [[C]]
833  ; CHECK-NEXT:   G_BRCOND [[XOR]](s1), %bb.2
834  ; CHECK-NEXT:   G_BR %bb.1
835  ; CHECK-NEXT: {{  $}}
836  ; CHECK-NEXT: bb.1:
837  ; CHECK-NEXT:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[UADDO]](s16)
838  ; CHECK-NEXT:   $w0 = COPY [[ZEXT]](s32)
839  ; CHECK-NEXT:   RET_ReallyLR implicit $w0
840  ; CHECK-NEXT: {{  $}}
841  ; CHECK-NEXT: bb.2:
842  ; CHECK-NEXT:   G_TRAP
843  bb.1:
844    successors: %bb.2(0x7ffff800), %bb.3(0x00000800)
845    liveins: $w0, $w1
846
847    %2:_(s32) = COPY $w0
848    %3:_(s32) = G_ASSERT_ZEXT %2, 16
849    %0:_(s16) = G_TRUNC %3(s32)
850    %4:_(s32) = COPY $w1
851    %5:_(s32) = G_ASSERT_ZEXT %4, 16
852    %1:_(s16) = G_TRUNC %5(s32)
853    %6:_(s16), %7:_(s1) = G_UADDO %0, %1
854    G_BRCOND %7(s1), %bb.2
855    G_BR %bb.3
856
857  bb.2:
858    %8:_(s32) = G_ZEXT %6(s16)
859    $w0 = COPY %8(s32)
860    RET_ReallyLR implicit $w0
861
862  bb.3:
863    G_TRAP
864
865...
866