blob: 223c702402f390db35033e39cd812e3b8af1792a [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=amdgpu10.10 < %s | FileCheck -check-prefix=GFX10 %s
; RUN: llc -mtriple=amdgpu11.00 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefix=GFX11 %s
; RUN: llc -mtriple=amdgpu12.00 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefix=GFX12 %s
; Mismatched dim must block merging: would reinterpret the array slice as y.
define amdgpu_ps <4 x float> @load_2d_1darray_dim_mismatch(<8 x i32> inreg %rsrc, i32 %s, i32 %t) {
; GFX10-LABEL: load_2d_1darray_dim_mismatch:
; GFX10: ; %bb.0: ; %main_body
; GFX10-NEXT: v_mov_b32_e32 v4, v1
; GFX10-NEXT: s_clause 0x1
; GFX10-NEXT: image_load v5, v[0:1], s[0:7] dmask:0x1 dim:SQ_RSRC_IMG_2D unorm
; GFX10-NEXT: image_load v[1:3], v[0:1], s[0:7] dmask:0xe dim:SQ_RSRC_IMG_1D_ARRAY unorm
; GFX10-NEXT: ; kill: killed $vgpr4
; GFX10-NEXT: s_waitcnt vmcnt(1)
; GFX10-NEXT: v_mov_b32_e32 v0, v5
; GFX10-NEXT: s_waitcnt vmcnt(0)
; GFX10-NEXT: ; return to shader part epilog
;
; GFX11-LABEL: load_2d_1darray_dim_mismatch:
; GFX11: ; %bb.0: ; %main_body
; GFX11-NEXT: s_clause 0x1
; GFX11-NEXT: image_load v4, v[0:1], s[0:7] dmask:0x1 dim:SQ_RSRC_IMG_2D unorm
; GFX11-NEXT: image_load v[1:3], v[0:1], s[0:7] dmask:0xe dim:SQ_RSRC_IMG_1D_ARRAY unorm
; GFX11-NEXT: s_waitcnt vmcnt(1)
; GFX11-NEXT: v_mov_b32_e32 v0, v4
; GFX11-NEXT: s_waitcnt vmcnt(0)
; GFX11-NEXT: ; return to shader part epilog
;
; GFX12-LABEL: load_2d_1darray_dim_mismatch:
; GFX12: ; %bb.0: ; %main_body
; GFX12-NEXT: s_clause 0x1
; GFX12-NEXT: image_load v4, [v0, v1], s[0:7] dmask:0x1 dim:SQ_RSRC_IMG_2D
; GFX12-NEXT: image_load v[1:3], [v0, v1], s[0:7] dmask:0xe dim:SQ_RSRC_IMG_1D_ARRAY
; GFX12-NEXT: s_wait_loadcnt 0x1
; GFX12-NEXT: v_mov_b32_e32 v0, v4
; GFX12-NEXT: s_wait_loadcnt 0x0
; GFX12-NEXT: ; return to shader part epilog
main_body:
%v1 = call float @llvm.amdgcn.image.load.2d.f32.i32(i32 1, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0)
%v2 = call <3 x float> @llvm.amdgcn.image.load.1darray.v3f32.i32(i32 14, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0)
%e0 = extractelement <3 x float> %v2, i32 0
%e1 = extractelement <3 x float> %v2, i32 1
%e2 = extractelement <3 x float> %v2, i32 2
%r0 = insertelement <4 x float> poison, float %v1, i32 0
%r1 = insertelement <4 x float> %r0, float %e0, i32 1
%r2 = insertelement <4 x float> %r1, float %e1, i32 2
%r3 = insertelement <4 x float> %r2, float %e2, i32 3
ret <4 x float> %r3
}
; Matching dim: merging still expected.
define amdgpu_ps <4 x float> @load_2d_2d_merged(<8 x i32> inreg %rsrc, i32 %s, i32 %t) {
; GFX10-LABEL: load_2d_2d_merged:
; GFX10: ; %bb.0: ; %main_body
; GFX10-NEXT: image_load v[0:3], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm
; GFX10-NEXT: s_waitcnt vmcnt(0)
; GFX10-NEXT: ; return to shader part epilog
;
; GFX11-LABEL: load_2d_2d_merged:
; GFX11: ; %bb.0: ; %main_body
; GFX11-NEXT: image_load v[0:3], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm
; GFX11-NEXT: s_waitcnt vmcnt(0)
; GFX11-NEXT: ; return to shader part epilog
;
; GFX12-LABEL: load_2d_2d_merged:
; GFX12: ; %bb.0: ; %main_body
; GFX12-NEXT: image_load v[0:3], [v0, v1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D
; GFX12-NEXT: s_wait_loadcnt 0x0
; GFX12-NEXT: ; return to shader part epilog
main_body:
%v1 = call float @llvm.amdgcn.image.load.2d.f32.i32(i32 1, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0)
%v2 = call <3 x float> @llvm.amdgcn.image.load.2d.v3f32.i32(i32 14, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0)
%e0 = extractelement <3 x float> %v2, i32 0
%e1 = extractelement <3 x float> %v2, i32 1
%e2 = extractelement <3 x float> %v2, i32 2
%r0 = insertelement <4 x float> poison, float %v1, i32 0
%r1 = insertelement <4 x float> %r0, float %e0, i32 1
%r2 = insertelement <4 x float> %r1, float %e1, i32 2
%r3 = insertelement <4 x float> %r2, float %e2, i32 3
ret <4 x float> %r3
}
declare float @llvm.amdgcn.image.load.2d.f32.i32(i32, i32, i32, <8 x i32>, i32, i32) #0
declare <3 x float> @llvm.amdgcn.image.load.2d.v3f32.i32(i32, i32, i32, <8 x i32>, i32, i32) #0
declare <3 x float> @llvm.amdgcn.image.load.1darray.v3f32.i32(i32, i32, i32, <8 x i32>, i32, i32) #0
attributes #0 = { nounwind readonly }