| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 |
| # RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx900 -start-before=greedy,2 -stop-after=tailduplication -verify-machineinstrs -o - %s | FileCheck %s |
| |
| # The partial def of %0 introduces a live out undef def of %0.sub1 |
| # into bb.3. We need to maintain this liveness with an explicit def of |
| # the physical subregister. Without this, a verifier error would |
| # appear after tail duplication. |
| |
| --- |
| name: undef_subreg_def_live_out_tailduplicate_vreg64_undef_sub1 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| scratchRSrcReg: '$sgpr96_sgpr97_sgpr98_sgpr99' |
| stackPtrOffsetReg: '$sgpr32' |
| body: | |
| ; CHECK-LABEL: name: undef_subreg_def_live_out_tailduplicate_vreg64_undef_sub1 |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; CHECK-NEXT: liveins: $sgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: S_CMP_EQ_U32 $sgpr0, 0, implicit-def $scc |
| ; CHECK-NEXT: S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr1 |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, undef renamable $vgpr0, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| ; CHECK-NEXT: S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: renamable $vgpr0_vgpr1 = BUFFER_LOAD_FORMAT_XY_IDXEN killed renamable $vgpr0, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s64), addrspace 8) |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, undef renamable $vgpr0, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| bb.0: |
| liveins: $sgpr0 |
| |
| S_CMP_EQ_U32 killed $sgpr0, 0, implicit-def $scc |
| S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| |
| bb.1: |
| undef %0.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| S_BRANCH %bb.3 |
| |
| bb.2: |
| S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %0:vreg_64 = BUFFER_LOAD_FORMAT_XY_IDXEN killed %1, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s64), addrspace 8) |
| |
| bb.3: |
| EXP 0, killed %0.sub0, killed %0.sub1, undef %2:vgpr_32, undef %2:vgpr_32, 0, 0, 0, implicit $exec |
| S_ENDPGM 0 |
| |
| ... |
| |
| --- |
| name: undef_subreg_def_live_out_tailduplicate_vreg96_undef_sub1_sub2 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| scratchRSrcReg: '$sgpr96_sgpr97_sgpr98_sgpr99' |
| stackPtrOffsetReg: '$sgpr32' |
| body: | |
| ; CHECK-LABEL: name: undef_subreg_def_live_out_tailduplicate_vreg96_undef_sub1_sub2 |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; CHECK-NEXT: liveins: $sgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: S_CMP_EQ_U32 $sgpr0, 0, implicit-def $scc |
| ; CHECK-NEXT: S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr1_vgpr2 |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, renamable $vgpr2, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| ; CHECK-NEXT: S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: renamable $vgpr0_vgpr1_vgpr2 = BUFFER_LOAD_FORMAT_XYZ_IDXEN killed renamable $vgpr0, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s96), align 16, addrspace 8) |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, renamable $vgpr2, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| bb.0: |
| liveins: $sgpr0 |
| |
| S_CMP_EQ_U32 killed $sgpr0, 0, implicit-def $scc |
| S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| |
| bb.1: |
| undef %0.sub0:vreg_96 = V_MOV_B32_e32 0, implicit $exec |
| S_BRANCH %bb.3 |
| |
| bb.2: |
| S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %0:vreg_96 = BUFFER_LOAD_FORMAT_XYZ_IDXEN killed %1, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s96), addrspace 8) |
| |
| bb.3: |
| EXP 0, killed %0.sub0, killed %0.sub1, killed %0.sub2, undef %2:vgpr_32, 0, 0, 0, implicit $exec |
| S_ENDPGM 0 |
| |
| ... |
| |
| --- |
| name: undef_subreg_def_live_out_tailduplicate_vreg96_undef_sub0_sub2 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| scratchRSrcReg: '$sgpr96_sgpr97_sgpr98_sgpr99' |
| stackPtrOffsetReg: '$sgpr32' |
| body: | |
| ; CHECK-LABEL: name: undef_subreg_def_live_out_tailduplicate_vreg96_undef_sub0_sub2 |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; CHECK-NEXT: liveins: $sgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: S_CMP_EQ_U32 $sgpr0, 0, implicit-def $scc |
| ; CHECK-NEXT: S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: renamable $vgpr1 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr2, implicit-def $vgpr0 |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, renamable $vgpr2, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| ; CHECK-NEXT: S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: renamable $vgpr0_vgpr1_vgpr2 = BUFFER_LOAD_FORMAT_XYZ_IDXEN killed renamable $vgpr0, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s96), align 16, addrspace 8) |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, renamable $vgpr2, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| bb.0: |
| liveins: $sgpr0 |
| |
| S_CMP_EQ_U32 killed $sgpr0, 0, implicit-def $scc |
| S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| |
| bb.1: |
| undef %0.sub1:vreg_96 = V_MOV_B32_e32 0, implicit $exec |
| S_BRANCH %bb.3 |
| |
| bb.2: |
| S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %0:vreg_96 = BUFFER_LOAD_FORMAT_XYZ_IDXEN killed %1, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s96), addrspace 8) |
| |
| bb.3: |
| EXP 0, killed %0.sub0, killed %0.sub1, killed %0.sub2, undef %2:vgpr_32, 0, 0, 0, implicit $exec |
| S_ENDPGM 0 |
| |
| ... |
| |
| # Test another use of the value before the block end. |
| --- |
| name: undef_subreg_def_live_out_tailduplicate_vreg64_undef_sub1_undef_use_in_def_block |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| scratchRSrcReg: '$sgpr96_sgpr97_sgpr98_sgpr99' |
| stackPtrOffsetReg: '$sgpr32' |
| body: | |
| ; CHECK-LABEL: name: undef_subreg_def_live_out_tailduplicate_vreg64_undef_sub1_undef_use_in_def_block |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; CHECK-NEXT: liveins: $sgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: S_CMP_EQ_U32 $sgpr0, 0, implicit-def $scc |
| ; CHECK-NEXT: S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr1 |
| ; CHECK-NEXT: S_NOP 0, implicit renamable $vgpr0_vgpr1 |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, undef renamable $vgpr0, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| ; CHECK-NEXT: S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: renamable $vgpr0_vgpr1 = BUFFER_LOAD_FORMAT_XY_IDXEN killed renamable $vgpr0, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s64), addrspace 8) |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr1, undef renamable $vgpr0, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| bb.0: |
| liveins: $sgpr0 |
| |
| S_CMP_EQ_U32 killed $sgpr0, 0, implicit-def $scc |
| S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| |
| bb.1: |
| undef %0.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| S_NOP 0, implicit %0 |
| S_BRANCH %bb.3 |
| |
| bb.2: |
| S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %0:vreg_64 = BUFFER_LOAD_FORMAT_XY_IDXEN killed %1, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s64), addrspace 8) |
| |
| bb.3: |
| EXP 0, killed %0.sub0, killed %0.sub1, undef %2:vgpr_32, undef %2:vgpr_32, 0, 0, 0, implicit $exec |
| S_ENDPGM 0 |
| |
| ... |
| |
| # The undef subregister is not live out, no implicit def should be added for it |
| --- |
| name: undef_subreg_def_live_out_tailduplicate_vreg64_undef_sub1_no_phi_use |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| scratchRSrcReg: '$sgpr96_sgpr97_sgpr98_sgpr99' |
| stackPtrOffsetReg: '$sgpr32' |
| body: | |
| ; CHECK-LABEL: name: undef_subreg_def_live_out_tailduplicate_vreg64_undef_sub1_no_phi_use |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; CHECK-NEXT: liveins: $sgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: S_CMP_EQ_U32 $sgpr0, 0, implicit-def $scc |
| ; CHECK-NEXT: S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr0, undef renamable $vgpr0, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| ; CHECK-NEXT: S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: renamable $vgpr0_vgpr1 = BUFFER_LOAD_FORMAT_XY_IDXEN killed renamable $vgpr0, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s64), addrspace 8) |
| ; CHECK-NEXT: EXP 0, killed renamable $vgpr0, renamable $vgpr0, undef renamable $vgpr0, undef renamable $vgpr0, 0, 0, 0, implicit $exec |
| ; CHECK-NEXT: S_ENDPGM 0 |
| bb.0: |
| liveins: $sgpr0 |
| |
| S_CMP_EQ_U32 killed $sgpr0, 0, implicit-def $scc |
| S_CBRANCH_SCC0 %bb.2, implicit killed $scc |
| |
| bb.1: |
| undef %0.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| S_BRANCH %bb.3 |
| |
| bb.2: |
| S_NOP 0, implicit-def $sgpr4_sgpr5_sgpr6_sgpr7 |
| %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %0:vreg_64 = BUFFER_LOAD_FORMAT_XY_IDXEN killed %1, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s64), addrspace 8) |
| |
| bb.3: |
| EXP 0, killed %0.sub0, killed %0.sub0, undef %2:vgpr_32, undef %2:vgpr_32, 0, 0, 0, implicit $exec |
| S_ENDPGM 0 |
| |
| ... |
| |
| # In bb.2, %0 should be assigned to vgpr0_vgpr1. Make sure the value |
| # copied from $vgpr0 into %3 isn't clobbered by the undef phi def for |
| # %0.sub1. |
| --- |
| name: assigned_physreg_subregister_interference |
| tracksRegLiveness: true |
| frameInfo: |
| adjustsStack: true |
| machineFunctionInfo: |
| scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' |
| frameOffsetReg: '$sgpr33' |
| stackPtrOffsetReg: '$sgpr32' |
| wwmReservedRegs: |
| - '$vgpr63' |
| body: | |
| ; CHECK-LABEL: name: assigned_physreg_subregister_interference |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: liveins: $sgpr30, $sgpr31, $sgpr34, $sgpr35, $sgpr36, $sgpr37, $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: $sgpr4_sgpr5 = S_OR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec |
| ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr40, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5) |
| ; CHECK-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr5 |
| ; CHECK-NEXT: $vgpr40 = SI_SPILL_S32_TO_VGPR $sgpr30, 0, $vgpr40 |
| ; CHECK-NEXT: $vgpr40 = SI_SPILL_S32_TO_VGPR $sgpr31, 1, $vgpr40 |
| ; CHECK-NEXT: $vgpr40 = SI_SPILL_S32_TO_VGPR $sgpr34, 2, $vgpr40 |
| ; CHECK-NEXT: $vgpr40 = SI_SPILL_S32_TO_VGPR $sgpr35, 3, $vgpr40 |
| ; CHECK-NEXT: $vgpr40 = SI_SPILL_S32_TO_VGPR $sgpr36, 4, $vgpr40 |
| ; CHECK-NEXT: $vgpr40 = SI_SPILL_S32_TO_VGPR $sgpr37, 5, $vgpr40 |
| ; CHECK-NEXT: renamable $sgpr34_sgpr35 = S_MOV_B64 $exec |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) |
| ; CHECK-NEXT: liveins: $sgpr34_sgpr35, $vgpr0_vgpr1:0x000000000000000F |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: renamable $sgpr4 = V_READFIRSTLANE_B32 $vgpr0, implicit $exec |
| ; CHECK-NEXT: renamable $sgpr5 = V_READFIRSTLANE_B32 $vgpr1, implicit $exec |
| ; CHECK-NEXT: renamable $vcc = V_CMP_EQ_U64_e64 $sgpr4_sgpr5, killed $vgpr0_vgpr1, implicit $exec |
| ; CHECK-NEXT: renamable $sgpr36_sgpr37 = S_AND_SAVEEXEC_B64 killed renamable $vcc, implicit-def $exec, implicit-def dead $scc, implicit $exec |
| ; CHECK-NEXT: dead $sgpr30_sgpr31 = noconvergent SI_CALL killed renamable $sgpr4_sgpr5, 0, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0 |
| ; CHECK-NEXT: renamable $vgpr1 = COPY $vgpr0, implicit $exec |
| ; CHECK-NEXT: renamable $vgpr0 = V_MOV_B32_e32 123, implicit $exec |
| ; CHECK-NEXT: $exec = S_XOR_B64 $exec, renamable $sgpr36_sgpr37, implicit-def dead $scc |
| ; CHECK-NEXT: S_CBRANCH_EXECNZ %bb.1, implicit $exec |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| ; CHECK-NEXT: liveins: $vgpr1, $sgpr34_sgpr35 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: $exec = COPY renamable $sgpr34_sgpr35 |
| ; CHECK-NEXT: renamable $vgpr0 = V_ADD_U32_e32 1, killed $vgpr1, implicit $exec |
| ; CHECK-NEXT: $sgpr37 = SI_RESTORE_S32_FROM_VGPR $vgpr40, 5 |
| ; CHECK-NEXT: $sgpr36 = SI_RESTORE_S32_FROM_VGPR $vgpr40, 4 |
| ; CHECK-NEXT: $sgpr35 = SI_RESTORE_S32_FROM_VGPR $vgpr40, 3 |
| ; CHECK-NEXT: $sgpr34 = SI_RESTORE_S32_FROM_VGPR $vgpr40, 2 |
| ; CHECK-NEXT: $sgpr31 = SI_RESTORE_S32_FROM_VGPR $vgpr40, 1 |
| ; CHECK-NEXT: $sgpr30 = SI_RESTORE_S32_FROM_VGPR $vgpr40, 0 |
| ; CHECK-NEXT: $sgpr4_sgpr5 = S_OR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec |
| ; CHECK-NEXT: $vgpr40 = BUFFER_LOAD_DWORD_OFFSET $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, implicit $exec :: (load (s32) from %stack.0, addrspace 5) |
| ; CHECK-NEXT: $exec = S_MOV_B64 killed $sgpr4_sgpr5 |
| ; CHECK-NEXT: SI_RETURN implicit $vgpr0 |
| bb.0: |
| liveins: $sgpr30, $sgpr31, $sgpr34, $sgpr35, $sgpr36, $sgpr37, $vgpr0, $vgpr1, $vgpr63 |
| |
| $vgpr63 = SI_SPILL_S32_TO_VGPR killed $sgpr30, 0, $vgpr63 |
| $vgpr63 = SI_SPILL_S32_TO_VGPR killed $sgpr31, 1, $vgpr63 |
| $vgpr63 = SI_SPILL_S32_TO_VGPR killed $sgpr34, 2, $vgpr63 |
| $vgpr63 = SI_SPILL_S32_TO_VGPR killed $sgpr35, 3, $vgpr63 |
| $vgpr63 = SI_SPILL_S32_TO_VGPR killed $sgpr36, 4, $vgpr63 |
| $vgpr63 = SI_SPILL_S32_TO_VGPR killed $sgpr37, 5, $vgpr63 |
| undef %0.sub0:vreg_64 = COPY $vgpr0 |
| %0.sub1:vreg_64 = COPY $vgpr1 |
| ADJCALLSTACKUP 0, 0, implicit-def dead $scc, implicit-def $sgpr32, implicit $sgpr32 |
| renamable $sgpr34_sgpr35 = S_MOV_B64 $exec |
| |
| bb.1: |
| liveins: $vgpr63, $sgpr34_sgpr35 |
| |
| renamable $sgpr4 = V_READFIRSTLANE_B32 %0.sub0, implicit $exec |
| renamable $sgpr5 = V_READFIRSTLANE_B32 %0.sub1, implicit $exec |
| renamable $vcc = V_CMP_EQ_U64_e64 $sgpr4_sgpr5, %0, implicit $exec |
| renamable $sgpr36_sgpr37 = S_AND_SAVEEXEC_B64 killed renamable $vcc, implicit-def $exec, implicit-def dead $scc, implicit $exec |
| |
| bb.2: |
| liveins: $vgpr63, $sgpr4_sgpr5:0x000000000000000F, $sgpr34_sgpr35, $sgpr36_sgpr37 |
| |
| dead $sgpr30_sgpr31 = noconvergent SI_CALL killed renamable $sgpr4_sgpr5, 0, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0 |
| %3:vgpr_32 = COPY $vgpr0 |
| undef %0.sub0:vreg_64 = V_MOV_B32_e32 123, implicit $exec |
| $exec = S_XOR_B64_term $exec, killed renamable $sgpr36_sgpr37, implicit-def dead $scc |
| S_CBRANCH_EXECNZ %bb.1, implicit $exec |
| |
| bb.3: |
| liveins: $vgpr63, $sgpr34_sgpr35 |
| |
| $exec = S_MOV_B64_term killed renamable $sgpr34_sgpr35 |
| |
| bb.4: |
| liveins: $vgpr63 |
| |
| ADJCALLSTACKDOWN 0, 0, implicit-def dead $scc, implicit-def $sgpr32, implicit $sgpr32 |
| %6:vgpr_32 = V_ADD_U32_e32 1, %3, implicit $exec |
| $vgpr0 = COPY %6 |
| $sgpr37 = SI_RESTORE_S32_FROM_VGPR $vgpr63, 5 |
| $sgpr36 = SI_RESTORE_S32_FROM_VGPR $vgpr63, 4 |
| $sgpr35 = SI_RESTORE_S32_FROM_VGPR $vgpr63, 3 |
| $sgpr34 = SI_RESTORE_S32_FROM_VGPR $vgpr63, 2 |
| $sgpr31 = SI_RESTORE_S32_FROM_VGPR $vgpr63, 1 |
| $sgpr30 = SI_RESTORE_S32_FROM_VGPR $vgpr63, 0 |
| SI_RETURN implicit $vgpr0 |
| |
| ... |