1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=thumbv7 -run-pass=if-converter %s -o - | FileCheck %s
3--- |
4  define void @test_nosize() {
5    %c0 = icmp sgt i64 0, 0
6    br i1 %c0, label %b1, label %b6
7
8  b1:                                               ; preds = %0
9    br i1 undef, label %b3, label %b2
10
11  b2:                                               ; preds = %b1
12    %v0 = tail call i32 @extfunc()
13    br label %b5
14
15  b3:                                               ; preds = %b1
16    %v1 = load i32, i32* undef, align 4
17    %v2 = and i32 %v1, 256
18    br label %b5
19
20  b5:                                               ; preds = %b3, %b2
21    %v3 = phi i32 [ %v2, %b3 ], [ %v0, %b2 ]
22    %c1 = icmp eq i32 %v3, 0
23    br i1 %c1, label %b8, label %b7
24
25  b6:                                               ; preds = %0
26    %1 = tail call i32 @extfunc()
27    ret void
28
29  b7:                                               ; preds = %b5
30    %2 = tail call i32 @extfunc()
31    ret void
32
33  b8:                                               ; preds = %b5
34    ret void
35  }
36
37  ; Function Attrs: optsize
38  define void @test_optsize() #0 {
39    %c0 = icmp sgt i64 0, 0
40    br i1 %c0, label %b1, label %b6
41
42  b1:                                               ; preds = %0
43    br i1 undef, label %b3, label %b2
44
45  b2:                                               ; preds = %b1
46    %v0 = tail call i32 @extfunc()
47    br label %b5
48
49  b3:                                               ; preds = %b1
50    %v1 = load i32, i32* undef, align 4
51    %v2 = and i32 %v1, 256
52    br label %b5
53
54  b5:                                               ; preds = %b3, %b2
55    %v3 = phi i32 [ %v2, %b3 ], [ %v0, %b2 ]
56    %c1 = icmp eq i32 %v3, 0
57    br i1 %c1, label %b8, label %b7
58
59  b6:                                               ; preds = %0
60    %1 = tail call i32 @extfunc()
61    ret void
62
63  b7:                                               ; preds = %b5
64    %2 = tail call i32 @extfunc()
65    ret void
66
67  b8:                                               ; preds = %b5
68    ret void
69  }
70
71  ; Function Attrs: minsize
72  define void @test_minsize() #1 {
73    %c0 = icmp sgt i64 0, 0
74    br i1 %c0, label %b1, label %b6
75
76  b1:                                               ; preds = %0
77    br i1 undef, label %b3, label %b2
78
79  b2:                                               ; preds = %b1
80    %v0 = tail call i32 @extfunc()
81    br label %b5
82
83  b3:                                               ; preds = %b1
84    %v1 = load i32, i32* undef, align 4
85    %v2 = and i32 %v1, 256
86    br label %b5
87
88  b5:                                               ; preds = %b3, %b2
89    %v3 = phi i32 [ %v2, %b3 ], [ %v0, %b2 ]
90    %c1 = icmp eq i32 %v3, 0
91    br i1 %c1, label %b8, label %b7
92
93  b6:                                               ; preds = %0
94    %1 = tail call i32 @extfunc()
95    ret void
96
97  b7:                                               ; preds = %b5
98    %2 = tail call i32 @extfunc()
99    ret void
100
101  b8:                                               ; preds = %b5
102    ret void
103  }
104
105  declare i32 @extfunc()
106
107  ; Function Attrs: nounwind
108  declare void @llvm.stackprotector(i8*, i8**) #2
109
110  attributes #0 = { optsize }
111  attributes #1 = { minsize }
112  attributes #2 = { nounwind }
113
114...
115---
116name:            test_nosize
117alignment:       2
118exposesReturnsTwice: false
119legalized:       false
120regBankSelected: false
121selected:        false
122failedISel:      false
123tracksRegLiveness: true
124hasWinCFI:       false
125registers:       []
126liveins:         []
127frameInfo:
128  isFrameAddressTaken: false
129  isReturnAddressTaken: false
130  hasStackMap:     false
131  hasPatchPoint:   false
132  stackSize:       8
133  offsetAdjustment: 0
134  maxAlignment:    4
135  adjustsStack:    true
136  hasCalls:        true
137  stackProtector:  ''
138  maxCallFrameSize: 0
139  cvBytesOfCalleeSavedRegisters: 0
140  hasOpaqueSPAdjustment: false
141  hasVAStart:      false
142  hasMustTailInVarArgFunc: false
143  localFrameSize:  0
144  savePoint:       ''
145  restorePoint:    ''
146fixedStack:      []
147stack:
148  - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
149      stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
150      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
151  - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
152      stack-id: default, callee-saved-register: '$r7', callee-saved-restored: true,
153      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
154callSites:       []
155constants:       []
156machineFunctionInfo: {}
157body:             |
158  ; CHECK-LABEL: name: test_nosize
159  ; CHECK: bb.0 (%ir-block.0):
160  ; CHECK:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
161  ; CHECK:   liveins: $lr, $r7
162  ; CHECK:   renamable $r0 = t2MOVi 1, 14, $noreg, $noreg
163  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
164  ; CHECK:   tTAILJMPdND @extfunc, 1, killed $cpsr, implicit $sp, implicit $sp
165  ; CHECK:   $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r7, killed $lr
166  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
167  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
168  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r7, -8
169  ; CHECK:   renamable $r0 = t2MOVi 0, 14, $noreg, $noreg
170  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
171  ; CHECK:   t2Bcc %bb.2, 1, killed $cpsr
172  ; CHECK: bb.1.b2:
173  ; CHECK:   successors: %bb.3(0x80000000)
174  ; CHECK:   tBL 14, $noreg, @extfunc, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $r0
175  ; CHECK:   t2B %bb.3, 14, $noreg
176  ; CHECK: bb.2.b3:
177  ; CHECK:   successors: %bb.3(0x80000000)
178  ; CHECK:   renamable $r0 = t2LDRi12 undef renamable $r0, 0, 14, $noreg :: (load 4 from `i32* undef`)
179  ; CHECK:   renamable $r0 = t2ANDri killed renamable $r0, 256, 14, $noreg, $noreg
180  ; CHECK: bb.3.b5:
181  ; CHECK:   liveins: $r0
182  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
183  ; CHECK:   $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r7, def $lr
184  ; CHECK:   tBX_RET 0, killed $cpsr
185  ; CHECK:   tTAILJMPdND @extfunc, 14, $noreg, implicit $sp, implicit $sp
186  bb.0 (%ir-block.0):
187    successors: %bb.1(0x50000000), %bb.6(0x30000000)
188    liveins: $lr, $r7
189
190    renamable $r0 = t2MOVi 1, 14, $noreg, $noreg
191    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
192    t2Bcc %bb.6, 1, killed $cpsr
193
194  bb.1.b1:
195    successors: %bb.3(0x40000000), %bb.2(0x40000000)
196    liveins: $r7, $lr
197
198    $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r7, killed $lr
199    frame-setup CFI_INSTRUCTION def_cfa_offset 8
200    frame-setup CFI_INSTRUCTION offset $lr, -4
201    frame-setup CFI_INSTRUCTION offset $r7, -8
202    renamable $r0 = t2MOVi 0, 14, $noreg, $noreg
203    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
204    t2Bcc %bb.3, 1, killed $cpsr
205
206  bb.2.b2:
207    successors: %bb.4(0x80000000)
208
209    tBL 14, $noreg, @extfunc, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $r0
210    t2B %bb.4, 14, $noreg
211
212  bb.3.b3:
213    successors: %bb.4(0x80000000)
214
215    renamable $r0 = t2LDRi12 undef renamable $r0, 0, 14, $noreg :: (load 4 from `i32* undef`)
216    renamable $r0 = t2ANDri killed renamable $r0, 256, 14, $noreg, $noreg
217
218  bb.4.b5:
219    successors: %bb.5(0x30000000), %bb.6(0x50000000)
220    liveins: $r0
221
222    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
223    $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r7, def $lr
224    t2Bcc %bb.6, 1, killed $cpsr
225
226  bb.5.b8:
227    liveins: $lr, $r7
228
229    tBX_RET 14, $noreg
230
231  bb.6.b7:
232    liveins: $lr, $r7
233
234    tTAILJMPdND @extfunc, 14, $noreg, implicit $sp, implicit $sp
235
236...
237---
238name:            test_optsize
239alignment:       2
240exposesReturnsTwice: false
241legalized:       false
242regBankSelected: false
243selected:        false
244failedISel:      false
245tracksRegLiveness: true
246hasWinCFI:       false
247registers:       []
248liveins:         []
249frameInfo:
250  isFrameAddressTaken: false
251  isReturnAddressTaken: false
252  hasStackMap:     false
253  hasPatchPoint:   false
254  stackSize:       8
255  offsetAdjustment: 0
256  maxAlignment:    4
257  adjustsStack:    true
258  hasCalls:        true
259  stackProtector:  ''
260  maxCallFrameSize: 0
261  cvBytesOfCalleeSavedRegisters: 0
262  hasOpaqueSPAdjustment: false
263  hasVAStart:      false
264  hasMustTailInVarArgFunc: false
265  localFrameSize:  0
266  savePoint:       ''
267  restorePoint:    ''
268fixedStack:      []
269stack:
270  - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
271      stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
272      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
273  - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
274      stack-id: default, callee-saved-register: '$r7', callee-saved-restored: true,
275      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
276callSites:       []
277constants:       []
278machineFunctionInfo: {}
279body:             |
280  ; CHECK-LABEL: name: test_optsize
281  ; CHECK: bb.0 (%ir-block.0):
282  ; CHECK:   successors: %bb.1(0x50000000), %bb.6(0x30000000)
283  ; CHECK:   liveins: $lr, $r7
284  ; CHECK:   renamable $r0 = t2MOVi 1, 14, $noreg, $noreg
285  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
286  ; CHECK:   t2Bcc %bb.6, 1, killed $cpsr
287  ; CHECK: bb.1.b1:
288  ; CHECK:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
289  ; CHECK:   liveins: $r7, $lr
290  ; CHECK:   $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r7, killed $lr
291  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
292  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
293  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r7, -8
294  ; CHECK:   renamable $r0 = t2MOVi 0, 14, $noreg, $noreg
295  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
296  ; CHECK:   t2Bcc %bb.3, 1, killed $cpsr
297  ; CHECK: bb.2.b2:
298  ; CHECK:   successors: %bb.4(0x80000000)
299  ; CHECK:   tBL 14, $noreg, @extfunc, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $r0
300  ; CHECK:   t2B %bb.4, 14, $noreg
301  ; CHECK: bb.3.b3:
302  ; CHECK:   successors: %bb.4(0x80000000)
303  ; CHECK:   renamable $r0 = t2LDRi12 undef renamable $r0, 0, 14, $noreg :: (load 4 from `i32* undef`)
304  ; CHECK:   renamable $r0 = t2ANDri killed renamable $r0, 256, 14, $noreg, $noreg
305  ; CHECK: bb.4.b5:
306  ; CHECK:   successors: %bb.5(0x30000000), %bb.6(0x50000000)
307  ; CHECK:   liveins: $r0
308  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
309  ; CHECK:   $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r7, def $lr
310  ; CHECK:   t2Bcc %bb.6, 1, killed $cpsr
311  ; CHECK: bb.5.b8:
312  ; CHECK:   liveins: $lr, $r7
313  ; CHECK:   tBX_RET 14, $noreg
314  ; CHECK: bb.6.b7:
315  ; CHECK:   liveins: $lr, $r7
316  ; CHECK:   tTAILJMPdND @extfunc, 14, $noreg, implicit $sp, implicit $sp
317  bb.0 (%ir-block.0):
318    successors: %bb.1(0x50000000), %bb.6(0x30000000)
319    liveins: $lr, $r7
320
321    renamable $r0 = t2MOVi 1, 14, $noreg, $noreg
322    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
323    t2Bcc %bb.6, 1, killed $cpsr
324
325  bb.1.b1:
326    successors: %bb.3(0x40000000), %bb.2(0x40000000)
327    liveins: $r7, $lr
328
329    $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r7, killed $lr
330    frame-setup CFI_INSTRUCTION def_cfa_offset 8
331    frame-setup CFI_INSTRUCTION offset $lr, -4
332    frame-setup CFI_INSTRUCTION offset $r7, -8
333    renamable $r0 = t2MOVi 0, 14, $noreg, $noreg
334    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
335    t2Bcc %bb.3, 1, killed $cpsr
336
337  bb.2.b2:
338    successors: %bb.4(0x80000000)
339
340    tBL 14, $noreg, @extfunc, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $r0
341    t2B %bb.4, 14, $noreg
342
343  bb.3.b3:
344    successors: %bb.4(0x80000000)
345
346    renamable $r0 = t2LDRi12 undef renamable $r0, 0, 14, $noreg :: (load 4 from `i32* undef`)
347    renamable $r0 = t2ANDri killed renamable $r0, 256, 14, $noreg, $noreg
348
349  bb.4.b5:
350    successors: %bb.5(0x30000000), %bb.6(0x50000000)
351    liveins: $r0
352
353    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
354    $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r7, def $lr
355    t2Bcc %bb.6, 1, killed $cpsr
356
357  bb.5.b8:
358    liveins: $lr, $r7
359
360    tBX_RET 14, $noreg
361
362  bb.6.b7:
363    liveins: $lr, $r7
364
365    tTAILJMPdND @extfunc, 14, $noreg, implicit $sp, implicit $sp
366
367...
368---
369name:            test_minsize
370alignment:       2
371exposesReturnsTwice: false
372legalized:       false
373regBankSelected: false
374selected:        false
375failedISel:      false
376tracksRegLiveness: true
377hasWinCFI:       false
378registers:       []
379liveins:         []
380frameInfo:
381  isFrameAddressTaken: false
382  isReturnAddressTaken: false
383  hasStackMap:     false
384  hasPatchPoint:   false
385  stackSize:       8
386  offsetAdjustment: 0
387  maxAlignment:    4
388  adjustsStack:    true
389  hasCalls:        true
390  stackProtector:  ''
391  maxCallFrameSize: 0
392  cvBytesOfCalleeSavedRegisters: 0
393  hasOpaqueSPAdjustment: false
394  hasVAStart:      false
395  hasMustTailInVarArgFunc: false
396  localFrameSize:  0
397  savePoint:       ''
398  restorePoint:    ''
399fixedStack:      []
400stack:
401  - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
402      stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
403      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
404  - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
405      stack-id: default, callee-saved-register: '$r7', callee-saved-restored: true,
406      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
407callSites:       []
408constants:       []
409machineFunctionInfo: {}
410body:             |
411  ; CHECK-LABEL: name: test_minsize
412  ; CHECK: bb.0 (%ir-block.0):
413  ; CHECK:   successors: %bb.1(0x50000000), %bb.6(0x30000000)
414  ; CHECK:   liveins: $lr, $r7
415  ; CHECK:   renamable $r0 = t2MOVi 1, 14, $noreg, $noreg
416  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
417  ; CHECK:   t2Bcc %bb.6, 1, killed $cpsr
418  ; CHECK: bb.1.b1:
419  ; CHECK:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
420  ; CHECK:   liveins: $r7, $lr
421  ; CHECK:   $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r7, killed $lr
422  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
423  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
424  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r7, -8
425  ; CHECK:   renamable $r0 = t2MOVi 0, 14, $noreg, $noreg
426  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
427  ; CHECK:   t2Bcc %bb.3, 1, killed $cpsr
428  ; CHECK: bb.2.b2:
429  ; CHECK:   successors: %bb.4(0x80000000)
430  ; CHECK:   tBL 14, $noreg, @extfunc, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $r0
431  ; CHECK:   t2B %bb.4, 14, $noreg
432  ; CHECK: bb.3.b3:
433  ; CHECK:   successors: %bb.4(0x80000000)
434  ; CHECK:   renamable $r0 = t2LDRi12 undef renamable $r0, 0, 14, $noreg :: (load 4 from `i32* undef`)
435  ; CHECK:   renamable $r0 = t2ANDri killed renamable $r0, 256, 14, $noreg, $noreg
436  ; CHECK: bb.4.b5:
437  ; CHECK:   successors: %bb.5(0x30000000), %bb.6(0x50000000)
438  ; CHECK:   liveins: $r0
439  ; CHECK:   t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
440  ; CHECK:   $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r7, def $lr
441  ; CHECK:   t2Bcc %bb.6, 1, killed $cpsr
442  ; CHECK: bb.5.b8:
443  ; CHECK:   liveins: $lr, $r7
444  ; CHECK:   tBX_RET 14, $noreg
445  ; CHECK: bb.6.b7:
446  ; CHECK:   liveins: $lr, $r7
447  ; CHECK:   tTAILJMPdND @extfunc, 14, $noreg, implicit $sp, implicit $sp
448  bb.0 (%ir-block.0):
449    successors: %bb.1(0x50000000), %bb.6(0x30000000)
450    liveins: $lr, $r7
451
452    renamable $r0 = t2MOVi 1, 14, $noreg, $noreg
453    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
454    t2Bcc %bb.6, 1, killed $cpsr
455
456  bb.1.b1:
457    successors: %bb.3(0x40000000), %bb.2(0x40000000)
458    liveins: $r7, $lr
459
460    $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r7, killed $lr
461    frame-setup CFI_INSTRUCTION def_cfa_offset 8
462    frame-setup CFI_INSTRUCTION offset $lr, -4
463    frame-setup CFI_INSTRUCTION offset $r7, -8
464    renamable $r0 = t2MOVi 0, 14, $noreg, $noreg
465    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
466    t2Bcc %bb.3, 1, killed $cpsr
467
468  bb.2.b2:
469    successors: %bb.4(0x80000000)
470
471    tBL 14, $noreg, @extfunc, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $r0
472    t2B %bb.4, 14, $noreg
473
474  bb.3.b3:
475    successors: %bb.4(0x80000000)
476
477    renamable $r0 = t2LDRi12 undef renamable $r0, 0, 14, $noreg :: (load 4 from `i32* undef`)
478    renamable $r0 = t2ANDri killed renamable $r0, 256, 14, $noreg, $noreg
479
480  bb.4.b5:
481    successors: %bb.5(0x30000000), %bb.6(0x50000000)
482    liveins: $r0
483
484    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
485    $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r7, def $lr
486    t2Bcc %bb.6, 1, killed $cpsr
487
488  bb.5.b8:
489    liveins: $lr, $r7
490
491    tBX_RET 14, $noreg
492
493  bb.6.b7:
494    liveins: $lr, $r7
495
496    tTAILJMPdND @extfunc, 14, $noreg, implicit $sp, implicit $sp
497
498...
499