| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -verify-machineinstrs -run-pass=machine-scheduler -verify-misched -o - %s | FileCheck %s |
| |
| # Deciding which lanes are killed needs to account for other defs in the |
| # instruction. |
| # |
| # addVRegDefDeps would encounter the %0.sub0 def and erase %0 from |
| # current vreg uses because it shared no lanes with %0.sub1 use on the |
| # nop. It then didn't see the lanemask when it reached the second |
| # subreg def, and failed to add the necessary dependency between the |
| # asm and S_NOP |
| |
| --- |
| name: no_live_subrange_at_use |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; CHECK-LABEL: name: no_live_subrange_at_use |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: undef [[V_MOV_B32_e32_:%[0-9]+]].sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: [[V_MOV_B32_e32_:%[0-9]+]].sub1:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[DS_READ_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_READ_B32_gfx9 [[V_MOV_B32_e32_1]], 0, 0, implicit $exec :: (load (s32), addrspace 3) |
| ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 851978 /* regdef:VGPR_16 */, def [[V_MOV_B32_e32_]], 2147549193 /* reguse tiedto:$1 */, [[V_MOV_B32_e32_]](tied-def 3) |
| ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 851977 /* reguse:VGPR_16 */, [[DS_READ_B32_gfx9_]] |
| ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 851978 /* regdef:VGPR_16 */, def undef [[V_MOV_B32_e32_]].sub0, 851978 /* regdef:VGPR_16 */, def undef [[V_MOV_B32_e32_]].sub1 |
| ; CHECK-NEXT: S_NOP 0, implicit [[V_MOV_B32_e32_]].sub1 |
| ; CHECK-NEXT: $sgpr10 = S_MOV_B32 -1 |
| ; CHECK-NEXT: S_BRANCH %bb.1 |
| bb.0: |
| undef %0.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| %0.sub1:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| |
| bb.1: |
| %2:vgpr_32 = DS_READ_B32_gfx9 %1, 0, 0, implicit $exec :: (load (s32), addrspace 3) |
| INLINEASM &"", 1, 851978, def %0, 2147549193, %0(tied-def 3) |
| INLINEASM &"", 1, 851977, %2 |
| INLINEASM &"", 1, 851978, def undef %0.sub0, 851978, def %0.sub1 |
| S_NOP 0, implicit %0.sub1 |
| $sgpr10 = S_MOV_B32 -1 |
| S_BRANCH %bb.1 |
| |
| ... |
| |
| # Different operand order |
| --- |
| name: no_live_subrange_at_use_swap |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; CHECK-LABEL: name: no_live_subrange_at_use_swap |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: undef [[V_MOV_B32_e32_:%[0-9]+]].sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: [[V_MOV_B32_e32_:%[0-9]+]].sub1:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[DS_READ_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_READ_B32_gfx9 [[V_MOV_B32_e32_1]], 0, 0, implicit $exec :: (load (s32), addrspace 3) |
| ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 851978 /* regdef:VGPR_16 */, def [[V_MOV_B32_e32_]], 2147549193 /* reguse tiedto:$1 */, [[V_MOV_B32_e32_]](tied-def 3) |
| ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 851977 /* reguse:VGPR_16 */, [[DS_READ_B32_gfx9_]] |
| ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 851978 /* regdef:VGPR_16 */, def undef [[V_MOV_B32_e32_]].sub1, 851978 /* regdef:VGPR_16 */, def undef [[V_MOV_B32_e32_]].sub0 |
| ; CHECK-NEXT: S_NOP 0, implicit [[V_MOV_B32_e32_]].sub1 |
| ; CHECK-NEXT: $sgpr10 = S_MOV_B32 -1 |
| ; CHECK-NEXT: S_BRANCH %bb.1 |
| bb.0: |
| undef %0.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| %0.sub1:vreg_64 = V_MOV_B32_e32 0, implicit $exec |
| %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| |
| bb.1: |
| %2:vgpr_32 = DS_READ_B32_gfx9 %1, 0, 0, implicit $exec :: (load (s32), addrspace 3) |
| INLINEASM &"", 1, 851978, def %0, 2147549193, %0(tied-def 3) |
| INLINEASM &"", 1, 851977, %2 |
| INLINEASM &"", 1, 851978, def %0.sub1, 851978, def undef %0.sub0 |
| S_NOP 0, implicit %0.sub1 |
| $sgpr10 = S_MOV_B32 -1 |
| S_BRANCH %bb.1 |
| |
| ... |