| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.50 < %s | FileCheck --check-prefixes=GCN,GFX1250,GFX1250-SDAG,GL2-ONLY %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.50 -mattr=+safe-smem-prefetch < %s | FileCheck --check-prefixes=GCN,SPREFETCH,GFX1250-SPREFETCH,GFX1250-SPREFETCH-SDAG %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.50 -mattr=+safe-cu-prefetch < %s | FileCheck --check-prefixes=GCN,GFX1250,GFX1250-SDAG,SAFE-CU %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.00 < %s | FileCheck --check-prefixes=GCN,NOSPREFETCH,GFX12-NOSPREFETCH %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.00 -mattr=+safe-smem-prefetch < %s | FileCheck --check-prefixes=GCN,SPREFETCH,GFX12-SPREFETCH,SPREFETCH-SDAG %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu11.00 < %s | FileCheck --check-prefixes=GCN,NOSPREFETCH,GFX11-NOSPREFETCH %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu12.50 < %s | FileCheck --check-prefixes=GCN,GFX1250,GFX1250-GISEL,GL2-ONLY %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu12.50 -mattr=+safe-smem-prefetch < %s | FileCheck --check-prefixes=GCN,SPREFETCH,GFX1250-SPREFETCH,GFX1250-SPREFETCH-GISEL %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu12.50 -mattr=+safe-cu-prefetch < %s | FileCheck --check-prefixes=GCN,GFX1250,GFX1250-GISEL,SAFE-CU %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu12.00 < %s | FileCheck --check-prefixes=GCN,NOSPREFETCH,GFX12-NOSPREFETCH %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu12.00 -mattr=+safe-smem-prefetch < %s | FileCheck --check-prefixes=GCN,SPREFETCH,GFX12-SPREFETCH,SPREFETCH-GISEL %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu11.00 < %s | FileCheck --check-prefixes=GCN,NOSPREFETCH,GFX11-NOSPREFETCH %s | |
| ; Scalar data prefetch | |
| define amdgpu_ps void @prefetch_data_sgpr(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] offset:512 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_offset: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x200, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_offset: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x200, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr float, ptr addrspace(4) %ptr, i32 128 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check large offsets | |
| define amdgpu_ps void @prefetch_data_sgpr_max_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_max_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] offset:8388607 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_max_offset: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x7fffff, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_max_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_max_offset: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x7fffff, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(4) %ptr, i32 8388607 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_min_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_min_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] offset:-8388608 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-SDAG-LABEL: prefetch_data_sgpr_min_offset: | |
| ; GFX1250-SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_mov_b64 s[2:3], 0xffffffffff800000 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], s[2:3] | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_min_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_sgpr_min_offset: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: s_mov_b32 s2, 0xff800000 | |
| ; SPREFETCH-SDAG-NEXT: s_mov_b32 s3, -1 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | |
| ; SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], s[2:3] | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-GISEL-LABEL: prefetch_data_sgpr_min_offset: | |
| ; GFX1250-SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0xff800000 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, -1 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_sgpr_min_offset: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0xff800000 | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, -1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(4) %ptr, i32 -8388608 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_too_large_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_too_large_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0x800000 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-SDAG-LABEL: prefetch_data_sgpr_too_large_offset: | |
| ; GFX1250-SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], 0x800000 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_too_large_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_sgpr_too_large_offset: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], 0x800000 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-GISEL-LABEL: prefetch_data_sgpr_too_large_offset: | |
| ; GFX1250-SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0x800000 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_sgpr_too_large_offset: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0x800000 | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(4) %ptr, i32 8388608 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check divergent address | |
| define amdgpu_ps void @prefetch_data_vgpr_global(ptr addrspace(1) %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_global: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_global: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_global: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_global: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_vgpr_flat(ptr %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_flat: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_flat: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_flat: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_flat: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.pf(ptr %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_vgpr_offset_global(ptr addrspace(1) inreg %ptr, i32 %offset) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_vgpr_offset_global: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_vgpr_offset_global: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_vgpr_offset_global: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_sgpr_vgpr_offset_global: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: v_ashrrev_i32_e32 v1, 31, v0 | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_u32 v0, vcc_lo, s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s1, v1, vcc_lo | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_sgpr_vgpr_offset_global: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: v_dual_mov_b32 v2, s1 :: v_dual_mov_b32 v1, s0 | |
| ; SPREFETCH-GISEL-NEXT: v_ashrrev_i32_e32 v3, 31, v0 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v1, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v2, v3, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| ; GFX12-LABEL: prefetch_data_sgpr_vgpr_offset_global: | |
| ; GFX12: ; %bb.0: ; %entry | |
| ; GFX12-NEXT: s_endpgm | |
| ; GFX11-LABEL: prefetch_data_sgpr_vgpr_offset_global: | |
| ; GFX11: ; %bb.0: ; %entry | |
| ; GFX11-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(1) %ptr, i32 %offset | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_vgpr_offset_flat(ptr inreg %ptr, i32 %offset) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_vgpr_offset_flat: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: flat_prefetch_b8 v0, s[0:1] offset:128 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_vgpr_offset_flat: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: flat_prefetch_b8 v0, s[0:1] offset:128 scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_vgpr_offset_flat: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_sgpr_vgpr_offset_flat: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: v_ashrrev_i32_e32 v1, 31, v0 | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_u32 v0, vcc_lo, s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s1, v1, vcc_lo | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x80, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_sgpr_vgpr_offset_flat: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: v_dual_mov_b32 v2, s1 :: v_dual_mov_b32 v1, s0 | |
| ; SPREFETCH-GISEL-NEXT: v_ashrrev_i32_e32 v3, 31, v0 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v1, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v2, v3, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, 0x80 | |
| ; SPREFETCH-GISEL-NEXT: s_wait_alu depctr_va_vcc(0) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| ; GFX12-LABEL: prefetch_data_sgpr_vgpr_offset_flat: | |
| ; GFX12: ; %bb.0: ; %entry | |
| ; GFX12-NEXT: s_endpgm | |
| ; GFX11-LABEL: prefetch_data_sgpr_vgpr_offset_flat: | |
| ; GFX11: ; %bb.0: ; %entry | |
| ; GFX11-NEXT: s_endpgm | |
| entry: | |
| %gep1 = getelementptr i8, ptr %ptr, i32 %offset | |
| %gep2 = getelementptr i8, ptr %gep1, i32 128 | |
| tail call void @llvm.prefetch.pf(ptr %gep2, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check LDS and Scratch, we cannot prefetch it | |
| define amdgpu_ps void @prefetch_data_lds(ptr addrspace(3) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_lds: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_lds: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_lds: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_lds: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p3(ptr addrspace(3) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_scratch(ptr addrspace(5) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_scratch: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_scratch: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_scratch: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_scratch: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p5(ptr addrspace(5) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Check supported address spaces | |
| define amdgpu_ps void @prefetch_data_sgpr_flat(ptr inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_flat: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: flat_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_flat: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_flat: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_flat: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.pf(ptr %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_global(ptr addrspace(1) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_global: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_global: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_global: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_global: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_constant_32bit(ptr addrspace(6) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_constant_32bit: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: s_mov_b32 s1, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_constant_32bit: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b32 s1, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_constant_32bit: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_constant_32bit: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_mov_b32 s1, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p6(ptr addrspace(6) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| ; I$ prefetch | |
| define amdgpu_ps void @prefetch_inst_sgpr(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_inst_sgpr: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_inst_sgpr: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_inst_sgpr: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_inst_sgpr: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %ptr, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_inst_sgpr_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_inst_sgpr_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_inst_sgpr_offset: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x80, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_inst_sgpr_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_inst_sgpr_offset: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x80, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(4) %ptr, i32 128 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| ; Check large offsets | |
| define amdgpu_ps void @prefetch_inst_sgpr_max_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_inst_sgpr_max_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_inst_sgpr_max_offset: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x7fffff, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_inst_sgpr_max_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_inst_sgpr_max_offset: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x7fffff, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(4) %ptr, i32 8388607 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_inst_sgpr_min_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_inst_sgpr_min_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-SDAG-LABEL: prefetch_inst_sgpr_min_offset: | |
| ; GFX1250-SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_mov_b64 s[2:3], 0xffffffffff800000 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], s[2:3] | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_inst_sgpr_min_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_inst_sgpr_min_offset: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: s_mov_b32 s2, 0xff800000 | |
| ; SPREFETCH-SDAG-NEXT: s_mov_b32 s3, -1 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | |
| ; SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], s[2:3] | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-GISEL-LABEL: prefetch_inst_sgpr_min_offset: | |
| ; GFX1250-SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0xff800000 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, -1 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_inst_sgpr_min_offset: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0xff800000 | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, -1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(4) %ptr, i32 -8388608 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_inst_sgpr_too_large_offset(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_inst_sgpr_too_large_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-SDAG-LABEL: prefetch_inst_sgpr_too_large_offset: | |
| ; GFX1250-SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], 0x800000 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_inst_sgpr_too_large_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_inst_sgpr_too_large_offset: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], 0x800000 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-GISEL-LABEL: prefetch_inst_sgpr_too_large_offset: | |
| ; GFX1250-SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0x800000 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-GISEL-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_inst_sgpr_too_large_offset: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_u32 s0, s0, 0x800000 | |
| ; SPREFETCH-GISEL-NEXT: s_add_co_ci_u32 s1, s1, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(4) %ptr, i32 8388608 | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %gep, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| ; Check cache locality | |
| define amdgpu_ps void @prefetch_data_vgpr_flat_dev(ptr %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_flat_dev: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_DEV | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_flat_dev: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_DEV | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_flat_dev: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_flat_dev: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.pf(ptr %ptr, i32 0, i32 1, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_vgpr_flat_se(ptr %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_flat_se: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_flat_se: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_flat_se: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_flat_se: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.pf(ptr %ptr, i32 0, i32 2, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_vgpr_flat_cu(ptr %ptr) { | |
| ; GL2-ONLY-LABEL: prefetch_data_vgpr_flat_cu: | |
| ; GL2-ONLY: ; %bb.0: ; %entry | |
| ; GL2-ONLY-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GL2-ONLY-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GL2-ONLY-NEXT: v_nop | |
| ; GL2-ONLY-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GL2-ONLY-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_SE | |
| ; GL2-ONLY-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_flat_cu: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: flat_prefetch_b8 v[0:1] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SAFE-CU-LABEL: prefetch_data_vgpr_flat_cu: | |
| ; SAFE-CU: ; %bb.0: ; %entry | |
| ; SAFE-CU-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; SAFE-CU-NEXT: s_mov_b64 s[64:65], 0 | |
| ; SAFE-CU-NEXT: v_nop | |
| ; SAFE-CU-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; SAFE-CU-NEXT: flat_prefetch_b8 v[0:1] | |
| ; SAFE-CU-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_flat_cu: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_flat_cu: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.pf(ptr %ptr, i32 0, i32 3, i32 1) | |
| ret void | |
| } | |
| ; flat offset | |
| define amdgpu_ps void @prefetch_data_vgpr_flat_offset(ptr %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_flat_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: flat_prefetch_b8 v[0:1] offset:512 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_flat_offset: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: flat_prefetch_b8 v[0:1] offset:512 scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_flat_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_vgpr_flat_offset: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x200, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_vgpr_flat_offset: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, 0x200 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr float, ptr %ptr, i32 128 | |
| tail call void @llvm.prefetch.pf(ptr %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_vgpr_global_offset(ptr addrspace(1) %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_global_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: global_prefetch_b8 v[0:1], off offset:512 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_global_offset: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v[0:1], off offset:512 scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_global_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_vgpr_global_offset: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x200, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_vgpr_global_offset: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, 0x200 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr float, ptr addrspace(1) %ptr, i32 128 | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_vgpr_global_saddr(ptr addrspace(1) inreg %ptr, i32 %voffset) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_global_saddr: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_global_saddr: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_global_saddr: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_vgpr_global_saddr: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: v_ashrrev_i32_e32 v1, 31, v0 | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_u32 v0, vcc_lo, s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s1, v1, vcc_lo | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_vgpr_global_saddr: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: v_dual_mov_b32 v2, s1 :: v_dual_mov_b32 v1, s0 | |
| ; SPREFETCH-GISEL-NEXT: v_ashrrev_i32_e32 v3, 31, v0 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v1, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v2, v3, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(1) %ptr, i32 %voffset | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %gep, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_vgpr_global_saddr_offset(ptr addrspace(1) inreg %ptr, i32 %voffset) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_global_saddr_offset: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] offset:128 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_global_saddr_offset: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[0:1] offset:128 scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_vgpr_global_saddr_offset: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-SDAG-LABEL: prefetch_data_vgpr_global_saddr_offset: | |
| ; SPREFETCH-SDAG: ; %bb.0: ; %entry | |
| ; SPREFETCH-SDAG-NEXT: v_ashrrev_i32_e32 v1, 31, v0 | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_u32 v0, vcc_lo, s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s1, v1, vcc_lo | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | |
| ; SPREFETCH-SDAG-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-SDAG-NEXT: s_prefetch_data s[0:1], 0x80, null, 0 | |
| ; SPREFETCH-SDAG-NEXT: s_endpgm | |
| ; | |
| ; SPREFETCH-GISEL-LABEL: prefetch_data_vgpr_global_saddr_offset: | |
| ; SPREFETCH-GISEL: ; %bb.0: ; %entry | |
| ; SPREFETCH-GISEL-NEXT: v_dual_mov_b32 v2, s1 :: v_dual_mov_b32 v1, s0 | |
| ; SPREFETCH-GISEL-NEXT: v_ashrrev_i32_e32 v3, 31, v0 | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v1, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v2, v3, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, 0x80 | |
| ; SPREFETCH-GISEL-NEXT: s_wait_alu depctr_va_vcc(0) | |
| ; SPREFETCH-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo | |
| ; SPREFETCH-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; SPREFETCH-GISEL-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; SPREFETCH-GISEL-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; SPREFETCH-GISEL-NEXT: s_endpgm | |
| entry: | |
| %gep1 = getelementptr i8, ptr addrspace(1) %ptr, i32 %voffset | |
| %gep2 = getelementptr i8, ptr addrspace(1) %gep1, i32 128 | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %gep2, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| ; Cannot prefetch I$ with flat or global instructions. | |
| define amdgpu_ps void @prefetch_inst_vgpr_global(ptr addrspace(1) %ptr) { | |
| ; GFX1250-LABEL: prefetch_inst_vgpr_global: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_inst_vgpr_global: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_inst_vgpr_global: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_inst_vgpr_global: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %ptr, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_inst_vgpr_flat(ptr %ptr) { | |
| ; GFX1250-LABEL: prefetch_inst_vgpr_flat: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_inst_vgpr_flat: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_inst_vgpr_flat: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_inst_vgpr_flat: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.pf(ptr %ptr, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| ; Force vector prefetch for uniform address with rw = 1 argument. | |
| define amdgpu_ps void @prefetch_data_sgpr_flat_force_vector(ptr inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_flat_force_vector: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: flat_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_flat_force_vector: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-SPREFETCH-NEXT: flat_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_flat_force_vector: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_flat_force_vector: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.pf(ptr %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_global_force_vector(ptr addrspace(1) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_global_force_vector: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_global_force_vector: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_global_force_vector: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_global_force_vector: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| define amdgpu_ps void @prefetch_data_sgpr_global_saddr_force_vector(ptr addrspace(1) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_global_saddr_force_vector: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] offset:1024 scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_endpgm | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_global_saddr_force_vector: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SPREFETCH-NEXT: v_nop | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v0, s[0:1] offset:1024 scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; NOSPREFETCH-LABEL: prefetch_data_sgpr_global_saddr_force_vector: | |
| ; NOSPREFETCH: ; %bb.0: ; %entry | |
| ; NOSPREFETCH-NEXT: s_endpgm | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_global_saddr_force_vector: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x400, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_endpgm | |
| entry: | |
| %gep = getelementptr i8, ptr addrspace(1) %ptr, i32 1024 | |
| tail call void @llvm.prefetch.p1(ptr addrspace(1) %gep, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_vgpr_constant_32bit(ptr addrspace(6) %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_constant_32bit: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_constant_32bit: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_vgpr_constant_32bit: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_constant_32bit: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: s_mov_b32 s1, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_vgpr_constant_32bit: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p6(ptr addrspace(6) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_vgpr_constant(ptr addrspace(4) %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_constant: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_constant: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_vgpr_constant: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_constant: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_vgpr_constant: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_sgpr_constant_32bit_high_bits(ptr addrspace(6) inreg %ptr) #0 { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_constant_32bit_high_bits: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: s_movk_i32 s1, 0x8000 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_constant_32bit_high_bits: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_movk_i32 s1, 0x8000 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_sgpr_constant_32bit_high_bits: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_constant_32bit_high_bits: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_movk_i32 s1, 0x8000 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_sgpr_constant_32bit_high_bits: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p6(ptr addrspace(6) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_sgpr_region(ptr addrspace(2) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_region: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_region: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_sgpr_region: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_region: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_sgpr_region: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p2(ptr addrspace(2) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_buffer_fat_pointer(ptr addrspace(8) inreg %rsrc) { | |
| ; GFX1250-LABEL: prefetch_data_buffer_fat_pointer: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_buffer_fat_pointer: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_buffer_prefetch_data s[0:3], 0x80, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_buffer_fat_pointer: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_buffer_fat_pointer: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_buffer_prefetch_data s[0:3], 0x80, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_buffer_fat_pointer: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 128 | |
| tail call void @llvm.prefetch.p7(ptr addrspace(7) %q, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_buffer_resource(ptr addrspace(8) inreg %rsrc) { | |
| ; GFX1250-LABEL: prefetch_data_buffer_resource: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_buffer_resource: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_buffer_resource: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_buffer_resource: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_buffer_resource: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p8(ptr addrspace(8) %rsrc, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_sgpr_constant_write(ptr addrspace(4) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_constant_write: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_constant_write: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_sgpr_constant_write: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_constant_write: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_sgpr_constant_write: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %ptr, i32 1, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_sgpr_unknown_as(ptr addrspace(999) inreg %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_sgpr_unknown_as: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_sgpr_unknown_as: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_sgpr_unknown_as: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_sgpr_unknown_as: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_sgpr_unknown_as: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p999(ptr addrspace(999) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_vgpr_unknown_as(ptr addrspace(999) %ptr) { | |
| ; GFX1250-LABEL: prefetch_data_vgpr_unknown_as: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_vgpr_unknown_as: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_vgpr_unknown_as: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_vgpr_unknown_as: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_vgpr_unknown_as: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| tail call void @llvm.prefetch.p999(ptr addrspace(999) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_uniform_in_vgpr(ptr addrspace(1) inreg %pptr) { | |
| ; GFX1250-SDAG-LABEL: prefetch_data_uniform_in_vgpr: | |
| ; GFX1250-SDAG: ; %bb.0: ; %entry | |
| ; GFX1250-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SDAG-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SDAG-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-SDAG-NEXT: global_load_b64 v[0:1], v0, s[0:1] | |
| ; GFX1250-SDAG-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-SDAG-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_uniform_in_vgpr: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-SPREFETCH-NEXT: global_load_b64 v[0:1], v0, s[0:1] | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_xcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_uniform_in_vgpr: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_uniform_in_vgpr: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX12-SPREFETCH-NEXT: global_load_b64 v[0:1], v0, s[0:1] | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_uniform_in_vgpr: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1250-GISEL-LABEL: prefetch_data_uniform_in_vgpr: | |
| ; GFX1250-GISEL: ; %bb.0: ; %entry | |
| ; GFX1250-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-GISEL-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-GISEL-NEXT: v_mov_b32_e32 v2, 0 | |
| ; GFX1250-GISEL-NEXT: global_load_b64 v[0:1], v2, s[0:1] | |
| ; GFX1250-GISEL-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX1250-GISEL-NEXT: s_wait_xcnt 0x0 | |
| ; GFX1250-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-GISEL-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v2, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-GISEL-NEXT: s_set_pc_i64 s[30:31] | |
| entry: | |
| %ptr = load ptr addrspace(4), ptr addrspace(1) %pptr | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_data_uniform_in_vgpr_constant_32bit(ptr addrspace(1) inreg %pptr) { | |
| ; GFX1250-SDAG-LABEL: prefetch_data_uniform_in_vgpr_constant_32bit: | |
| ; GFX1250-SDAG: ; %bb.0: ; %entry | |
| ; GFX1250-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SDAG-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SDAG-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX1250-SDAG-NEXT: global_load_b32 v0, v1, s[0:1] | |
| ; GFX1250-SDAG-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v[0:1], off scope:SCOPE_SYS | |
| ; GFX1250-SDAG-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_data_uniform_in_vgpr_constant_32bit: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-SPREFETCH-NEXT: global_load_b32 v0, v0, s[0:1] | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_xcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_mov_b32 s1, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_data_uniform_in_vgpr_constant_32bit: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_data_uniform_in_vgpr_constant_32bit: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX12-SPREFETCH-NEXT: global_load_b32 v0, v0, s[0:1] | |
| ; GFX12-SPREFETCH-NEXT: s_mov_b32 s1, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_data s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_data_uniform_in_vgpr_constant_32bit: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1250-GISEL-LABEL: prefetch_data_uniform_in_vgpr_constant_32bit: | |
| ; GFX1250-GISEL: ; %bb.0: ; %entry | |
| ; GFX1250-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-GISEL-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-GISEL-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-GISEL-NEXT: global_load_b32 v1, v0, s[0:1] | |
| ; GFX1250-GISEL-NEXT: s_wait_xcnt 0x0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b32 s1, 0 | |
| ; GFX1250-GISEL-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX1250-GISEL-NEXT: v_readfirstlane_b32 s0, v1 | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SYS | |
| ; GFX1250-GISEL-NEXT: s_set_pc_i64 s[30:31] | |
| entry: | |
| %ptr = load ptr addrspace(6), ptr addrspace(1) %pptr | |
| tail call void @llvm.prefetch.p6(ptr addrspace(6) %ptr, i32 0, i32 0, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_inst_uniform_in_vgpr(ptr addrspace(1) inreg %pptr) { | |
| ; GFX1250-LABEL: prefetch_inst_uniform_in_vgpr: | |
| ; GFX1250: ; %bb.0: ; %entry | |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX1250-SPREFETCH-LABEL: prefetch_inst_uniform_in_vgpr: | |
| ; GFX1250-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX1250-SPREFETCH-NEXT: global_load_b64 v[0:1], v0, s[0:1] | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_xcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX1250-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX1250-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX1250-SPREFETCH-NEXT: s_set_pc_i64 s[30:31] | |
| ; | |
| ; GFX12-NOSPREFETCH-LABEL: prefetch_inst_uniform_in_vgpr: | |
| ; GFX12-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX12-SPREFETCH-LABEL: prefetch_inst_uniform_in_vgpr: | |
| ; GFX12-SPREFETCH: ; %bb.0: ; %entry | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt_dscnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_expcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_samplecnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_bvhcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX12-SPREFETCH-NEXT: global_load_b64 v[0:1], v0, s[0:1] | |
| ; GFX12-SPREFETCH-NEXT: s_wait_loadcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX12-SPREFETCH-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX12-SPREFETCH-NEXT: s_prefetch_inst s[0:1], 0x0, null, 0 | |
| ; GFX12-SPREFETCH-NEXT: s_wait_kmcnt 0x0 | |
| ; GFX12-SPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-NOSPREFETCH-LABEL: prefetch_inst_uniform_in_vgpr: | |
| ; GFX11-NOSPREFETCH: ; %bb.0: ; %entry | |
| ; GFX11-NOSPREFETCH-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-NOSPREFETCH-NEXT: s_setpc_b64 s[30:31] | |
| entry: | |
| %ptr = load ptr addrspace(4), ptr addrspace(1) %pptr | |
| tail call void @llvm.prefetch.p4(ptr addrspace(4) %ptr, i32 0, i32 0, i32 0) | |
| ret void | |
| } | |
| declare void @llvm.prefetch.pf(ptr nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p1(ptr addrspace(1) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p2(ptr addrspace(2) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p3(ptr addrspace(3) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p4(ptr addrspace(4) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p5(ptr addrspace(5) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p6(ptr addrspace(6) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p7(ptr addrspace(7) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p8(ptr addrspace(8) nocapture readonly, i32, i32, i32) | |
| declare void @llvm.prefetch.p999(ptr addrspace(999) nocapture readonly, i32, i32, i32) | |
| attributes #0 = { "amdgpu-32bit-address-high-bits"="0xffff8000" } | |
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | |
| ; GCN: {{.*}} | |
| ; SPREFETCH: {{.*}} |