# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3 # RUN: llc -run-pass=cfi-fixup %s -o - | FileCheck %s --- | source_filename = "cfi-fixup.ll" target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" target triple = "aarch64-linux" define i32 @f(i32 %x) #0 { entry: %p = alloca i8, i32 30000, align 1 switch i32 %x, label %if.end7 [ i32 0, label %return i32 1, label %if.then2 i32 2, label %if.then5 ] if.then2: ; preds = %entry %call = tail call i32 @g1(i32 1) %add = add nsw i32 %call, 1 br label %return if.then5: ; preds = %entry %call6 = tail call i32 @g0(i32 2) %sub = sub nsw i32 1, %call6 br label %return if.end7: ; preds = %entry br label %return return: ; preds = %if.end7, %if.then5, %if.then2, %entry %retval.0 = phi i32 [ %add, %if.then2 ], [ %sub, %if.then5 ], [ 0, %if.end7 ], [ 1, %entry ] ret i32 %retval.0 } declare i32 @g1(i32) declare i32 @g0(i32) attributes #0 = { uwtable "probe-stack"="inline-asm" } ... --- name: f alignment: 4 exposesReturnsTwice: false legalized: false regBankSelected: false selected: false failedISel: false tracksRegLiveness: true hasWinCFI: false callsEHReturn: false callsUnwindInit: false hasEHCatchret: false hasEHScopes: false hasEHFunclets: false isOutlined: false debugInstrRef: false failsVerification: false tracksDebugUserValues: true registers: [] liveins: - { reg: '$w0', virtual-reg: '' } frameInfo: isFrameAddressTaken: false isReturnAddressTaken: false hasStackMap: false hasPatchPoint: false stackSize: 30016 offsetAdjustment: 0 maxAlignment: 8 adjustsStack: true hasCalls: true stackProtector: '' functionContext: '' maxCallFrameSize: 0 cvBytesOfCalleeSavedRegisters: 0 hasOpaqueSPAdjustment: false hasVAStart: false hasMustTailInVarArgFunc: false hasTailCall: false localFrameSize: 30000 savePoint: '' restorePoint: '' fixedStack: [] stack: - { id: 0, name: p, type: default, offset: -30016, size: 30000, alignment: 1, stack-id: default, callee-saved-register: '', callee-saved-restored: true, local-offset: -30000, debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } - { id: 1, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8, stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true, debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } - { id: 2, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8, stack-id: default, callee-saved-register: '$fp', callee-saved-restored: true, debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } entry_values: [] callSites: [] debugValueSubstitutions: [] constants: [] machineFunctionInfo: hasRedZone: false body: | ; CHECK-LABEL: name: f ; CHECK: bb.0.entry: ; CHECK-NEXT: successors: %bb.1(0x80000000) ; CHECK-NEXT: liveins: $w0, $lr, $fp ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.2), (store (s64) into %stack.1) ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16 ; CHECK-NEXT: $x9 = frame-setup SUBXri $sp, 7, 12 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w9, 28688 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1.entry: ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) ; CHECK-NEXT: liveins: $x9 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1, 12 ; CHECK-NEXT: $xzr = frame-setup SUBSXrx64 $sp, $x9, 24, implicit-def $nzcv ; CHECK-NEXT: frame-setup STRXui $xzr, $sp, 0 ; CHECK-NEXT: frame-setup Bcc 1, %bb.1, implicit killed $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2.entry: ; CHECK-NEXT: successors: %bb.6(0x20000000), %bb.3(0x60000000) ; CHECK-NEXT: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_register $wsp ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1328, 0 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 30016 ; CHECK-NEXT: CFI_INSTRUCTION remember_state ; CHECK-NEXT: frame-setup STRXui $xzr, $sp, 0 ; CHECK-NEXT: CBZW renamable $w0, %bb.6 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.3.entry: ; CHECK-NEXT: successors: %bb.7(0x2aaaaaab), %bb.4(0x55555555) ; CHECK-NEXT: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: dead $wzr = SUBSWri renamable $w0, 2, 0, implicit-def $nzcv ; CHECK-NEXT: Bcc 0, %bb.7, implicit killed $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.4.entry: ; CHECK-NEXT: successors: %bb.5(0x40000000), %bb.8(0x40000000) ; CHECK-NEXT: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: dead $wzr = SUBSWri renamable $w0, 1, 0, implicit-def $nzcv ; CHECK-NEXT: Bcc 1, %bb.8, implicit killed $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.5.if.then2: ; CHECK-NEXT: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: BL @g1, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 ; CHECK-NEXT: renamable $w0 = nsw ADDWri killed renamable $w0, 1, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 7, 12 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1328, 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 ; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 ; CHECK-NEXT: RET undef $lr, implicit killed $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.6: ; CHECK-NEXT: CFI_INSTRUCTION restore_state ; CHECK-NEXT: CFI_INSTRUCTION remember_state ; CHECK-NEXT: renamable $w0 = MOVZWi 1, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 7, 12 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1328, 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 ; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 ; CHECK-NEXT: RET undef $lr, implicit killed $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.7.if.then5: ; CHECK-NEXT: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: CFI_INSTRUCTION restore_state ; CHECK-NEXT: CFI_INSTRUCTION remember_state ; CHECK-NEXT: BL @g0, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 ; CHECK-NEXT: renamable $w8 = MOVZWi 1, 0 ; CHECK-NEXT: $w0 = SUBWrs killed renamable $w8, killed renamable $w0, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 7, 12 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1328, 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 ; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 ; CHECK-NEXT: RET undef $lr, implicit killed $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.8.if.end7: ; CHECK-NEXT: CFI_INSTRUCTION restore_state ; CHECK-NEXT: $w0 = ORRWrs $wzr, $wzr, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 7, 12 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1328, 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 ; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 ; CHECK-NEXT: RET undef $lr, implicit killed $w0 bb.0.entry: successors: %bb.1(0x80000000) liveins: $w0, $lr, $fp early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.2), (store (s64) into %stack.1) frame-setup CFI_INSTRUCTION def_cfa_offset 16 frame-setup CFI_INSTRUCTION offset $w30, -8 frame-setup CFI_INSTRUCTION offset $w29, -16 $x9 = frame-setup SUBXri $sp, 7, 12 frame-setup CFI_INSTRUCTION def_cfa $w9, 28688 bb.1.entry: successors: %bb.2(0x40000000), %bb.1(0x40000000) liveins: $x9 $sp = frame-setup SUBXri $sp, 1, 12 $xzr = frame-setup SUBSXrx64 $sp, $x9, 24, implicit-def $nzcv frame-setup STRXui $xzr, $sp, 0 frame-setup Bcc 1, %bb.1, implicit killed $nzcv bb.2.entry: successors: %bb.6(0x20000000), %bb.3(0x60000000) liveins: $w0 frame-setup CFI_INSTRUCTION def_cfa_register $wsp $sp = frame-setup SUBXri $sp, 1328, 0 frame-setup CFI_INSTRUCTION def_cfa_offset 30016 frame-setup STRXui $xzr, $sp, 0 CBZW renamable $w0, %bb.6 bb.3.entry: successors: %bb.7(0x2aaaaaab), %bb.4(0x55555555) liveins: $w0 dead $wzr = SUBSWri renamable $w0, 2, 0, implicit-def $nzcv Bcc 0, %bb.7, implicit killed $nzcv bb.4.entry: successors: %bb.5(0x40000000), %bb.8(0x40000000) liveins: $w0 dead $wzr = SUBSWri renamable $w0, 1, 0, implicit-def $nzcv Bcc 1, %bb.8, implicit killed $nzcv bb.5.if.then2: liveins: $w0 BL @g1, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 renamable $w0 = nsw ADDWri killed renamable $w0, 1, 0 $sp = frame-destroy ADDXri $sp, 7, 12 frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 $sp = frame-destroy ADDXri $sp, 1328, 0 frame-destroy CFI_INSTRUCTION def_cfa_offset 16 early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) frame-destroy CFI_INSTRUCTION def_cfa_offset 0 frame-destroy CFI_INSTRUCTION restore $w30 frame-destroy CFI_INSTRUCTION restore $w29 RET undef $lr, implicit killed $w0 bb.6: renamable $w0 = MOVZWi 1, 0 $sp = frame-destroy ADDXri $sp, 7, 12 frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 $sp = frame-destroy ADDXri $sp, 1328, 0 frame-destroy CFI_INSTRUCTION def_cfa_offset 16 early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) frame-destroy CFI_INSTRUCTION def_cfa_offset 0 frame-destroy CFI_INSTRUCTION restore $w30 frame-destroy CFI_INSTRUCTION restore $w29 RET undef $lr, implicit killed $w0 bb.7.if.then5: liveins: $w0 BL @g0, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 renamable $w8 = MOVZWi 1, 0 $w0 = SUBWrs killed renamable $w8, killed renamable $w0, 0 $sp = frame-destroy ADDXri $sp, 7, 12 frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 $sp = frame-destroy ADDXri $sp, 1328, 0 frame-destroy CFI_INSTRUCTION def_cfa_offset 16 early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) frame-destroy CFI_INSTRUCTION def_cfa_offset 0 frame-destroy CFI_INSTRUCTION restore $w30 frame-destroy CFI_INSTRUCTION restore $w29 RET undef $lr, implicit killed $w0 bb.8.if.end7: $w0 = ORRWrs $wzr, $wzr, 0 $sp = frame-destroy ADDXri $sp, 7, 12 frame-destroy CFI_INSTRUCTION def_cfa_offset 1344 $sp = frame-destroy ADDXri $sp, 1328, 0 frame-destroy CFI_INSTRUCTION def_cfa_offset 16 early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.1) frame-destroy CFI_INSTRUCTION def_cfa_offset 0 frame-destroy CFI_INSTRUCTION restore $w30 frame-destroy CFI_INSTRUCTION restore $w29 RET undef $lr, implicit killed $w0 ...