Implicit derivatives are only valid in pixel shaders, hence only implicitly enable WQM for pixel shaders. This avoids unintended WQM in other shader types (e.g. compute) when image sampling instructions are used. Reviewed By: rampitec Differential Revision: https://reviews.llvm.org/D114414
446 lines
14 KiB
YAML
446 lines
14 KiB
YAML
# RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs -run-pass si-wqm -o - %s | FileCheck %s
|
|
|
|
--- |
|
|
define amdgpu_ps void @test_strict_wwm_scc() {
|
|
ret void
|
|
}
|
|
define amdgpu_ps void @test_strict_wwm_scc2() {
|
|
ret void
|
|
}
|
|
define amdgpu_ps void @no_cfg() {
|
|
ret void
|
|
}
|
|
define amdgpu_ps void @copy_exec() {
|
|
ret void
|
|
}
|
|
define amdgpu_ps void @scc_always_live() {
|
|
ret void
|
|
}
|
|
define amdgpu_ps void @test_wwm_set_inactive_propagation() {
|
|
ret void
|
|
}
|
|
define amdgpu_ps void @test_wqm_lr_phi() {
|
|
ret void
|
|
}
|
|
define amdgpu_cs void @no_wqm_in_cs() {
|
|
ret void
|
|
}
|
|
define amdgpu_es void @no_wqm_in_es() {
|
|
ret void
|
|
}
|
|
define amdgpu_gs void @no_wqm_in_gs() {
|
|
ret void
|
|
}
|
|
define amdgpu_hs void @no_wqm_in_hs() {
|
|
ret void
|
|
}
|
|
define amdgpu_ls void @no_wqm_in_ls() {
|
|
ret void
|
|
}
|
|
define amdgpu_vs void @no_wqm_in_vs() {
|
|
ret void
|
|
}
|
|
...
|
|
---
|
|
|
|
---
|
|
# Check for awareness that s_or_saveexec_b64 clobbers SCC
|
|
#
|
|
#CHECK: ENTER_STRICT_WWM
|
|
#CHECK: S_CMP_LT_I32
|
|
#CHECK: S_CSELECT_B32
|
|
name: test_strict_wwm_scc
|
|
alignment: 1
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: sgpr_32, preferred-register: '' }
|
|
- { id: 1, class: sgpr_32, preferred-register: '' }
|
|
- { id: 2, class: sgpr_32, preferred-register: '' }
|
|
- { id: 3, class: vgpr_32, preferred-register: '' }
|
|
- { id: 4, class: vgpr_32, preferred-register: '' }
|
|
- { id: 5, class: sgpr_32, preferred-register: '' }
|
|
- { id: 6, class: vgpr_32, preferred-register: '' }
|
|
- { id: 7, class: vgpr_32, preferred-register: '' }
|
|
- { id: 8, class: sreg_32_xm0, preferred-register: '' }
|
|
- { id: 9, class: sreg_32, preferred-register: '' }
|
|
- { id: 10, class: sreg_32, preferred-register: '' }
|
|
- { id: 11, class: vgpr_32, preferred-register: '' }
|
|
- { id: 12, class: vgpr_32, preferred-register: '' }
|
|
liveins:
|
|
- { reg: '$sgpr0', virtual-reg: '%0' }
|
|
- { reg: '$sgpr1', virtual-reg: '%1' }
|
|
- { reg: '$sgpr2', virtual-reg: '%2' }
|
|
- { reg: '$vgpr0', virtual-reg: '%3' }
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr0
|
|
|
|
%3 = COPY $vgpr0
|
|
%2 = COPY $sgpr2
|
|
%1 = COPY $sgpr1
|
|
%0 = COPY $sgpr0
|
|
S_CMP_LT_I32 0, %0, implicit-def $scc
|
|
%12 = V_ADD_CO_U32_e32 %3, %3, implicit-def $vcc, implicit $exec
|
|
%5 = S_CSELECT_B32 %2, %1, implicit $scc
|
|
%11 = V_ADD_CO_U32_e32 %5, %12, implicit-def $vcc, implicit $exec
|
|
$vgpr0 = STRICT_WWM %11, implicit $exec
|
|
SI_RETURN_TO_EPILOG $vgpr0
|
|
|
|
...
|
|
|
|
---
|
|
# Second test for awareness that s_or_saveexec_b64 clobbers SCC
|
|
# Because entry block is treated differently.
|
|
#
|
|
#CHECK: %bb.1
|
|
#CHECK: S_CMP_LT_I32
|
|
#CHECK: COPY $scc
|
|
#CHECK: ENTER_STRICT_WWM
|
|
#CHECK: $scc = COPY
|
|
#CHECK: S_CSELECT_B32
|
|
name: test_strict_wwm_scc2
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr0
|
|
|
|
%3:vgpr_32 = COPY $vgpr0
|
|
%2:sgpr_32 = COPY $sgpr2
|
|
%1:sgpr_32 = COPY $sgpr1
|
|
%0:sgpr_32 = COPY $sgpr0
|
|
%13:sgpr_128 = IMPLICIT_DEF
|
|
|
|
bb.1:
|
|
S_CMP_LT_I32 0, %0:sgpr_32, implicit-def $scc
|
|
%10:vgpr_32 = BUFFER_LOAD_DWORD_OFFEN %3:vgpr_32, %13:sgpr_128, 0, 0, 0, 0, 0, implicit $exec
|
|
%12:vgpr_32 = V_ADD_CO_U32_e32 %3:vgpr_32, %3:vgpr_32, implicit-def $vcc, implicit $exec
|
|
%5:sgpr_32 = S_CSELECT_B32 %2:sgpr_32, %1:sgpr_32, implicit $scc
|
|
%11:vgpr_32 = V_ADD_CO_U32_e32 %5:sgpr_32, %12:vgpr_32, implicit-def $vcc, implicit $exec
|
|
$vgpr0 = STRICT_WWM %11:vgpr_32, implicit $exec
|
|
$vgpr1 = COPY %10:vgpr_32
|
|
SI_RETURN_TO_EPILOG $vgpr0, $vgpr1
|
|
|
|
...
|
|
|
|
---
|
|
# V_SET_INACTIVE, when its second operand is undef, is replaced by a
|
|
# COPY by si-wqm. Ensure the instruction is removed.
|
|
#CHECK-NOT: V_SET_INACTIVE
|
|
name: no_cfg
|
|
alignment: 1
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
registers:
|
|
- { id: 0, class: sgpr_32, preferred-register: '' }
|
|
- { id: 1, class: sgpr_32, preferred-register: '' }
|
|
- { id: 2, class: sgpr_32, preferred-register: '' }
|
|
- { id: 3, class: sgpr_32, preferred-register: '' }
|
|
- { id: 4, class: sgpr_32, preferred-register: '' }
|
|
- { id: 5, class: sgpr_128, preferred-register: '' }
|
|
- { id: 6, class: sgpr_128, preferred-register: '' }
|
|
- { id: 7, class: sreg_32, preferred-register: '' }
|
|
- { id: 8, class: vreg_64, preferred-register: '' }
|
|
- { id: 9, class: sreg_32, preferred-register: '' }
|
|
- { id: 10, class: vgpr_32, preferred-register: '' }
|
|
- { id: 11, class: vgpr_32, preferred-register: '' }
|
|
- { id: 12, class: sreg_32, preferred-register: '' }
|
|
- { id: 13, class: vgpr_32, preferred-register: '' }
|
|
- { id: 14, class: vgpr_32, preferred-register: '' }
|
|
- { id: 15, class: vgpr_32, preferred-register: '' }
|
|
- { id: 16, class: vgpr_32, preferred-register: '' }
|
|
liveins:
|
|
- { reg: '$sgpr0', virtual-reg: '%0' }
|
|
- { reg: '$sgpr1', virtual-reg: '%1' }
|
|
- { reg: '$sgpr2', virtual-reg: '%2' }
|
|
- { reg: '$sgpr3', virtual-reg: '%3' }
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3
|
|
|
|
%3:sgpr_32 = COPY $sgpr3
|
|
%2:sgpr_32 = COPY $sgpr2
|
|
%1:sgpr_32 = COPY $sgpr1
|
|
%0:sgpr_32 = COPY $sgpr0
|
|
%6:sgpr_128 = REG_SEQUENCE %0, %subreg.sub0, %1, %subreg.sub1, %2, %subreg.sub2, %3, %subreg.sub3
|
|
%5:sgpr_128 = COPY %6
|
|
%7:sreg_32 = S_MOV_B32 0
|
|
%8:vreg_64 = BUFFER_LOAD_DWORDX2_OFFSET %6, %7, 0, 0, 0, 0, implicit $exec
|
|
%16:vgpr_32 = COPY %8.sub1
|
|
%11:vgpr_32 = COPY %16
|
|
%10:vgpr_32 = V_SET_INACTIVE_B32 %11, undef %12:sreg_32, implicit $exec, implicit-def $scc
|
|
%14:vgpr_32 = COPY %7
|
|
%13:vgpr_32 = V_MOV_B32_dpp %14, killed %10, 323, 12, 15, 0, implicit $exec
|
|
early-clobber %15:vgpr_32 = STRICT_WWM killed %13, implicit $exec
|
|
BUFFER_STORE_DWORD_OFFSET_exact killed %15, %6, %7, 4, 0, 0, 0, implicit $exec
|
|
S_ENDPGM 0
|
|
|
|
...
|
|
|
|
---
|
|
# Ensure that strict_wwm is not put around an EXEC copy
|
|
#CHECK-LABEL: name: copy_exec
|
|
#CHECK: %7:sreg_64 = COPY $exec
|
|
#CHECK-NEXT: %14:sreg_64 = ENTER_STRICT_WWM -1, implicit-def $exec, implicit-def $scc, implicit $exec
|
|
#CHECK-NEXT: %8:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
|
#CHECK-NEXT: $exec = EXIT_STRICT_WWM %14
|
|
#CHECK-NEXT: %9:vgpr_32 = V_MBCNT_LO_U32_B32_e64 %7.sub0, 0, implicit $exec
|
|
name: copy_exec
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3
|
|
|
|
%3:sgpr_32 = COPY $sgpr3
|
|
%2:sgpr_32 = COPY $sgpr2
|
|
%1:sgpr_32 = COPY $sgpr1
|
|
%0:sgpr_32 = COPY $sgpr0
|
|
%4:sgpr_128 = REG_SEQUENCE %0, %subreg.sub0, %1, %subreg.sub1, %2, %subreg.sub2, %3, %subreg.sub3
|
|
%5:sreg_32 = S_MOV_B32 0
|
|
%6:vreg_64 = BUFFER_LOAD_DWORDX2_OFFSET %4, %5, 0, 0, 0, 0, implicit $exec
|
|
|
|
%8:sreg_64 = COPY $exec
|
|
%9:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
|
%10:vgpr_32 = V_MBCNT_LO_U32_B32_e64 %8.sub0:sreg_64, 0, implicit $exec
|
|
%11:vgpr_32 = V_MOV_B32_dpp %9:vgpr_32, %10:vgpr_32, 312, 15, 15, 0, implicit $exec
|
|
%12:sreg_32 = V_READLANE_B32 %11:vgpr_32, 63
|
|
early-clobber %13:sreg_32 = STRICT_WWM %9:vgpr_32, implicit $exec
|
|
|
|
%14:vgpr_32 = COPY %13
|
|
BUFFER_STORE_DWORD_OFFSET_exact killed %14, %4, %5, 4, 0, 0, 0, implicit $exec
|
|
S_ENDPGM 0
|
|
|
|
...
|
|
|
|
---
|
|
# Check exit of WQM is still inserted correctly when SCC is live until block end.
|
|
# Critially this tests that compilation does not fail.
|
|
#CHECK-LABEL: name: scc_always_live
|
|
#CHECK: %8:vreg_128 = IMAGE_SAMPLE_V4_V2 %7
|
|
#CHECK-NEXT: S_CMP_EQ_U32 %2, 0, implicit-def $scc
|
|
#CHECK-NEXT: undef %9.sub0:vreg_64 = nsz arcp nofpexcept V_ADD_F32_e64
|
|
#CHECK-NEXT: %9.sub1:vreg_64 = nsz arcp nofpexcept V_MUL_F32_e32
|
|
#CHECK-NEXT: %14:sreg_32_xm0 = COPY $scc
|
|
#CHECK-NEXT: $exec = S_AND_B64 $exec, %13, implicit-def $scc
|
|
#CHECK-NEXT: $scc = COPY %14
|
|
#CHECK-NEXT: %10:vgpr_32 = nsz arcp nofpexcept V_ADD_F32_e64
|
|
#CHECK-NEXT: %11:vreg_128 = IMAGE_SAMPLE_V4_V2
|
|
#CHECK-NEXT: S_CBRANCH_SCC0 %bb.2
|
|
name: scc_always_live
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr1, $sgpr2, $vgpr1, $vgpr2
|
|
|
|
$m0 = COPY $sgpr1
|
|
%0:vgpr_32 = COPY $vgpr1
|
|
%1:vgpr_32 = COPY $vgpr2
|
|
%8:sgpr_32 = COPY $sgpr2
|
|
%100:sgpr_256 = IMPLICIT_DEF
|
|
%101:sgpr_128 = IMPLICIT_DEF
|
|
|
|
%2:vgpr_32 = V_INTERP_P1_F32 %0:vgpr_32, 3, 2, implicit $mode, implicit $m0, implicit $exec
|
|
%3:vgpr_32 = V_INTERP_P1_F32 %1:vgpr_32, 3, 2, implicit $mode, implicit $m0, implicit $exec
|
|
|
|
undef %7.sub0:vreg_64 = COPY %2:vgpr_32
|
|
%7.sub1:vreg_64 = COPY %3:vgpr_32
|
|
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %7:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
S_CMP_EQ_U32 %8:sgpr_32, 0, implicit-def $scc
|
|
|
|
undef %5.sub0:vreg_64 = nsz arcp nofpexcept V_ADD_F32_e64 0, %4.sub0:vreg_128, 0, %3:vgpr_32, 1, 0, implicit $mode, implicit $exec
|
|
%5.sub1:vreg_64 = nsz arcp nofpexcept V_MUL_F32_e32 %2, %3, implicit $mode, implicit $exec
|
|
%6:vgpr_32 = nsz arcp nofpexcept V_ADD_F32_e64 0, %2:vgpr_32, 0, %3:vgpr_32, 1, 0, implicit $mode, implicit $exec
|
|
|
|
%9:vreg_128 = IMAGE_SAMPLE_V4_V2 %5:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
|
|
S_CBRANCH_SCC0 %bb.2, implicit $scc
|
|
|
|
bb.1:
|
|
%10:sreg_32 = S_MOV_B32 0
|
|
BUFFER_STORE_DWORD_OFFSET_exact %6:vgpr_32, %101:sgpr_128, %10:sreg_32, 4, 0, 0, 0, implicit $exec
|
|
S_ENDPGM 0
|
|
|
|
bb.2:
|
|
$vgpr0 = COPY %4.sub0:vreg_128
|
|
$vgpr1 = COPY %4.sub1:vreg_128
|
|
$vgpr2 = COPY %9.sub0:vreg_128
|
|
$vgpr3 = COPY %9.sub1:vreg_128
|
|
SI_RETURN_TO_EPILOG $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
...
|
|
|
|
---
|
|
# Check that unnecessary instruction do not get marked for WWM
|
|
#
|
|
#CHECK-NOT: ENTER_STRICT_WWM
|
|
#CHECK: BUFFER_LOAD_DWORDX2
|
|
#CHECK-NOT: ENTER_STRICT_WWM
|
|
#CHECK: V_SET_INACTIVE_B32
|
|
#CHECK: V_SET_INACTIVE_B32
|
|
#CHECK: ENTER_STRICT_WWM
|
|
#CHECK: V_MAX
|
|
name: test_wwm_set_inactive_propagation
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0_sgpr1_sgpr2_sgpr3, $vgpr0
|
|
%0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
|
|
%1:vgpr_32 = COPY $vgpr0
|
|
%2:vreg_64 = BUFFER_LOAD_DWORDX2_OFFEN %1:vgpr_32, %0:sgpr_128, 0, 0, 0, 0, 0, implicit $exec
|
|
%2.sub0:vreg_64 = V_SET_INACTIVE_B32 %2.sub0:vreg_64, 0, implicit $exec, implicit-def $scc
|
|
%2.sub1:vreg_64 = V_SET_INACTIVE_B32 %2.sub1:vreg_64, 0, implicit $exec, implicit-def $scc
|
|
%3:vreg_64 = nnan nsz arcp contract reassoc nofpexcept V_MAX_F64_e64 0, %2:vreg_64, 0, %2:vreg_64, 0, 0, implicit $mode, implicit $exec
|
|
$vgpr0 = STRICT_WWM %3.sub0:vreg_64, implicit $exec
|
|
$vgpr1 = STRICT_WWM %3.sub1:vreg_64, implicit $exec
|
|
SI_RETURN_TO_EPILOG $vgpr0, $vgpr1
|
|
...
|
|
|
|
---
|
|
# Check that WQM marking occurs correctly through phi nodes in live range graph.
|
|
# If not then initial V_MOV will not be in WQM.
|
|
#
|
|
#CHECK-LABEL: name: test_wqm_lr_phi
|
|
#CHECK: COPY $exec
|
|
#CHECK-NEXT: S_WQM
|
|
#CHECK-NEXT: V_MOV_B32_e32 -10
|
|
#CHECK-NEXT: V_MOV_B32_e32 0
|
|
name: test_wqm_lr_phi
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
undef %0.sub0:vreg_64 = V_MOV_B32_e32 -10, implicit $exec
|
|
%0.sub1:vreg_64 = V_MOV_B32_e32 0, implicit $exec
|
|
%1:sreg_64 = S_GETPC_B64
|
|
%2:sgpr_256 = S_LOAD_DWORDX8_IMM %1:sreg_64, 32, 0
|
|
|
|
bb.1:
|
|
$vcc = V_CMP_LT_U32_e64 4, 4, implicit $exec
|
|
S_CBRANCH_VCCNZ %bb.3, implicit $vcc
|
|
S_BRANCH %bb.2
|
|
|
|
bb.2:
|
|
%0.sub0:vreg_64 = V_ADD_U32_e32 1, %0.sub1, implicit $exec
|
|
S_BRANCH %bb.3
|
|
|
|
bb.3:
|
|
%0.sub1:vreg_64 = V_ADD_U32_e32 1, %0.sub1, implicit $exec
|
|
S_BRANCH %bb.4
|
|
|
|
bb.4:
|
|
%3:sgpr_128 = IMPLICIT_DEF
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %0:vreg_64, %2:sgpr_256, %3:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128) from custom "ImageResource")
|
|
$vgpr0 = COPY %4.sub0:vreg_128
|
|
$vgpr1 = COPY %4.sub1:vreg_128
|
|
SI_RETURN_TO_EPILOG $vgpr0, $vgpr1
|
|
...
|
|
|
|
---
|
|
#CHECK-LABEL: name: no_wqm_in_cs
|
|
#CHECK-NOT: S_WQM
|
|
name: no_wqm_in_cs
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr1, $vgpr2
|
|
|
|
undef %0.sub0:vreg_64 = COPY $vgpr1
|
|
%0.sub1:vreg_64 = COPY $vgpr2
|
|
%100:sgpr_256 = IMPLICIT_DEF
|
|
%101:sgpr_128 = IMPLICIT_DEF
|
|
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %0:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
...
|
|
|
|
---
|
|
#CHECK-LABEL: name: no_wqm_in_es
|
|
#CHECK-NOT: S_WQM
|
|
name: no_wqm_in_es
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr1, $vgpr2
|
|
|
|
undef %0.sub0:vreg_64 = COPY $vgpr1
|
|
%0.sub1:vreg_64 = COPY $vgpr2
|
|
%100:sgpr_256 = IMPLICIT_DEF
|
|
%101:sgpr_128 = IMPLICIT_DEF
|
|
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %0:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
...
|
|
|
|
---
|
|
#CHECK-LABEL: name: no_wqm_in_gs
|
|
#CHECK-NOT: S_WQM
|
|
name: no_wqm_in_gs
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr1, $vgpr2
|
|
|
|
undef %0.sub0:vreg_64 = COPY $vgpr1
|
|
%0.sub1:vreg_64 = COPY $vgpr2
|
|
%100:sgpr_256 = IMPLICIT_DEF
|
|
%101:sgpr_128 = IMPLICIT_DEF
|
|
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %0:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
...
|
|
|
|
---
|
|
#CHECK-LABEL: name: no_wqm_in_hs
|
|
#CHECK-NOT: S_WQM
|
|
name: no_wqm_in_hs
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr1, $vgpr2
|
|
|
|
undef %0.sub0:vreg_64 = COPY $vgpr1
|
|
%0.sub1:vreg_64 = COPY $vgpr2
|
|
%100:sgpr_256 = IMPLICIT_DEF
|
|
%101:sgpr_128 = IMPLICIT_DEF
|
|
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %0:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
...
|
|
|
|
---
|
|
#CHECK-LABEL: name: no_wqm_in_ls
|
|
#CHECK-NOT: S_WQM
|
|
name: no_wqm_in_ls
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr1, $vgpr2
|
|
|
|
undef %0.sub0:vreg_64 = COPY $vgpr1
|
|
%0.sub1:vreg_64 = COPY $vgpr2
|
|
%100:sgpr_256 = IMPLICIT_DEF
|
|
%101:sgpr_128 = IMPLICIT_DEF
|
|
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %0:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
...
|
|
|
|
---
|
|
#CHECK-LABEL: name: no_wqm_in_vs
|
|
#CHECK-NOT: S_WQM
|
|
name: no_wqm_in_vs
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr1, $vgpr2
|
|
|
|
undef %0.sub0:vreg_64 = COPY $vgpr1
|
|
%0.sub1:vreg_64 = COPY $vgpr2
|
|
%100:sgpr_256 = IMPLICIT_DEF
|
|
%101:sgpr_128 = IMPLICIT_DEF
|
|
|
|
%4:vreg_128 = IMAGE_SAMPLE_V4_V2 %0:vreg_64, %100:sgpr_256, %101:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)
|
|
...
|