143 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -run-pass=prologepilog,machine-cp -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s3 4# The COPY that moves the return value to VGPR0 should not be removed during machine-cp. The spill restore of the same register that follows,5# meant to only reload its inactive lanes. By marking the reg itself as the tied-op in the spill reload prevents the undesired optimization.6 7---8name: wwm_scratch_reg_spill_reload_of_outgoing_reg9tracksRegLiveness: true10machineFunctionInfo:11 wwmReservedRegs: ['$vgpr0']12 isEntryFunction: false13 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'14 stackPtrOffsetReg: '$sgpr32'15 frameOffsetReg: '$sgpr33'16body: |17 bb.0:18 liveins: $sgpr20, $vgpr119 ; GCN-LABEL: name: wwm_scratch_reg_spill_reload_of_outgoing_reg20 ; GCN: liveins: $sgpr20, $vgpr121 ; GCN-NEXT: {{ $}}22 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec23 ; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)24 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr525 ; GCN-NEXT: $vgpr0 = IMPLICIT_DEF26 ; GCN-NEXT: $vgpr0 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr027 ; GCN-NEXT: $vgpr0 = COPY killed renamable $vgpr1, implicit $exec28 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec29 ; GCN-NEXT: $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec, implicit $vgpr0(tied-def 0) :: (load (s32) from %stack.0, addrspace 5)30 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr531 ; GCN-NEXT: SI_RETURN implicit $vgpr032 $vgpr0 = IMPLICIT_DEF33 $vgpr0 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr034 $vgpr0 = COPY killed renamable $vgpr1, implicit $exec35 SI_RETURN implicit $vgpr036...37 38# The reload of vgpr0 require the tied-op as it is a subreg in the outgoing tuple register vgpr0_vgpr1.39# The vgpr2 doesn't need the tied-op in the reload as it isn't holding any return value.40---41name: wwm_scratch_reg_spill_reload_of_outgoing_tuple_subreg42tracksRegLiveness: true43machineFunctionInfo:44 wwmReservedRegs: ['$vgpr0', '$vgpr2']45 isEntryFunction: false46 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'47 stackPtrOffsetReg: '$sgpr32'48 frameOffsetReg: '$sgpr33'49body: |50 bb.0:51 liveins: $sgpr20, $sgpr21, $vgpr152 ; GCN-LABEL: name: wwm_scratch_reg_spill_reload_of_outgoing_tuple_subreg53 ; GCN: liveins: $sgpr20, $sgpr21, $vgpr154 ; GCN-NEXT: {{ $}}55 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec56 ; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)57 ; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr2, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 4, 0, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5)58 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr559 ; GCN-NEXT: $vgpr0 = IMPLICIT_DEF60 ; GCN-NEXT: $vgpr2 = IMPLICIT_DEF61 ; GCN-NEXT: $vgpr0 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr062 ; GCN-NEXT: $vgpr2 = SI_SPILL_S32_TO_VGPR killed $sgpr21, 0, $vgpr263 ; GCN-NEXT: $vgpr0 = COPY $vgpr1, implicit $exec64 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec65 ; GCN-NEXT: $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec, implicit $vgpr0(tied-def 0) :: (load (s32) from %stack.0, addrspace 5)66 ; GCN-NEXT: $vgpr2 = BUFFER_LOAD_DWORD_OFFSET $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 4, 0, 0, implicit $exec :: (load (s32) from %stack.1, addrspace 5)67 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr568 ; GCN-NEXT: SI_RETURN implicit $vgpr0_vgpr169 $vgpr0 = IMPLICIT_DEF70 $vgpr2 = IMPLICIT_DEF71 $vgpr0 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr072 $vgpr2 = SI_SPILL_S32_TO_VGPR killed $sgpr21, 0, $vgpr273 $vgpr0 = COPY $vgpr1, implicit $exec74 SI_RETURN implicit $vgpr0_vgpr175...76 77# Tied op not required in the spill reload of vgpr2.78 79---80name: wwm_scratch_reg_spill_reload_different_outgoing_reg81tracksRegLiveness: true82machineFunctionInfo:83 wwmReservedRegs: ['$vgpr2']84 isEntryFunction: false85 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'86 stackPtrOffsetReg: '$sgpr32'87 frameOffsetReg: '$sgpr33'88body: |89 bb.0:90 liveins: $sgpr20, $vgpr191 ; GCN-LABEL: name: wwm_scratch_reg_spill_reload_different_outgoing_reg92 ; GCN: liveins: $sgpr20, $vgpr193 ; GCN-NEXT: {{ $}}94 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec95 ; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr2, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)96 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr597 ; GCN-NEXT: $vgpr2 = IMPLICIT_DEF98 ; GCN-NEXT: $vgpr2 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr299 ; GCN-NEXT: $vgpr0 = COPY $vgpr1, implicit $exec100 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec101 ; GCN-NEXT: $vgpr2 = BUFFER_LOAD_DWORD_OFFSET $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (load (s32) from %stack.0, addrspace 5)102 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr5103 ; GCN-NEXT: SI_RETURN implicit $vgpr0_vgpr1104 $vgpr2 = IMPLICIT_DEF105 $vgpr2 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr2106 $vgpr0 = COPY $vgpr1, implicit $exec107 SI_RETURN implicit $vgpr0_vgpr1108...109 110# Tied op not required in the spill reload of vgpr40 which is in the CSR range.111---112name: wwm_csr_spill_reload113tracksRegLiveness: true114machineFunctionInfo:115 wwmReservedRegs: ['$vgpr40']116 isEntryFunction: false117 scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'118 stackPtrOffsetReg: '$sgpr32'119 frameOffsetReg: '$sgpr33'120body: |121 bb.0:122 liveins: $sgpr20, $vgpr1123 ; GCN-LABEL: name: wwm_csr_spill_reload124 ; GCN: liveins: $sgpr20, $vgpr1125 ; GCN-NEXT: {{ $}}126 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec127 ; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr2, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)128 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr5129 ; GCN-NEXT: $vgpr2 = IMPLICIT_DEF130 ; GCN-NEXT: $vgpr2 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr2131 ; GCN-NEXT: $sgpr20 = SI_RESTORE_S32_FROM_VGPR $vgpr2, 0, implicit $exec132 ; GCN-NEXT: $vgpr0 = COPY killed $vgpr1, implicit $exec133 ; GCN-NEXT: $sgpr4_sgpr5 = S_XOR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec134 ; GCN-NEXT: $vgpr2 = BUFFER_LOAD_DWORD_OFFSET $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (load (s32) from %stack.0, addrspace 5)135 ; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr5136 ; GCN-NEXT: SI_RETURN implicit $vgpr0137 $vgpr40 = IMPLICIT_DEF138 $vgpr40 = SI_SPILL_S32_TO_VGPR killed $sgpr20, 0, $vgpr40139 $sgpr20 = SI_RESTORE_S32_FROM_VGPR $vgpr40, 0, implicit $exec140 $vgpr0 = COPY killed $vgpr1, implicit $exec141 SI_RETURN implicit $vgpr0142...143