blob: c89f41f81006087acb1a9b3abaa3f9cd14b2023e [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=amdgpu12.50 < %s | FileCheck %s
declare void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) nocapture, ptr addrspace(3) nocapture, i32, i32)
declare void @llvm.amdgcn.tensor.load.to.lds(<4 x i32>, <8 x i32>, <4 x i32>, <4 x i32>, <8 x i32>, i32)
define i32 @lds_then_dma.global.singlethread(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.global.singlethread:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v3, s0
; CHECK-NEXT: ds_load_b32 v2, v3
; CHECK-NEXT: global_load_async_to_lds_b32 v3, v[0:1], off
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v0, v2
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("singlethread") release, !mmra !0
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.global.wave(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.global.wave:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v3, s0
; CHECK-NEXT: ds_load_b32 v2, v3
; CHECK-NEXT: global_load_async_to_lds_b32 v3, v[0:1], off
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v0, v2
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("wavefront") release, !mmra !0
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.global.wg(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.global.wg:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v3, s0
; CHECK-NEXT: ds_load_b32 v2, v3
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: global_load_async_to_lds_b32 v3, v[0:1], off
; CHECK-NEXT: v_mov_b32_e32 v0, v2
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("workgroup") release, !mmra !0
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.global.agent(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.global.agent:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v3, s0
; CHECK-NEXT: ds_load_b32 v2, v3
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: global_load_async_to_lds_b32 v3, v[0:1], off
; CHECK-NEXT: v_mov_b32_e32 v0, v2
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("agent") release, !mmra !0
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.global.system(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.global.system:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v3, s0
; CHECK-NEXT: ds_load_b32 v2, v3
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: global_load_async_to_lds_b32 v3, v[0:1], off
; CHECK-NEXT: v_mov_b32_e32 v0, v2
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence release, !mmra !0
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.global.singlethread.partial(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.global.singlethread.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v2, s0 :: v_dual_mov_b32 v3, s1
; CHECK-NEXT: ds_load_b32 v4, v2
; CHECK-NEXT: ds_load_b32 v3, v3
; CHECK-NEXT: global_load_async_to_lds_b32 v2, v[0:1], off
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v4, v3
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("singlethread") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.global.wave.partial(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.global.wave.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v2, s0 :: v_dual_mov_b32 v3, s1
; CHECK-NEXT: ds_load_b32 v4, v2
; CHECK-NEXT: ds_load_b32 v3, v3
; CHECK-NEXT: global_load_async_to_lds_b32 v2, v[0:1], off
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v4, v3
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("wavefront") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.global.wg.partial(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.global.wg.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v2, s0 :: v_dual_mov_b32 v4, s1
; CHECK-NEXT: ds_load_b32 v3, v2
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: ds_load_b32 v4, v4
; CHECK-NEXT: global_load_async_to_lds_b32 v2, v[0:1], off
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v3, v4
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("workgroup") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.global.agent.partial(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.global.agent.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v2, s0 :: v_dual_mov_b32 v4, s1
; CHECK-NEXT: ds_load_b32 v3, v2
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: ds_load_b32 v4, v4
; CHECK-NEXT: global_load_async_to_lds_b32 v2, v[0:1], off
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v3, v4
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("agent") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.global.system.partial(ptr addrspace(1) %g, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.global.system.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v2, s0 :: v_dual_mov_b32 v4, s1
; CHECK-NEXT: ds_load_b32 v3, v2
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: ds_load_b32 v4, v4
; CHECK-NEXT: global_load_async_to_lds_b32 v2, v[0:1], off
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v3, v4
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.global.load.async.to.lds.b32(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 0, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.tensor.singlethread(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.tensor.singlethread:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v0, s24
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("singlethread") release, !mmra !0
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.tensor.wave(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.tensor.wave:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v0, s24
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("wavefront") release, !mmra !0
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.tensor.wg(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.tensor.wg:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v0, s24
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("workgroup") release, !mmra !0
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.tensor.agent(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.tensor.agent:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v0, s24
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("agent") release, !mmra !0
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.tensor.system(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds) #0 {
; CHECK-LABEL: lds_then_dma.tensor.system:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_mov_b32_e32 v0, s24
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v = load i32, ptr addrspace(3) %lds, align 4
fence release, !mmra !0
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
ret i32 %v
}
define i32 @lds_then_dma.tensor.singlethread.partial(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.tensor.singlethread.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v0, s24 :: v_dual_mov_b32 v1, s25
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: ds_load_b32 v1, v1
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v0, v1
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("singlethread") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.tensor.wave.partial(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.tensor.wave.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v0, s24 :: v_dual_mov_b32 v1, s25
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: ds_load_b32 v1, v1
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v0, v1
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("wavefront") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.tensor.wg.partial(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.tensor.wg.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v0, s24 :: v_dual_mov_b32 v1, s25
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: ds_load_b32 v1, v1
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v0, v1
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("workgroup") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.tensor.agent.partial(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.tensor.agent.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v0, s24 :: v_dual_mov_b32 v1, s25
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: ds_load_b32 v1, v1
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v0, v1
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence syncscope("agent") release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
define i32 @lds_then_dma.tensor.system.partial(<4 x i32> inreg %D0, <8 x i32> inreg %D1, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 {
; CHECK-LABEL: lds_then_dma.tensor.system.partial:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_wait_loadcnt_dscnt 0x0
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v0, s24 :: v_dual_mov_b32 v1, s25
; CHECK-NEXT: ds_load_b32 v0, v0
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: ds_load_b32 v1, v1
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[16:23]
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: v_add_nc_u32_e32 v0, v0, v1
; CHECK-NEXT: s_set_pc_i64 s[30:31]
%v1 = load i32, ptr addrspace(3) %lds, align 4
fence release, !mmra !0
%v2 = load i32, ptr addrspace(3) %lds2, align 4
call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %D0, <8 x i32> %D1, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
%s = add i32 %v1, %v2
ret i32 %s
}
attributes #0 = { nounwind "amdgpu-flat-work-group-size"="1,32" }
!0 = !{!"amdgpu-synchronize-as", !"local"}