xref: /llvm-project/llvm/test/CodeGen/ARM/execute-only-save-cpsr.mir (revision 40614e1c1483c698a228c3d038621e834d94086c)
1*40614e1cSOliver Stannard# RUN: llc -run-pass=prologepilog %s -o - | FileCheck %s
2*40614e1cSOliver Stannard# Tests to check that CPSR is saved and restored if live when we emit tMOVi32imm
3*40614e1cSOliver Stannard# to resolve a frame offset.
4*40614e1cSOliver Stannard
5*40614e1cSOliver Stannard--- |
6*40614e1cSOliver Stannard  target triple = "thumbv6m-arm-none-eabi"
7*40614e1cSOliver Stannard
8*40614e1cSOliver Stannard  define void @test_def_in_block(i32 %x) #0 {
9*40614e1cSOliver Stannard  entry:
10*40614e1cSOliver Stannard    %var = alloca i32, align 4
11*40614e1cSOliver Stannard    %dummy = alloca [2048 x i8], align 1
12*40614e1cSOliver Stannard    %cmp = icmp eq i32 %x, 0
13*40614e1cSOliver Stannard    store i32 %x, ptr %var, align 4
14*40614e1cSOliver Stannard    br i1 %cmp, label %if.then, label %if.end
15*40614e1cSOliver Stannard
16*40614e1cSOliver Stannard  if.then:
17*40614e1cSOliver Stannard    br label %if.end
18*40614e1cSOliver Stannard
19*40614e1cSOliver Stannard  if.end:
20*40614e1cSOliver Stannard    ret void
21*40614e1cSOliver Stannard  }
22*40614e1cSOliver Stannard
23*40614e1cSOliver Stannard  define void @test_live_in(i32 %x) #0 {
24*40614e1cSOliver Stannard  entry:
25*40614e1cSOliver Stannard    %var = alloca i32, align 4
26*40614e1cSOliver Stannard    %dummy = alloca [2048 x i8], align 1
27*40614e1cSOliver Stannard    %cmp = icmp eq i32 %x, 0
28*40614e1cSOliver Stannard    br i1 %cmp, label %if.then, label %if.end
29*40614e1cSOliver Stannard
30*40614e1cSOliver Stannard  if.then:
31*40614e1cSOliver Stannard    store i32 %x, ptr %var, align 4
32*40614e1cSOliver Stannard    %cmp1 = icmp slt i32 %x, 0
33*40614e1cSOliver Stannard    br i1 %cmp1, label %if.then2, label %if.end
34*40614e1cSOliver Stannard
35*40614e1cSOliver Stannard  if.then2:
36*40614e1cSOliver Stannard    br label %if.end
37*40614e1cSOliver Stannard
38*40614e1cSOliver Stannard  if.end:
39*40614e1cSOliver Stannard    ret void
40*40614e1cSOliver Stannard  }
41*40614e1cSOliver Stannard
42*40614e1cSOliver Stannard  define void @test_live_out(i32 %x) #0 {
43*40614e1cSOliver Stannard  entry:
44*40614e1cSOliver Stannard    %var = alloca i32, align 4
45*40614e1cSOliver Stannard    %dummy = alloca [2048 x i8], align 1
46*40614e1cSOliver Stannard    %cmp = icmp eq i32 %x, 0
47*40614e1cSOliver Stannard    store i32 %x, ptr %var, align 4
48*40614e1cSOliver Stannard    br label %if.then
49*40614e1cSOliver Stannard
50*40614e1cSOliver Stannard  if.then:
51*40614e1cSOliver Stannard    br i1 %cmp, label %if.then2, label %if.end
52*40614e1cSOliver Stannard
53*40614e1cSOliver Stannard  if.then2:
54*40614e1cSOliver Stannard    br label %if.end
55*40614e1cSOliver Stannard
56*40614e1cSOliver Stannard  if.end:
57*40614e1cSOliver Stannard    ret void
58*40614e1cSOliver Stannard  }
59*40614e1cSOliver Stannard
60*40614e1cSOliver Stannard  define void @test_live_out_def_after_mov(i32 %x) #0 {
61*40614e1cSOliver Stannard  entry:
62*40614e1cSOliver Stannard    %var = alloca i32, align 4
63*40614e1cSOliver Stannard    %dummy = alloca [2048 x i8], align 1
64*40614e1cSOliver Stannard    store i32 %x, ptr %var, align 4
65*40614e1cSOliver Stannard    %cmp = icmp eq i32 %x, 0
66*40614e1cSOliver Stannard    br label %if.then
67*40614e1cSOliver Stannard
68*40614e1cSOliver Stannard  if.then:
69*40614e1cSOliver Stannard    br i1 %cmp, label %if.then2, label %if.end
70*40614e1cSOliver Stannard
71*40614e1cSOliver Stannard  if.then2:
72*40614e1cSOliver Stannard    br label %if.end
73*40614e1cSOliver Stannard
74*40614e1cSOliver Stannard  if.end:
75*40614e1cSOliver Stannard    ret void
76*40614e1cSOliver Stannard  }
77*40614e1cSOliver Stannard
78*40614e1cSOliver Stannard  attributes #0 = { "target-features"="+execute-only" }
79*40614e1cSOliver Stannard...
80*40614e1cSOliver Stannard---
81*40614e1cSOliver Stannardname:            test_def_in_block
82*40614e1cSOliver Stannardalignment:       2
83*40614e1cSOliver StannardexposesReturnsTwice: false
84*40614e1cSOliver Stannardlegalized:       false
85*40614e1cSOliver StannardregBankSelected: false
86*40614e1cSOliver Stannardselected:        false
87*40614e1cSOliver StannardfailedISel:      false
88*40614e1cSOliver StannardtracksRegLiveness: true
89*40614e1cSOliver StannardhasWinCFI:       false
90*40614e1cSOliver StannardcallsEHReturn:   false
91*40614e1cSOliver StannardcallsUnwindInit: false
92*40614e1cSOliver StannardhasEHCatchret:   false
93*40614e1cSOliver StannardhasEHScopes:     false
94*40614e1cSOliver StannardhasEHFunclets:   false
95*40614e1cSOliver StannardisOutlined:      false
96*40614e1cSOliver StannarddebugInstrRef:   false
97*40614e1cSOliver StannardfailsVerification: false
98*40614e1cSOliver StannardtracksDebugUserValues: false
99*40614e1cSOliver Stannardregisters:       []
100*40614e1cSOliver Stannardliveins:
101*40614e1cSOliver Stannard  - { reg: '$r0', virtual-reg: '' }
102*40614e1cSOliver StannardframeInfo:
103*40614e1cSOliver Stannard  isFrameAddressTaken: false
104*40614e1cSOliver Stannard  isReturnAddressTaken: false
105*40614e1cSOliver Stannard  hasStackMap:     false
106*40614e1cSOliver Stannard  hasPatchPoint:   false
107*40614e1cSOliver Stannard  stackSize:       0
108*40614e1cSOliver Stannard  offsetAdjustment: 0
109*40614e1cSOliver Stannard  maxAlignment:    4
110*40614e1cSOliver Stannard  adjustsStack:    false
111*40614e1cSOliver Stannard  hasCalls:        false
112*40614e1cSOliver Stannard  stackProtector:  ''
113*40614e1cSOliver Stannard  functionContext: ''
114*40614e1cSOliver Stannard  maxCallFrameSize: 0
115*40614e1cSOliver Stannard  cvBytesOfCalleeSavedRegisters: 0
116*40614e1cSOliver Stannard  hasOpaqueSPAdjustment: false
117*40614e1cSOliver Stannard  hasVAStart:      false
118*40614e1cSOliver Stannard  hasMustTailInVarArgFunc: false
119*40614e1cSOliver Stannard  hasTailCall:     false
120*40614e1cSOliver Stannard  localFrameSize:  2052
121*40614e1cSOliver Stannard  savePoint:       ''
122*40614e1cSOliver Stannard  restorePoint:    ''
123*40614e1cSOliver StannardfixedStack:      []
124*40614e1cSOliver Stannardstack:
125*40614e1cSOliver Stannard  - { id: 0, name: var, type: default, offset: 0, size: 4, alignment: 4,
126*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
127*40614e1cSOliver Stannard      local-offset: -4, debug-info-variable: '', debug-info-expression: '',
128*40614e1cSOliver Stannard      debug-info-location: '' }
129*40614e1cSOliver Stannard  - { id: 1, name: dummy, type: default, offset: 0, size: 2048, alignment: 1,
130*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
131*40614e1cSOliver Stannard      local-offset: -2052, debug-info-variable: '', debug-info-expression: '',
132*40614e1cSOliver Stannard      debug-info-location: '' }
133*40614e1cSOliver Stannardentry_values:    []
134*40614e1cSOliver StannardcallSites:       []
135*40614e1cSOliver StannarddebugValueSubstitutions: []
136*40614e1cSOliver Stannardconstants:       []
137*40614e1cSOliver StannardmachineFunctionInfo: {}
138*40614e1cSOliver Stannardbody:             |
139*40614e1cSOliver Stannard  bb.0.entry:
140*40614e1cSOliver Stannard    successors: %bb.1(0x40000000), %bb.2(0x40000000)
141*40614e1cSOliver Stannard    liveins: $r0
142*40614e1cSOliver Stannard
143*40614e1cSOliver Stannard    ; CHECK-LABEL: name: test_def_in_block
144*40614e1cSOliver Stannard    ; CHECK-LABEL: bb.0.entry:
145*40614e1cSOliver Stannard    ; CHECK: tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
146*40614e1cSOliver Stannard    ; CHECK-NEXT: $r2 = t2MRS_M 2048, 14 /* CC::al */, $noreg, implicit $cpsr
147*40614e1cSOliver Stannard    ; CHECK-NEXT: $r1 = tMOVi32imm 2048, implicit-def $cpsr
148*40614e1cSOliver Stannard    ; CHECK-NEXT: t2MSR_M 2048, killed $r2, 14 /* CC::al */, $noreg, implicit-def $cpsr
149*40614e1cSOliver Stannard    ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg
150*40614e1cSOliver Stannard    ; CHECK-NEXT: tSTRi renamable $r0, killed $r1, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
151*40614e1cSOliver Stannard
152*40614e1cSOliver Stannard    tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
153*40614e1cSOliver Stannard    tSTRspi renamable $r0, %stack.0.var, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
154*40614e1cSOliver Stannard    tBcc %bb.1, 1 /* CC::ne */, killed $cpsr
155*40614e1cSOliver Stannard    tB %bb.2, 14 /* CC::al */, $noreg
156*40614e1cSOliver Stannard
157*40614e1cSOliver Stannard  bb.1.if.then:
158*40614e1cSOliver Stannard    successors: %bb.2(0x80000000)
159*40614e1cSOliver Stannard
160*40614e1cSOliver Stannard    tB %bb.2, 14 /* CC::al */, $noreg
161*40614e1cSOliver Stannard
162*40614e1cSOliver Stannard  bb.2.if.end:
163*40614e1cSOliver Stannard    tBX_RET 14 /* CC::al */, $noreg
164*40614e1cSOliver Stannard
165*40614e1cSOliver Stannard...
166*40614e1cSOliver Stannard---
167*40614e1cSOliver Stannardname:            test_live_in
168*40614e1cSOliver Stannardalignment:       2
169*40614e1cSOliver StannardexposesReturnsTwice: false
170*40614e1cSOliver Stannardlegalized:       false
171*40614e1cSOliver StannardregBankSelected: false
172*40614e1cSOliver Stannardselected:        false
173*40614e1cSOliver StannardfailedISel:      false
174*40614e1cSOliver StannardtracksRegLiveness: true
175*40614e1cSOliver StannardhasWinCFI:       false
176*40614e1cSOliver StannardcallsEHReturn:   false
177*40614e1cSOliver StannardcallsUnwindInit: false
178*40614e1cSOliver StannardhasEHCatchret:   false
179*40614e1cSOliver StannardhasEHScopes:     false
180*40614e1cSOliver StannardhasEHFunclets:   false
181*40614e1cSOliver StannardisOutlined:      false
182*40614e1cSOliver StannarddebugInstrRef:   false
183*40614e1cSOliver StannardfailsVerification: false
184*40614e1cSOliver StannardtracksDebugUserValues: false
185*40614e1cSOliver Stannardregisters:       []
186*40614e1cSOliver Stannardliveins:
187*40614e1cSOliver Stannard  - { reg: '$r0', virtual-reg: '' }
188*40614e1cSOliver StannardframeInfo:
189*40614e1cSOliver Stannard  isFrameAddressTaken: false
190*40614e1cSOliver Stannard  isReturnAddressTaken: false
191*40614e1cSOliver Stannard  hasStackMap:     false
192*40614e1cSOliver Stannard  hasPatchPoint:   false
193*40614e1cSOliver Stannard  stackSize:       0
194*40614e1cSOliver Stannard  offsetAdjustment: 0
195*40614e1cSOliver Stannard  maxAlignment:    4
196*40614e1cSOliver Stannard  adjustsStack:    false
197*40614e1cSOliver Stannard  hasCalls:        false
198*40614e1cSOliver Stannard  stackProtector:  ''
199*40614e1cSOliver Stannard  functionContext: ''
200*40614e1cSOliver Stannard  maxCallFrameSize: 0
201*40614e1cSOliver Stannard  cvBytesOfCalleeSavedRegisters: 0
202*40614e1cSOliver Stannard  hasOpaqueSPAdjustment: false
203*40614e1cSOliver Stannard  hasVAStart:      false
204*40614e1cSOliver Stannard  hasMustTailInVarArgFunc: false
205*40614e1cSOliver Stannard  hasTailCall:     false
206*40614e1cSOliver Stannard  localFrameSize:  2052
207*40614e1cSOliver Stannard  savePoint:       ''
208*40614e1cSOliver Stannard  restorePoint:    ''
209*40614e1cSOliver StannardfixedStack:      []
210*40614e1cSOliver Stannardstack:
211*40614e1cSOliver Stannard  - { id: 0, name: var, type: default, offset: 0, size: 4, alignment: 4,
212*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
213*40614e1cSOliver Stannard      local-offset: -4, debug-info-variable: '', debug-info-expression: '',
214*40614e1cSOliver Stannard      debug-info-location: '' }
215*40614e1cSOliver Stannard  - { id: 1, name: dummy, type: default, offset: 0, size: 2048, alignment: 1,
216*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
217*40614e1cSOliver Stannard      local-offset: -2052, debug-info-variable: '', debug-info-expression: '',
218*40614e1cSOliver Stannard      debug-info-location: '' }
219*40614e1cSOliver Stannardentry_values:    []
220*40614e1cSOliver StannardcallSites:       []
221*40614e1cSOliver StannarddebugValueSubstitutions: []
222*40614e1cSOliver Stannardconstants:       []
223*40614e1cSOliver StannardmachineFunctionInfo: {}
224*40614e1cSOliver Stannardbody:             |
225*40614e1cSOliver Stannard  bb.0.entry:
226*40614e1cSOliver Stannard    successors: %bb.1(0x40000000), %bb.3(0x40000000)
227*40614e1cSOliver Stannard    liveins: $r0
228*40614e1cSOliver Stannard
229*40614e1cSOliver Stannard    tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
230*40614e1cSOliver Stannard    tBcc %bb.3, 1 /* CC::ne */, $cpsr
231*40614e1cSOliver Stannard    tB %bb.1, 14 /* CC::al */, $noreg
232*40614e1cSOliver Stannard
233*40614e1cSOliver Stannard  bb.1.if.then:
234*40614e1cSOliver Stannard    successors: %bb.2(0x40000000), %bb.3(0x40000000)
235*40614e1cSOliver Stannard    liveins: $r0, $cpsr
236*40614e1cSOliver Stannard
237*40614e1cSOliver Stannard    ; CHECK-LABEL: name: test_live_in
238*40614e1cSOliver Stannard    ; CHECK-LABEL: bb.1.if.then:
239*40614e1cSOliver Stannard    ; CHECK: $r2 = t2MRS_M 2048, 14 /* CC::al */, $noreg, implicit $cpsr
240*40614e1cSOliver Stannard    ; CHECK-NEXT: $r1 = tMOVi32imm 2048, implicit-def $cpsr
241*40614e1cSOliver Stannard    ; CHECK-NEXT: t2MSR_M 2048, killed $r2, 14 /* CC::al */, $noreg, implicit-def $cpsr
242*40614e1cSOliver Stannard    ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg
243*40614e1cSOliver Stannard    ; CHECK-NEXT: tSTRi renamable $r0, killed $r1, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
244*40614e1cSOliver Stannard
245*40614e1cSOliver Stannard    tSTRspi renamable $r0, %stack.0.var, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
246*40614e1cSOliver Stannard    tBcc %bb.3, 5 /* CC::pl */, killed $cpsr
247*40614e1cSOliver Stannard    tB %bb.2, 14 /* CC::al */, $noreg
248*40614e1cSOliver Stannard
249*40614e1cSOliver Stannard  bb.2.if.then2:
250*40614e1cSOliver Stannard    successors: %bb.3(0x80000000)
251*40614e1cSOliver Stannard
252*40614e1cSOliver Stannard    tB %bb.3, 14 /* CC::al */, $noreg
253*40614e1cSOliver Stannard
254*40614e1cSOliver Stannard  bb.3.if.end:
255*40614e1cSOliver Stannard    tBX_RET 14 /* CC::al */, $noreg
256*40614e1cSOliver Stannard
257*40614e1cSOliver Stannard...
258*40614e1cSOliver Stannard---
259*40614e1cSOliver Stannardname:            test_live_out
260*40614e1cSOliver Stannardalignment:       2
261*40614e1cSOliver StannardexposesReturnsTwice: false
262*40614e1cSOliver Stannardlegalized:       false
263*40614e1cSOliver StannardregBankSelected: false
264*40614e1cSOliver Stannardselected:        false
265*40614e1cSOliver StannardfailedISel:      false
266*40614e1cSOliver StannardtracksRegLiveness: true
267*40614e1cSOliver StannardhasWinCFI:       false
268*40614e1cSOliver StannardcallsEHReturn:   false
269*40614e1cSOliver StannardcallsUnwindInit: false
270*40614e1cSOliver StannardhasEHCatchret:   false
271*40614e1cSOliver StannardhasEHScopes:     false
272*40614e1cSOliver StannardhasEHFunclets:   false
273*40614e1cSOliver StannardisOutlined:      false
274*40614e1cSOliver StannarddebugInstrRef:   false
275*40614e1cSOliver StannardfailsVerification: false
276*40614e1cSOliver StannardtracksDebugUserValues: false
277*40614e1cSOliver Stannardregisters:       []
278*40614e1cSOliver Stannardliveins:
279*40614e1cSOliver Stannard  - { reg: '$r0', virtual-reg: '' }
280*40614e1cSOliver StannardframeInfo:
281*40614e1cSOliver Stannard  isFrameAddressTaken: false
282*40614e1cSOliver Stannard  isReturnAddressTaken: false
283*40614e1cSOliver Stannard  hasStackMap:     false
284*40614e1cSOliver Stannard  hasPatchPoint:   false
285*40614e1cSOliver Stannard  stackSize:       0
286*40614e1cSOliver Stannard  offsetAdjustment: 0
287*40614e1cSOliver Stannard  maxAlignment:    4
288*40614e1cSOliver Stannard  adjustsStack:    false
289*40614e1cSOliver Stannard  hasCalls:        false
290*40614e1cSOliver Stannard  stackProtector:  ''
291*40614e1cSOliver Stannard  functionContext: ''
292*40614e1cSOliver Stannard  maxCallFrameSize: 0
293*40614e1cSOliver Stannard  cvBytesOfCalleeSavedRegisters: 0
294*40614e1cSOliver Stannard  hasOpaqueSPAdjustment: false
295*40614e1cSOliver Stannard  hasVAStart:      false
296*40614e1cSOliver Stannard  hasMustTailInVarArgFunc: false
297*40614e1cSOliver Stannard  hasTailCall:     false
298*40614e1cSOliver Stannard  localFrameSize:  2052
299*40614e1cSOliver Stannard  savePoint:       ''
300*40614e1cSOliver Stannard  restorePoint:    ''
301*40614e1cSOliver StannardfixedStack:      []
302*40614e1cSOliver Stannardstack:
303*40614e1cSOliver Stannard  - { id: 0, name: var, type: default, offset: 0, size: 4, alignment: 4,
304*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
305*40614e1cSOliver Stannard      local-offset: -4, debug-info-variable: '', debug-info-expression: '',
306*40614e1cSOliver Stannard      debug-info-location: '' }
307*40614e1cSOliver Stannard  - { id: 1, name: dummy, type: default, offset: 0, size: 2048, alignment: 1,
308*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
309*40614e1cSOliver Stannard      local-offset: -2052, debug-info-variable: '', debug-info-expression: '',
310*40614e1cSOliver Stannard      debug-info-location: '' }
311*40614e1cSOliver Stannardentry_values:    []
312*40614e1cSOliver StannardcallSites:       []
313*40614e1cSOliver StannarddebugValueSubstitutions: []
314*40614e1cSOliver Stannardconstants:       []
315*40614e1cSOliver StannardmachineFunctionInfo: {}
316*40614e1cSOliver Stannardbody:             |
317*40614e1cSOliver Stannard  bb.0.entry:
318*40614e1cSOliver Stannard    successors: %bb.1(0x40000000)
319*40614e1cSOliver Stannard    liveins: $r0
320*40614e1cSOliver Stannard
321*40614e1cSOliver Stannard    ; CHECK-LABEL: name: test_live_out
322*40614e1cSOliver Stannard    ; CHECK-LABEL: bb.0.entry:
323*40614e1cSOliver Stannard    ; CHECK: tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
324*40614e1cSOliver Stannard    ; CHECK-NEXT: $r2 = t2MRS_M 2048, 14 /* CC::al */, $noreg, implicit $cpsr
325*40614e1cSOliver Stannard    ; CHECK-NEXT: $r1 = tMOVi32imm 2048, implicit-def $cpsr
326*40614e1cSOliver Stannard    ; CHECK-NEXT: t2MSR_M 2048, killed $r2, 14 /* CC::al */, $noreg, implicit-def $cpsr
327*40614e1cSOliver Stannard    ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg
328*40614e1cSOliver Stannard    ; CHECK-NEXT: tSTRi renamable $r0, killed $r1, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
329*40614e1cSOliver Stannard
330*40614e1cSOliver Stannard    tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
331*40614e1cSOliver Stannard    tSTRspi renamable $r0, %stack.0.var, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
332*40614e1cSOliver Stannard    tB %bb.1, 14 /* CC::al */, $noreg
333*40614e1cSOliver Stannard
334*40614e1cSOliver Stannard  bb.1.if.then:
335*40614e1cSOliver Stannard    successors: %bb.2(0x40000000), %bb.3(0x40000000)
336*40614e1cSOliver Stannard    liveins: $cpsr
337*40614e1cSOliver Stannard
338*40614e1cSOliver Stannard    tBcc %bb.3, 5 /* CC::pl */, killed $cpsr
339*40614e1cSOliver Stannard    tB %bb.2, 14 /* CC::al */, $noreg
340*40614e1cSOliver Stannard
341*40614e1cSOliver Stannard  bb.2.if.then2:
342*40614e1cSOliver Stannard    successors: %bb.3(0x80000000)
343*40614e1cSOliver Stannard
344*40614e1cSOliver Stannard    tB %bb.3, 14 /* CC::al */, $noreg
345*40614e1cSOliver Stannard
346*40614e1cSOliver Stannard  bb.3.if.end:
347*40614e1cSOliver Stannard    tBX_RET 14 /* CC::al */, $noreg
348*40614e1cSOliver Stannard
349*40614e1cSOliver Stannard...
350*40614e1cSOliver Stannard---
351*40614e1cSOliver Stannardname:            test_live_out_def_after_mov
352*40614e1cSOliver Stannardalignment:       2
353*40614e1cSOliver StannardexposesReturnsTwice: false
354*40614e1cSOliver Stannardlegalized:       false
355*40614e1cSOliver StannardregBankSelected: false
356*40614e1cSOliver Stannardselected:        false
357*40614e1cSOliver StannardfailedISel:      false
358*40614e1cSOliver StannardtracksRegLiveness: true
359*40614e1cSOliver StannardhasWinCFI:       false
360*40614e1cSOliver StannardcallsEHReturn:   false
361*40614e1cSOliver StannardcallsUnwindInit: false
362*40614e1cSOliver StannardhasEHCatchret:   false
363*40614e1cSOliver StannardhasEHScopes:     false
364*40614e1cSOliver StannardhasEHFunclets:   false
365*40614e1cSOliver StannardisOutlined:      false
366*40614e1cSOliver StannarddebugInstrRef:   false
367*40614e1cSOliver StannardfailsVerification: false
368*40614e1cSOliver StannardtracksDebugUserValues: false
369*40614e1cSOliver Stannardregisters:       []
370*40614e1cSOliver Stannardliveins:
371*40614e1cSOliver Stannard  - { reg: '$r0', virtual-reg: '' }
372*40614e1cSOliver StannardframeInfo:
373*40614e1cSOliver Stannard  isFrameAddressTaken: false
374*40614e1cSOliver Stannard  isReturnAddressTaken: false
375*40614e1cSOliver Stannard  hasStackMap:     false
376*40614e1cSOliver Stannard  hasPatchPoint:   false
377*40614e1cSOliver Stannard  stackSize:       0
378*40614e1cSOliver Stannard  offsetAdjustment: 0
379*40614e1cSOliver Stannard  maxAlignment:    4
380*40614e1cSOliver Stannard  adjustsStack:    false
381*40614e1cSOliver Stannard  hasCalls:        false
382*40614e1cSOliver Stannard  stackProtector:  ''
383*40614e1cSOliver Stannard  functionContext: ''
384*40614e1cSOliver Stannard  maxCallFrameSize: 0
385*40614e1cSOliver Stannard  cvBytesOfCalleeSavedRegisters: 0
386*40614e1cSOliver Stannard  hasOpaqueSPAdjustment: false
387*40614e1cSOliver Stannard  hasVAStart:      false
388*40614e1cSOliver Stannard  hasMustTailInVarArgFunc: false
389*40614e1cSOliver Stannard  hasTailCall:     false
390*40614e1cSOliver Stannard  localFrameSize:  2052
391*40614e1cSOliver Stannard  savePoint:       ''
392*40614e1cSOliver Stannard  restorePoint:    ''
393*40614e1cSOliver StannardfixedStack:      []
394*40614e1cSOliver Stannardstack:
395*40614e1cSOliver Stannard  - { id: 0, name: var, type: default, offset: 0, size: 4, alignment: 4,
396*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
397*40614e1cSOliver Stannard      local-offset: -4, debug-info-variable: '', debug-info-expression: '',
398*40614e1cSOliver Stannard      debug-info-location: '' }
399*40614e1cSOliver Stannard  - { id: 1, name: dummy, type: default, offset: 0, size: 2048, alignment: 1,
400*40614e1cSOliver Stannard      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
401*40614e1cSOliver Stannard      local-offset: -2052, debug-info-variable: '', debug-info-expression: '',
402*40614e1cSOliver Stannard      debug-info-location: '' }
403*40614e1cSOliver Stannardentry_values:    []
404*40614e1cSOliver StannardcallSites:       []
405*40614e1cSOliver StannarddebugValueSubstitutions: []
406*40614e1cSOliver Stannardconstants:       []
407*40614e1cSOliver StannardmachineFunctionInfo: {}
408*40614e1cSOliver Stannardbody:             |
409*40614e1cSOliver Stannard  bb.0.entry:
410*40614e1cSOliver Stannard    successors: %bb.1(0x40000000)
411*40614e1cSOliver Stannard    liveins: $r0
412*40614e1cSOliver Stannard
413*40614e1cSOliver Stannard    ; Here the live-out cpsr is defined after the tMOVi32imm, so cpsr doesn't
414*40614e1cSOliver Stannard    ; need to be saved.
415*40614e1cSOliver Stannard    ; CHECK-LABEL: name: test_live_out
416*40614e1cSOliver Stannard    ; CHECK-LABEL: bb.0.entry:
417*40614e1cSOliver Stannard    ; CHECK: $r1 = tMOVi32imm 2048, implicit-def $cpsr
418*40614e1cSOliver Stannard    ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg
419*40614e1cSOliver Stannard    ; CHECK-NEXT: tSTRi renamable $r0, killed $r1, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
420*40614e1cSOliver Stannard    ; CHECK-NEXT: tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
421*40614e1cSOliver Stannard
422*40614e1cSOliver Stannard    tSTRspi renamable $r0, %stack.0.var, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)
423*40614e1cSOliver Stannard    tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
424*40614e1cSOliver Stannard    tB %bb.1, 14 /* CC::al */, $noreg
425*40614e1cSOliver Stannard
426*40614e1cSOliver Stannard  bb.1.if.then:
427*40614e1cSOliver Stannard    successors: %bb.2(0x40000000), %bb.3(0x40000000)
428*40614e1cSOliver Stannard    liveins: $cpsr
429*40614e1cSOliver Stannard
430*40614e1cSOliver Stannard    tBcc %bb.3, 5 /* CC::pl */, killed $cpsr
431*40614e1cSOliver Stannard    tB %bb.2, 14 /* CC::al */, $noreg
432*40614e1cSOliver Stannard
433*40614e1cSOliver Stannard  bb.2.if.then2:
434*40614e1cSOliver Stannard    successors: %bb.3(0x80000000)
435*40614e1cSOliver Stannard
436*40614e1cSOliver Stannard    tB %bb.3, 14 /* CC::al */, $noreg
437*40614e1cSOliver Stannard
438*40614e1cSOliver Stannard  bb.3.if.end:
439*40614e1cSOliver Stannard    tBX_RET 14 /* CC::al */, $noreg
440*40614e1cSOliver Stannard
441*40614e1cSOliver Stannard...
442