215 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 22# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -verify-machineinstrs -run-pass=prologepilog -o - %s | FileCheck -check-prefix=GCN %s3 4# We're keeping the IR around for the callees and the CCs5 6--- |7 declare amdgpu_cs_chain void @callee()8 declare amdgpu_gfx void @gfx_callee()9 10 define amdgpu_cs_chain void @preserve_inactive_wwm() {ret void}11 define amdgpu_cs_chain void @dont_preserve_wwm_if_no_chain_calls() {ret void}12 define amdgpu_cs_chain void @dont_preserve_wwm_if_init_whole_wave() {ret void}13 define amdgpu_cs_chain void @dont_preserve_non_wwm() {ret void}14 define amdgpu_cs_chain void @dont_preserve_v0_v7() {ret void}15 define amdgpu_cs_chain void @dont_preserve_sgpr() {ret void}16...17---18 19# Check that we preserve the inactive lanes of registers v8+ received in the20# MachineFunctionInfo as wwmReservedRegs.21 22---23name: preserve_inactive_wwm24tracksRegLiveness: true25frameInfo:26 hasTailCall: true27machineFunctionInfo:28 stackPtrOffsetReg: '$sgpr32'29 returnsVoid: true30 wwmReservedRegs:31 - '$vgpr8'32 - '$vgpr9'33body: |34 bb.0:35 liveins: $sgpr0, $sgpr35, $vgpr8, $vgpr936 37 ; GCN-LABEL: name: preserve_inactive_wwm38 ; GCN: liveins: $sgpr0, $sgpr35, $vgpr8, $vgpr939 ; GCN-NEXT: {{ $}}40 ; GCN-NEXT: $sgpr1 = S_XOR_SAVEEXEC_B32 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec41 ; GCN-NEXT: SCRATCH_STORE_DWORD_ST $vgpr8, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32) into %stack.0, addrspace 5)42 ; GCN-NEXT: SCRATCH_STORE_DWORD_ST $vgpr9, 4, 0, implicit $exec, implicit $flat_scr :: (store (s32) into %stack.1, addrspace 5)43 ; GCN-NEXT: $exec_lo = S_MOV_B32 killed $sgpr144 ; GCN-NEXT: renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc45 ; GCN-NEXT: renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)46 ; GCN-NEXT: S_NOP 0, implicit-def $vgpr0, implicit-def $vgpr1, implicit-def $vgpr2, implicit-def $vgpr3, implicit-def $vgpr4, implicit-def $vgpr5, implicit-def $vgpr6, implicit-def $vgpr747 ; GCN-NEXT: $sgpr1 = S_XOR_SAVEEXEC_B32 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec48 ; GCN-NEXT: $vgpr8 = SCRATCH_LOAD_DWORD_ST 0, 0, implicit $exec, implicit $flat_scr, implicit $vgpr8(tied-def 0) :: (load (s32) from %stack.0, addrspace 5)49 ; GCN-NEXT: $vgpr9 = SCRATCH_LOAD_DWORD_ST 4, 0, implicit $exec, implicit $flat_scr :: (load (s32) from %stack.1, addrspace 5)50 ; GCN-NEXT: $exec_lo = S_MOV_B32 killed $sgpr151 ; GCN-NEXT: SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr852 renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc53 renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)54 S_NOP 0, implicit-def $vgpr0, implicit-def $vgpr1, implicit-def $vgpr2, implicit-def $vgpr3, implicit-def $vgpr4, implicit-def $vgpr5, implicit-def $vgpr6, implicit-def $vgpr755 SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr856 57...58 59---60name: dont_preserve_wwm_if_no_chain_calls61tracksRegLiveness: true62frameInfo:63 hasTailCall: false64machineFunctionInfo:65 stackPtrOffsetReg: '$sgpr32'66 returnsVoid: true67 wwmReservedRegs:68 - '$vgpr9'69body: |70 bb.0:71 liveins: $sgpr35, $vgpr872 73 ; GCN-LABEL: name: dont_preserve_wwm_if_no_chain_calls74 ; GCN: liveins: $sgpr35, $vgpr875 ; GCN-NEXT: {{ $}}76 ; GCN-NEXT: $vgpr8 = SI_SPILL_S32_TO_VGPR $sgpr35, 0, killed $vgpr877 ; GCN-NEXT: $sgpr35 = S_MOV_B32 578 ; GCN-NEXT: $sgpr35 = SI_RESTORE_S32_FROM_VGPR $vgpr8, 079 ; GCN-NEXT: renamable $vgpr8 = V_MOV_B32_e32 10, implicit $exec80 ; GCN-NEXT: S_NOP 0, implicit-def $vgpr0, implicit-def $vgpr1, implicit-def $vgpr2, implicit-def $vgpr3, implicit-def $vgpr4, implicit-def $vgpr5, implicit-def $vgpr6, implicit-def $vgpr781 ; GCN-NEXT: S_ENDPGM 082 renamable $vgpr8 = SI_SPILL_S32_TO_VGPR $sgpr35, 0, killed $vgpr883 $sgpr35 = S_MOV_B32 584 $sgpr35 = SI_RESTORE_S32_FROM_VGPR $vgpr8, 085 renamable $vgpr8 = V_MOV_B32_e32 10, implicit $exec86 S_NOP 0, implicit-def $vgpr0, implicit-def $vgpr1, implicit-def $vgpr2, implicit-def $vgpr3, implicit-def $vgpr4, implicit-def $vgpr5, implicit-def $vgpr6, implicit-def $vgpr787 S_ENDPGM 088...89 90---91name: dont_preserve_wwm_if_init_whole_wave92tracksRegLiveness: true93frameInfo:94 hasTailCall: true95machineFunctionInfo:96 stackPtrOffsetReg: '$sgpr32'97 returnsVoid: true98 wwmReservedRegs:99 - '$vgpr8'100 - '$vgpr9'101 hasInitWholeWave: true102body: |103 bb.0:104 liveins: $sgpr0, $sgpr35, $vgpr8, $vgpr9105 106 ; GCN-LABEL: name: dont_preserve_wwm_if_init_whole_wave107 ; GCN: liveins: $sgpr0, $sgpr35108 ; GCN-NEXT: {{ $}}109 ; GCN-NEXT: renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc110 ; GCN-NEXT: renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)111 ; GCN-NEXT: SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr1112 renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc113 renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)114 SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr8115 116...117 118---119name: dont_preserve_non_wwm120tracksRegLiveness: true121frameInfo:122 hasTailCall: true123machineFunctionInfo:124 stackPtrOffsetReg: '$sgpr32'125 isChainFunction: true126 returnsVoid: true127body: |128 bb.0:129 liveins: $sgpr0, $sgpr35, $vgpr0, $vgpr8, $vgpr16130 131 ; GCN-LABEL: name: dont_preserve_non_wwm132 ; GCN: liveins: $sgpr0, $sgpr35, $vgpr0, $vgpr8, $vgpr16133 ; GCN-NEXT: {{ $}}134 ; GCN-NEXT: renamable $vgpr16 = V_MOV_B32_e32 16, implicit $exec135 ; GCN-NEXT: renamable $vgpr8 = V_MOV_B32_e32 8, implicit $exec136 ; GCN-NEXT: renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc137 ; GCN-NEXT: renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)138 ; GCN-NEXT: SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr8139 renamable $vgpr16 = V_MOV_B32_e32 16, implicit $exec140 renamable $vgpr8 = V_MOV_B32_e32 8, implicit $exec141 renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc142 renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)143 SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr8144 145...146 147---148name: dont_preserve_v0_v7149tracksRegLiveness: true150frameInfo:151 hasTailCall: true152machineFunctionInfo:153 stackPtrOffsetReg: '$sgpr32'154 isChainFunction: true155 returnsVoid: true156 wwmReservedRegs:157 - '$vgpr1'158body: |159 bb.0:160 liveins: $sgpr0, $sgpr35, $vgpr0, $vgpr7, $vgpr8, $vgpr9161 162 ; GCN-LABEL: name: dont_preserve_v0_v7163 ; GCN: liveins: $sgpr0, $sgpr35, $vgpr0, $vgpr7, $vgpr8, $vgpr9164 ; GCN-NEXT: {{ $}}165 ; GCN-NEXT: $vgpr0 = SI_SPILL_S32_TO_VGPR $sgpr35, 0, killed $vgpr0166 ; GCN-NEXT: $sgpr35 = S_MOV_B32 5167 ; GCN-NEXT: $sgpr35 = SI_RESTORE_S32_FROM_VGPR $vgpr0, 0168 ; GCN-NEXT: renamable $vgpr0 = V_MOV_B32_e32 10, implicit $exec169 ; GCN-NEXT: renamable $vgpr7 = V_MOV_B32_e32 16, implicit $exec170 ; GCN-NEXT: renamable $vgpr8 = COPY killed renamable $vgpr0171 ; GCN-NEXT: renamable $vgpr9 = COPY killed renamable $vgpr7172 ; GCN-NEXT: renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc173 ; GCN-NEXT: renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)174 ; GCN-NEXT: SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr8, implicit $vgpr9175 renamable $vgpr0 = SI_SPILL_S32_TO_VGPR $sgpr35, 0, killed $vgpr0176 $sgpr35 = S_MOV_B32 5177 $sgpr35 = SI_RESTORE_S32_FROM_VGPR $vgpr0, 0178 renamable $vgpr0 = V_MOV_B32_e32 10, implicit $exec179 renamable $vgpr7 = V_MOV_B32_e32 16, implicit $exec180 renamable $vgpr8 = COPY killed renamable $vgpr0181 renamable $vgpr9 = COPY killed renamable $vgpr7182 renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc183 renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)184 SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0, implicit $vgpr8, implicit $vgpr9185 186...187 188---189name: dont_preserve_sgpr190tracksRegLiveness: true191frameInfo:192 hasTailCall: true193machineFunctionInfo:194 stackPtrOffsetReg: '$sgpr32'195 returnsVoid: true196body: |197 bb.0 (%ir-block.0):198 liveins: $sgpr0199 200 ; GCN-LABEL: name: dont_preserve_sgpr201 ; GCN: liveins: $sgpr0202 ; GCN-NEXT: {{ $}}203 ; GCN-NEXT: renamable $sgpr1 = S_ADD_I32 killed renamable $sgpr0, renamable $sgpr0, implicit-def dead $scc204 ; GCN-NEXT: $sgpr0 = COPY killed renamable $sgpr1205 ; GCN-NEXT: renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc206 ; GCN-NEXT: renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)207 ; GCN-NEXT: SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0208 renamable $sgpr1 = S_ADD_I32 killed renamable $sgpr0, renamable $sgpr0, implicit-def dead $scc209 $sgpr0 = COPY killed renamable $sgpr1210 renamable $sgpr4_sgpr5 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-gotprel32-lo) @callee + 4, target-flags(amdgpu-gotprel32-hi) @callee + 12, implicit-def dead $scc211 renamable $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (p0) from got, addrspace 4)212 SI_CS_CHAIN_TC_W32 killed renamable $sgpr4_sgpr5, @callee, 0, -1, amdgpu_allvgprs, implicit $sgpr0213 214...215