# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 # RUN: llc -mtriple=riscv64 -x mir -run-pass=prologepilog -verify-machineinstrs < %s \ # RUN: | FileCheck %s -check-prefixes=RV64I # RUN: llc -mtriple=riscv32 -x mir -run-pass=prologepilog -verify-machineinstrs < %s \ # RUN: | FileCheck %s -check-prefixes=RV32I --- | ; Function Attrs: uwtable define void @no_reserved_call_frame(i64 %n) #0 { entry: %v = alloca i32, i64 %n, align 4 call void @callee_stack_args(ptr %v, [518 x i64] poison) ret void } declare void @callee_stack_args(ptr, [518 x i64]) #1 attributes #0 = { uwtable "frame-pointer"="none" "probe-stack"="inline-asm" "target-features"="+m" } attributes #1 = { "target-features"="+m" } ... --- name: no_reserved_call_frame alignment: 4 exposesReturnsTwice: false legalized: false regBankSelected: false selected: false failedISel: false tracksRegLiveness: true hasWinCFI: false noPhis: true isSSA: false noVRegs: true hasFakeUses: false callsEHReturn: false callsUnwindInit: false hasEHContTarget: false hasEHScopes: false hasEHFunclets: false isOutlined: false debugInstrRef: false failsVerification: false tracksDebugUserValues: true registers: [] liveins: - { reg: '$x10', virtual-reg: '' } frameInfo: isFrameAddressTaken: false isReturnAddressTaken: false hasStackMap: false hasPatchPoint: false stackSize: 0 offsetAdjustment: 0 maxAlignment: 8 adjustsStack: true hasCalls: true stackProtector: '' functionContext: '' maxCallFrameSize: 4294967295 cvBytesOfCalleeSavedRegisters: 0 hasOpaqueSPAdjustment: false hasVAStart: false hasMustTailInVarArgFunc: false hasTailCall: false isCalleeSavedInfoValid: false localFrameSize: 0 savePoint: '' restorePoint: '' fixedStack: [] stack: - { id: 0, name: v, type: variable-sized, offset: 0, alignment: 1, stack-id: default, callee-saved-register: '', callee-saved-restored: true, local-offset: 0, debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } entry_values: [] callSites: [] debugValueSubstitutions: [] constants: [] machineFunctionInfo: varArgsFrameIndex: 0 varArgsSaveSize: 0 body: | ; RV64I-LABEL: name: no_reserved_call_frame ; RV64I: bb.0.entry: ; RV64I-NEXT: successors: %bb.1(0x80000000) ; RV64I-NEXT: liveins: $x10, $x1 ; RV64I-NEXT: {{ $}} ; RV64I-NEXT: $x2 = frame-setup ADDI $x2, -16 ; RV64I-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16 ; RV64I-NEXT: frame-setup SD killed $x1, $x2, 8 :: (store (s64) into %stack.1) ; RV64I-NEXT: frame-setup SD killed $x8, $x2, 0 :: (store (s64) into %stack.2) ; RV64I-NEXT: frame-setup CFI_INSTRUCTION offset $x1, -8 ; RV64I-NEXT: frame-setup CFI_INSTRUCTION offset $x8, -16 ; RV64I-NEXT: $x8 = frame-setup ADDI $x2, 16 ; RV64I-NEXT: frame-setup CFI_INSTRUCTION def_cfa $x8, 0 ; RV64I-NEXT: renamable $x10 = SLLI killed renamable $x10, 2 ; RV64I-NEXT: renamable $x10 = nuw ADDI killed renamable $x10, 15 ; RV64I-NEXT: renamable $x10 = ANDI killed renamable $x10, -16 ; RV64I-NEXT: renamable $x10 = SUB $x2, killed renamable $x10 ; RV64I-NEXT: renamable $x11 = LUI 1 ; RV64I-NEXT: {{ $}} ; RV64I-NEXT: bb.1.entry: ; RV64I-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) ; RV64I-NEXT: liveins: $x10, $x11 ; RV64I-NEXT: {{ $}} ; RV64I-NEXT: $x2 = SUB $x2, renamable $x11 ; RV64I-NEXT: SD $x0, $x2, 0 ; RV64I-NEXT: BLT renamable $x10, $x2, %bb.1 ; RV64I-NEXT: {{ $}} ; RV64I-NEXT: bb.2.entry: ; RV64I-NEXT: liveins: $x10 ; RV64I-NEXT: {{ $}} ; RV64I-NEXT: $x2 = ADDI renamable $x10, 0 ; RV64I-NEXT: $x11 = LUI 1 ; RV64I-NEXT: $x2 = SUB $x2, killed $x11 ; RV64I-NEXT: PseudoCALL target-flags(riscv-call) @callee_stack_args, csr_ilp32_lp64, implicit-def dead $x1, implicit $x10, implicit undef $x11, implicit undef $x12, implicit undef $x13, implicit undef $x14, implicit undef $x15, implicit undef $x16, implicit undef $x17, implicit-def $x2 ; RV64I-NEXT: $x10 = LUI 1 ; RV64I-NEXT: $x2 = ADD $x2, killed $x10 ; RV64I-NEXT: $x2 = frame-destroy ADDI $x8, -16 ; RV64I-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $x2, 16 ; RV64I-NEXT: $x1 = frame-destroy LD $x2, 8 :: (load (s64) from %stack.1) ; RV64I-NEXT: $x8 = frame-destroy LD $x2, 0 :: (load (s64) from %stack.2) ; RV64I-NEXT: frame-destroy CFI_INSTRUCTION restore $x1 ; RV64I-NEXT: frame-destroy CFI_INSTRUCTION restore $x8 ; RV64I-NEXT: $x2 = frame-destroy ADDI $x2, 16 ; RV64I-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 ; RV64I-NEXT: PseudoRET ; ; RV32I-LABEL: name: no_reserved_call_frame ; RV32I: bb.0.entry: ; RV32I-NEXT: successors: %bb.1(0x80000000) ; RV32I-NEXT: liveins: $x10, $x1 ; RV32I-NEXT: {{ $}} ; RV32I-NEXT: $x2 = frame-setup ADDI $x2, -16 ; RV32I-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16 ; RV32I-NEXT: frame-setup SW killed $x1, $x2, 12 :: (store (s32) into %stack.1) ; RV32I-NEXT: frame-setup SW killed $x8, $x2, 8 :: (store (s32) into %stack.2) ; RV32I-NEXT: frame-setup CFI_INSTRUCTION offset $x1, -4 ; RV32I-NEXT: frame-setup CFI_INSTRUCTION offset $x8, -8 ; RV32I-NEXT: $x8 = frame-setup ADDI $x2, 16 ; RV32I-NEXT: frame-setup CFI_INSTRUCTION def_cfa $x8, 0 ; RV32I-NEXT: renamable $x10 = SLLI killed renamable $x10, 2 ; RV32I-NEXT: renamable $x10 = nuw ADDI killed renamable $x10, 15 ; RV32I-NEXT: renamable $x10 = ANDI killed renamable $x10, -16 ; RV32I-NEXT: renamable $x10 = SUB $x2, killed renamable $x10 ; RV32I-NEXT: renamable $x11 = LUI 1 ; RV32I-NEXT: {{ $}} ; RV32I-NEXT: bb.1.entry: ; RV32I-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) ; RV32I-NEXT: liveins: $x10, $x11 ; RV32I-NEXT: {{ $}} ; RV32I-NEXT: $x2 = SUB $x2, renamable $x11 ; RV32I-NEXT: SD $x0, $x2, 0 ; RV32I-NEXT: BLT renamable $x10, $x2, %bb.1 ; RV32I-NEXT: {{ $}} ; RV32I-NEXT: bb.2.entry: ; RV32I-NEXT: liveins: $x10 ; RV32I-NEXT: {{ $}} ; RV32I-NEXT: $x2 = ADDI renamable $x10, 0 ; RV32I-NEXT: $x11 = LUI 1 ; RV32I-NEXT: $x2 = SUB $x2, killed $x11 ; RV32I-NEXT: PseudoCALL target-flags(riscv-call) @callee_stack_args, csr_ilp32_lp64, implicit-def dead $x1, implicit $x10, implicit undef $x11, implicit undef $x12, implicit undef $x13, implicit undef $x14, implicit undef $x15, implicit undef $x16, implicit undef $x17, implicit-def $x2 ; RV32I-NEXT: $x10 = LUI 1 ; RV32I-NEXT: $x2 = ADD $x2, killed $x10 ; RV32I-NEXT: $x2 = frame-destroy ADDI $x8, -16 ; RV32I-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $x2, 16 ; RV32I-NEXT: $x1 = frame-destroy LW $x2, 12 :: (load (s32) from %stack.1) ; RV32I-NEXT: $x8 = frame-destroy LW $x2, 8 :: (load (s32) from %stack.2) ; RV32I-NEXT: frame-destroy CFI_INSTRUCTION restore $x1 ; RV32I-NEXT: frame-destroy CFI_INSTRUCTION restore $x8 ; RV32I-NEXT: $x2 = frame-destroy ADDI $x2, 16 ; RV32I-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 ; RV32I-NEXT: PseudoRET bb.0.entry: successors: %bb.1(0x80000000) liveins: $x10 renamable $x10 = SLLI killed renamable $x10, 2 renamable $x10 = nuw ADDI killed renamable $x10, 15 renamable $x10 = ANDI killed renamable $x10, -16 renamable $x10 = SUB $x2, killed renamable $x10 renamable $x11 = LUI 1 bb.1.entry: successors: %bb.2(0x40000000), %bb.1(0x40000000) liveins: $x10, $x11 $x2 = SUB $x2, renamable $x11 SD $x0, $x2, 0 BLT renamable $x10, $x2, %bb.1 bb.2.entry: liveins: $x10 $x2 = ADDI renamable $x10, 0 ADJCALLSTACKDOWN 4088, 0, implicit-def dead $x2, implicit $x2 PseudoCALL target-flags(riscv-call) @callee_stack_args, csr_ilp32_lp64, implicit-def dead $x1, implicit $x10, implicit undef $x11, implicit undef $x12, implicit undef $x13, implicit undef $x14, implicit undef $x15, implicit undef $x16, implicit undef $x17, implicit-def $x2 ADJCALLSTACKUP 4088, 0, implicit-def dead $x2, implicit $x2 PseudoRET ...