brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.6 KiB · 6a6d474 Raw
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