442 lines · plain
1# RUN: llc -run-pass=prologepilog %s -o - | FileCheck %s2# Tests to check that CPSR is saved and restored if live when we emit tMOVi32imm3# to resolve a frame offset.4 5--- |6 target triple = "thumbv6m-arm-none-eabi"7 8 define void @test_def_in_block(i32 %x) #0 {9 entry:10 %var = alloca i32, align 411 %dummy = alloca [2048 x i8], align 112 %cmp = icmp eq i32 %x, 013 store i32 %x, ptr %var, align 414 br i1 %cmp, label %if.then, label %if.end15 16 if.then:17 br label %if.end18 19 if.end:20 ret void21 }22 23 define void @test_live_in(i32 %x) #0 {24 entry:25 %var = alloca i32, align 426 %dummy = alloca [2048 x i8], align 127 %cmp = icmp eq i32 %x, 028 br i1 %cmp, label %if.then, label %if.end29 30 if.then:31 store i32 %x, ptr %var, align 432 %cmp1 = icmp slt i32 %x, 033 br i1 %cmp1, label %if.then2, label %if.end34 35 if.then2:36 br label %if.end37 38 if.end:39 ret void40 }41 42 define void @test_live_out(i32 %x) #0 {43 entry:44 %var = alloca i32, align 445 %dummy = alloca [2048 x i8], align 146 %cmp = icmp eq i32 %x, 047 store i32 %x, ptr %var, align 448 br label %if.then49 50 if.then:51 br i1 %cmp, label %if.then2, label %if.end52 53 if.then2:54 br label %if.end55 56 if.end:57 ret void58 }59 60 define void @test_live_out_def_after_mov(i32 %x) #0 {61 entry:62 %var = alloca i32, align 463 %dummy = alloca [2048 x i8], align 164 store i32 %x, ptr %var, align 465 %cmp = icmp eq i32 %x, 066 br label %if.then67 68 if.then:69 br i1 %cmp, label %if.then2, label %if.end70 71 if.then2:72 br label %if.end73 74 if.end:75 ret void76 }77 78 attributes #0 = { "target-features"="+execute-only" }79...80---81name: test_def_in_block82alignment: 283exposesReturnsTwice: false84legalized: false85regBankSelected: false86selected: false87failedISel: false88tracksRegLiveness: true89hasWinCFI: false90callsEHReturn: false91callsUnwindInit: false92hasEHContTarget: false93hasEHScopes: false94hasEHFunclets: false95isOutlined: false96debugInstrRef: false97failsVerification: false98tracksDebugUserValues: false99registers: []100liveins:101 - { reg: '$r0', virtual-reg: '' }102frameInfo:103 isFrameAddressTaken: false104 isReturnAddressTaken: false105 hasStackMap: false106 hasPatchPoint: false107 stackSize: 0108 offsetAdjustment: 0109 maxAlignment: 4110 adjustsStack: false111 hasCalls: false112 stackProtector: ''113 functionContext: ''114 maxCallFrameSize: 0115 cvBytesOfCalleeSavedRegisters: 0116 hasOpaqueSPAdjustment: false117 hasVAStart: false118 hasMustTailInVarArgFunc: false119 hasTailCall: false120 localFrameSize: 2052121 savePoint: []122 restorePoint: []123fixedStack: []124stack: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: '' }133entry_values: []134callSites: []135debugValueSubstitutions: []136constants: []137machineFunctionInfo: {}138body: |139 bb.0.entry:140 successors: %bb.1(0x40000000), %bb.2(0x40000000)141 liveins: $r0142 143 ; CHECK-LABEL: name: test_def_in_block144 ; CHECK-LABEL: bb.0.entry:145 ; CHECK: tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr146 ; CHECK-NEXT: $r2 = t2MRS_M 2048, 14 /* CC::al */, $noreg, implicit $cpsr147 ; CHECK-NEXT: $r1 = tMOVi32imm 2048, implicit-def $cpsr148 ; CHECK-NEXT: t2MSR_M 2048, killed $r2, 14 /* CC::al */, $noreg, implicit-def $cpsr149 ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg150 ; CHECK-NEXT: tSTRi renamable $r0, killed $r1, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)151 152 tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr153 tSTRspi renamable $r0, %stack.0.var, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)154 tBcc %bb.1, 1 /* CC::ne */, killed $cpsr155 tB %bb.2, 14 /* CC::al */, $noreg156 157 bb.1.if.then:158 successors: %bb.2(0x80000000)159 160 tB %bb.2, 14 /* CC::al */, $noreg161 162 bb.2.if.end:163 tBX_RET 14 /* CC::al */, $noreg164 165...166---167name: test_live_in168alignment: 2169exposesReturnsTwice: false170legalized: false171regBankSelected: false172selected: false173failedISel: false174tracksRegLiveness: true175hasWinCFI: false176callsEHReturn: false177callsUnwindInit: false178hasEHContTarget: false179hasEHScopes: false180hasEHFunclets: false181isOutlined: false182debugInstrRef: false183failsVerification: false184tracksDebugUserValues: false185registers: []186liveins:187 - { reg: '$r0', virtual-reg: '' }188frameInfo:189 isFrameAddressTaken: false190 isReturnAddressTaken: false191 hasStackMap: false192 hasPatchPoint: false193 stackSize: 0194 offsetAdjustment: 0195 maxAlignment: 4196 adjustsStack: false197 hasCalls: false198 stackProtector: ''199 functionContext: ''200 maxCallFrameSize: 0201 cvBytesOfCalleeSavedRegisters: 0202 hasOpaqueSPAdjustment: false203 hasVAStart: false204 hasMustTailInVarArgFunc: false205 hasTailCall: false206 localFrameSize: 2052207 savePoint: []208 restorePoint: []209fixedStack: []210stack: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: '' }219entry_values: []220callSites: []221debugValueSubstitutions: []222constants: []223machineFunctionInfo: {}224body: |225 bb.0.entry:226 successors: %bb.1(0x40000000), %bb.3(0x40000000)227 liveins: $r0228 229 tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr230 tBcc %bb.3, 1 /* CC::ne */, $cpsr231 tB %bb.1, 14 /* CC::al */, $noreg232 233 bb.1.if.then:234 successors: %bb.2(0x40000000), %bb.3(0x40000000)235 liveins: $r0, $cpsr236 237 ; CHECK-LABEL: name: test_live_in238 ; CHECK-LABEL: bb.1.if.then:239 ; CHECK: $r2 = t2MRS_M 2048, 14 /* CC::al */, $noreg, implicit $cpsr240 ; CHECK-NEXT: $r1 = tMOVi32imm 2048, implicit-def $cpsr241 ; CHECK-NEXT: t2MSR_M 2048, killed $r2, 14 /* CC::al */, $noreg, implicit-def $cpsr242 ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg243 ; CHECK-NEXT: tSTRi renamable $r0, killed $r1, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)244 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 $cpsr247 tB %bb.2, 14 /* CC::al */, $noreg248 249 bb.2.if.then2:250 successors: %bb.3(0x80000000)251 252 tB %bb.3, 14 /* CC::al */, $noreg253 254 bb.3.if.end:255 tBX_RET 14 /* CC::al */, $noreg256 257...258---259name: test_live_out260alignment: 2261exposesReturnsTwice: false262legalized: false263regBankSelected: false264selected: false265failedISel: false266tracksRegLiveness: true267hasWinCFI: false268callsEHReturn: false269callsUnwindInit: false270hasEHContTarget: false271hasEHScopes: false272hasEHFunclets: false273isOutlined: false274debugInstrRef: false275failsVerification: false276tracksDebugUserValues: false277registers: []278liveins:279 - { reg: '$r0', virtual-reg: '' }280frameInfo:281 isFrameAddressTaken: false282 isReturnAddressTaken: false283 hasStackMap: false284 hasPatchPoint: false285 stackSize: 0286 offsetAdjustment: 0287 maxAlignment: 4288 adjustsStack: false289 hasCalls: false290 stackProtector: ''291 functionContext: ''292 maxCallFrameSize: 0293 cvBytesOfCalleeSavedRegisters: 0294 hasOpaqueSPAdjustment: false295 hasVAStart: false296 hasMustTailInVarArgFunc: false297 hasTailCall: false298 localFrameSize: 2052299 savePoint: []300 restorePoint: []301fixedStack: []302stack: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: '' }311entry_values: []312callSites: []313debugValueSubstitutions: []314constants: []315machineFunctionInfo: {}316body: |317 bb.0.entry:318 successors: %bb.1(0x40000000)319 liveins: $r0320 321 ; CHECK-LABEL: name: test_live_out322 ; CHECK-LABEL: bb.0.entry:323 ; CHECK: tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr324 ; CHECK-NEXT: $r2 = t2MRS_M 2048, 14 /* CC::al */, $noreg, implicit $cpsr325 ; CHECK-NEXT: $r1 = tMOVi32imm 2048, implicit-def $cpsr326 ; CHECK-NEXT: t2MSR_M 2048, killed $r2, 14 /* CC::al */, $noreg, implicit-def $cpsr327 ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg328 ; CHECK-NEXT: tSTRi renamable $r0, killed $r1, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)329 330 tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr331 tSTRspi renamable $r0, %stack.0.var, 0, 14 /* CC::al */, $noreg :: (store (s32) into %ir.var)332 tB %bb.1, 14 /* CC::al */, $noreg333 334 bb.1.if.then:335 successors: %bb.2(0x40000000), %bb.3(0x40000000)336 liveins: $cpsr337 338 tBcc %bb.3, 5 /* CC::pl */, killed $cpsr339 tB %bb.2, 14 /* CC::al */, $noreg340 341 bb.2.if.then2:342 successors: %bb.3(0x80000000)343 344 tB %bb.3, 14 /* CC::al */, $noreg345 346 bb.3.if.end:347 tBX_RET 14 /* CC::al */, $noreg348 349...350---351name: test_live_out_def_after_mov352alignment: 2353exposesReturnsTwice: false354legalized: false355regBankSelected: false356selected: false357failedISel: false358tracksRegLiveness: true359hasWinCFI: false360callsEHReturn: false361callsUnwindInit: false362hasEHContTarget: false363hasEHScopes: false364hasEHFunclets: false365isOutlined: false366debugInstrRef: false367failsVerification: false368tracksDebugUserValues: false369registers: []370liveins:371 - { reg: '$r0', virtual-reg: '' }372frameInfo:373 isFrameAddressTaken: false374 isReturnAddressTaken: false375 hasStackMap: false376 hasPatchPoint: false377 stackSize: 0378 offsetAdjustment: 0379 maxAlignment: 4380 adjustsStack: false381 hasCalls: false382 stackProtector: ''383 functionContext: ''384 maxCallFrameSize: 0385 cvBytesOfCalleeSavedRegisters: 0386 hasOpaqueSPAdjustment: false387 hasVAStart: false388 hasMustTailInVarArgFunc: false389 hasTailCall: false390 localFrameSize: 2052391 savePoint: []392 restorePoint: []393fixedStack: []394stack: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: '' }403entry_values: []404callSites: []405debugValueSubstitutions: []406constants: []407machineFunctionInfo: {}408body: |409 bb.0.entry:410 successors: %bb.1(0x40000000)411 liveins: $r0412 413 ; Here the live-out cpsr is defined after the tMOVi32imm, so cpsr doesn't414 ; need to be saved.415 ; CHECK-LABEL: name: test_live_out416 ; CHECK-LABEL: bb.0.entry:417 ; CHECK: $r1 = tMOVi32imm 2048, implicit-def $cpsr418 ; CHECK-NEXT: $r1 = tADDhirr $r1, killed $sp, 14 /* CC::al */, $noreg419 ; 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 $cpsr421 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 $cpsr424 tB %bb.1, 14 /* CC::al */, $noreg425 426 bb.1.if.then:427 successors: %bb.2(0x40000000), %bb.3(0x40000000)428 liveins: $cpsr429 430 tBcc %bb.3, 5 /* CC::pl */, killed $cpsr431 tB %bb.2, 14 /* CC::al */, $noreg432 433 bb.2.if.then2:434 successors: %bb.3(0x80000000)435 436 tB %bb.3, 14 /* CC::al */, $noreg437 438 bb.3.if.end:439 tBX_RET 14 /* CC::al */, $noreg440 441...442