1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=aarch64 -run-pass=cfi-fixup %s -o - | FileCheck %s 3--- | 4 define i32 @f0(i32 %x) #0 { 5 entry: br label %return 6 if.end: br label %return 7 if.then2: br label %return 8 if.else: br label %return 9 return: 10 ret i32 0 11 } 12 13 declare i32 @g(i32) 14 15 attributes #0 = { nounwind shadowcallstack uwtable "sign-return-address"="non-leaf" "target-features"="+reserve-x18" } 16 17... 18--- 19name: f0 20alignment: 4 21exposesReturnsTwice: false 22legalized: false 23regBankSelected: false 24selected: false 25failedISel: false 26tracksRegLiveness: true 27hasWinCFI: false 28failsVerification: false 29registers: [] 30liveins: 31 - { reg: '$w0', virtual-reg: '' } 32frameInfo: 33 isFrameAddressTaken: false 34 isReturnAddressTaken: false 35 hasStackMap: false 36 hasPatchPoint: false 37 stackSize: 16 38 offsetAdjustment: 0 39 maxAlignment: 16 40 adjustsStack: true 41 hasCalls: true 42 stackProtector: '' 43 maxCallFrameSize: 0 44 cvBytesOfCalleeSavedRegisters: 0 45 hasOpaqueSPAdjustment: false 46 hasVAStart: false 47 hasMustTailInVarArgFunc: false 48 hasTailCall: false 49 localFrameSize: 0 50 savePoint: '' 51 restorePoint: '' 52fixedStack: [] 53stack: 54 - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16, 55 stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true, 56 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } 57callSites: [] 58debugValueSubstitutions: [] 59constants: [] 60machineFunctionInfo: 61 hasRedZone: false 62body: | 63 ; CHECK-LABEL: name: f0 64 ; CHECK: bb.0.entry: 65 ; CHECK-NEXT: successors: %bb.4(0x30000000), %bb.1(0x50000000) 66 ; CHECK-NEXT: liveins: $w0, $lr, $x18 67 ; CHECK-NEXT: {{ $}} 68 ; CHECK-NEXT: CBZW renamable $w0, %bb.4 69 ; CHECK-NEXT: {{ $}} 70 ; CHECK-NEXT: bb.1.if.end: 71 ; CHECK-NEXT: successors: %bb.3(0x30000000), %bb.2(0x50000000) 72 ; CHECK-NEXT: liveins: $w0, $lr, $x18 73 ; CHECK-NEXT: {{ $}} 74 ; CHECK-NEXT: early-clobber $x18 = frame-setup STRXpost $lr, $x18, 8 75 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x16, 0x12, 0x02, 0x82, 0x78 76 ; CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 77 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 78 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0) 79 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16 80 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -16 81 ; CHECK-NEXT: CFI_INSTRUCTION remember_state 82 ; CHECK-NEXT: TBNZW renamable $w0, 31, %bb.3 83 ; CHECK-NEXT: {{ $}} 84 ; CHECK-NEXT: bb.2.if.else: 85 ; CHECK-NEXT: successors: %bb.5(0x80000000) 86 ; CHECK-NEXT: liveins: $w0 87 ; CHECK-NEXT: {{ $}} 88 ; CHECK-NEXT: renamable $w0 = nuw nsw ADDWri killed renamable $w0, 1, 0 89 ; CHECK-NEXT: BL @g, csr_aarch64_aapcs_scs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 90 ; CHECK-NEXT: renamable $w8 = MOVZWi 1, 0 91 ; CHECK-NEXT: $w0 = SUBWrs killed renamable $w8, killed renamable $w0, 0 92 ; CHECK-NEXT: B %bb.5 93 ; CHECK-NEXT: {{ $}} 94 ; CHECK-NEXT: bb.3.if.then2 (bbsections 1): 95 ; CHECK-NEXT: successors: %bb.5(0x80000000) 96 ; CHECK-NEXT: liveins: $w0 97 ; CHECK-NEXT: {{ $}} 98 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x16, 0x12, 0x02, 0x82, 0x78 99 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 100 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16 101 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -16 102 ; CHECK-NEXT: renamable $w0 = nsw SUBWri killed renamable $w0, 1, 0 103 ; CHECK-NEXT: BL @g, csr_aarch64_aapcs_scs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 104 ; CHECK-NEXT: renamable $w0 = nsw ADDWri killed renamable $w0, 1, 0 105 ; CHECK-NEXT: B %bb.5 106 ; CHECK-NEXT: {{ $}} 107 ; CHECK-NEXT: bb.4.return: 108 ; CHECK-NEXT: liveins: $w0 109 ; CHECK-NEXT: {{ $}} 110 ; CHECK-NEXT: RET undef $lr, implicit killed $w0 111 ; CHECK-NEXT: {{ $}} 112 ; CHECK-NEXT: bb.5.return: 113 ; CHECK-NEXT: successors: %bb.7(0x80000000) 114 ; CHECK-NEXT: liveins: $w0 115 ; CHECK-NEXT: {{ $}} 116 ; CHECK-NEXT: CFI_INSTRUCTION restore_state 117 ; CHECK-NEXT: CFI_INSTRUCTION remember_state 118 ; CHECK-NEXT: B %bb.7 119 ; CHECK-NEXT: {{ $}} 120 ; CHECK-NEXT: bb.6.return: 121 ; CHECK-NEXT: liveins: $w0 122 ; CHECK-NEXT: {{ $}} 123 ; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0) 124 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 125 ; CHECK-NEXT: frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 126 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION negate_ra_sign_state 127 ; CHECK-NEXT: early-clobber $x18, $lr = frame-destroy LDRXpre $x18, -8 128 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w18 129 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30 130 ; CHECK-NEXT: RET undef $lr, implicit killed $w0 131 ; CHECK-NEXT: {{ $}} 132 ; CHECK-NEXT: bb.7.return: 133 ; CHECK-NEXT: successors: %bb.6(0x80000000) 134 ; CHECK-NEXT: liveins: $w0 135 ; CHECK-NEXT: {{ $}} 136 ; CHECK-NEXT: CFI_INSTRUCTION restore_state 137 ; CHECK-NEXT: B %bb.6 138 bb.0.entry: 139 successors: %bb.4(0x30000000), %bb.1(0x50000000) 140 liveins: $w0, $lr, $x18 141 142 CBZW renamable $w0, %bb.4 143 144 bb.1.if.end: 145 successors: %bb.3(0x30000000), %bb.2(0x50000000) 146 liveins: $w0, $lr, $x18 147 148 early-clobber $x18 = frame-setup STRXpost $lr, $x18, 8 149 frame-setup CFI_INSTRUCTION escape 0x16, 0x12, 0x02, 0x82, 0x78 150 frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 151 frame-setup CFI_INSTRUCTION negate_ra_sign_state 152 early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0) 153 frame-setup CFI_INSTRUCTION def_cfa_offset 16 154 frame-setup CFI_INSTRUCTION offset $w30, -16 155 TBNZW renamable $w0, 31, %bb.3 156 157 bb.2.if.else: 158 successors: %bb.5(0x80000000) 159 liveins: $w0 160 161 renamable $w0 = nuw nsw ADDWri killed renamable $w0, 1, 0 162 BL @g, csr_aarch64_aapcs_scs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 163 renamable $w8 = MOVZWi 1, 0 164 $w0 = SUBWrs killed renamable $w8, killed renamable $w0, 0 165 B %bb.5 166 167 bb.3.if.then2 (bbsections 1): 168 successors: %bb.5(0x80000000) 169 liveins: $w0 170 171 renamable $w0 = nsw SUBWri killed renamable $w0, 1, 0 172 BL @g, csr_aarch64_aapcs_scs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit-def $sp, implicit-def $w0 173 renamable $w0 = nsw ADDWri killed renamable $w0, 1, 0 174 B %bb.5 175 176 bb.4.return: 177 liveins: $w0 178 RET undef $lr, implicit killed $w0 179 180 bb.5.return: 181 liveins: $w0 182 B %bb.6 183 184 bb.7.return: 185 liveins: $w0 186 early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0) 187 frame-destroy CFI_INSTRUCTION def_cfa_offset 0 188 frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 189 frame-destroy CFI_INSTRUCTION negate_ra_sign_state 190 early-clobber $x18, $lr = frame-destroy LDRXpre $x18, -8 191 frame-destroy CFI_INSTRUCTION restore $w18 192 frame-destroy CFI_INSTRUCTION restore $w30 193 RET undef $lr, implicit killed $w0 194 195 bb.6.return: 196 liveins: $w0 197 B %bb.7 198 199 200... 201