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