| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -march=riscv64 -run-pass=prologepilog -simplify-mir -o - %s | FileCheck %s |
| # verify live-on-entry registers are not marked killed by spills |
| --- | |
| |
| declare void @vararg(i32 signext, ...) |
| |
| define void @test1() { |
| entry: |
| %a = alloca i32, align 4 |
| %0 = call i8* @llvm.returnaddress(i32 0) |
| %1 = ptrtoint i8* %0 to i64 |
| %conv = trunc i64 %1 to i32 |
| store i32 %conv, i32* %a, align 4 |
| %2 = load i32, i32* %a, align 4 |
| call void (i32, ...) @vararg(i32 signext 0, i32 signext %2) |
| ret void |
| } |
| |
| ; Function Attrs: nofree nosync nounwind readnone willreturn |
| declare i8* @llvm.returnaddress(i32 immarg) #0 |
| |
| attributes #0 = { nofree nosync nounwind readnone willreturn } |
| |
| ... |
| --- |
| name: test1 |
| alignment: 4 |
| exposesReturnsTwice: false |
| legalized: false |
| regBankSelected: false |
| selected: false |
| failedISel: false |
| tracksRegLiveness: true |
| hasWinCFI: false |
| registers: [] |
| liveins: |
| - { reg: '$x1', virtual-reg: '' } |
| frameInfo: |
| isFrameAddressTaken: false |
| isReturnAddressTaken: true |
| hasStackMap: false |
| hasPatchPoint: false |
| stackSize: 0 |
| offsetAdjustment: 0 |
| maxAlignment: 4 |
| adjustsStack: false |
| hasCalls: true |
| stackProtector: '' |
| maxCallFrameSize: 4294967295 |
| cvBytesOfCalleeSavedRegisters: 0 |
| hasOpaqueSPAdjustment: false |
| hasVAStart: false |
| hasMustTailInVarArgFunc: false |
| hasTailCall: false |
| localFrameSize: 0 |
| savePoint: '' |
| restorePoint: '' |
| fixedStack: [] |
| stack: |
| - { id: 0, name: a, type: default, offset: 0, size: 4, alignment: 4, |
| stack-id: default, callee-saved-register: '', callee-saved-restored: true, |
| debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } |
| callSites: [] |
| debugValueSubstitutions: [] |
| constants: [] |
| machineFunctionInfo: {} |
| body: | |
| bb.0.entry: |
| liveins: $x1 |
| |
| ; CHECK-LABEL: name: test1 |
| ; CHECK: liveins: $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: $x2 = frame-setup ADDI $x2, -16 |
| ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16 |
| ; CHECK-NEXT: SD $x1, $x2, 8 :: (store (s64) into %stack.1) |
| ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $x1, -8 |
| ; CHECK-NEXT: SW renamable $x1, $x2, 4 :: (store (s32) into %ir.a) |
| ; CHECK-NEXT: renamable $x11 = ADDIW killed renamable $x1, 0 |
| ; CHECK-NEXT: $x10 = COPY $x0 |
| ; CHECK-NEXT: PseudoCALL target-flags(riscv-plt) @vararg, csr_ilp32_lp64, implicit-def dead $x1, implicit killed $x10, implicit $x11, implicit-def $x2 |
| ; CHECK-NEXT: $x1 = LD $x2, 8 :: (load (s64) from %stack.1) |
| ; CHECK-NEXT: $x2 = frame-destroy ADDI $x2, 16 |
| ; CHECK-NEXT: PseudoRET |
| SW renamable $x1, %stack.0.a, 0 :: (store (s32) into %ir.a) |
| renamable $x11 = ADDIW killed renamable $x1, 0 |
| ADJCALLSTACKDOWN 0, 0, implicit-def dead $x2, implicit $x2 |
| $x10 = COPY $x0 |
| PseudoCALL target-flags(riscv-plt) @vararg, csr_ilp32_lp64, implicit-def dead $x1, implicit killed $x10, implicit $x11, implicit-def $x2 |
| ADJCALLSTACKUP 0, 0, implicit-def dead $x2, implicit $x2 |
| PseudoRET |
| |
| ... |