| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=amdgpu9.42 < %s | FileCheck %s | |
| declare void @llvm.amdgcn.global.load.lds(ptr addrspace(1) nocapture, ptr addrspace(3) nocapture, i32, i32, i32) | |
| declare void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32>, ptr addrspace(3) nocapture, i32, i32, i32, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, v2 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("singlethread") release, !mmra !0 | |
| call void @llvm.amdgcn.global.load.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, v2 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("wavefront") release, !mmra !0 | |
| call void @llvm.amdgcn.global.load.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, v2 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("workgroup") release, !mmra !0 | |
| call void @llvm.amdgcn.global.load.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, v2 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("agent") release, !mmra !0 | |
| call void @llvm.amdgcn.global.load.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, v2 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence release, !mmra !0 | |
| call void @llvm.amdgcn.global.load.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v3, s1 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: ds_read_b32 v3, v3 | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v2, v3 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v3, s1 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: ds_read_b32 v3, v3 | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v2, v3 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v3, s1 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: ds_read_b32 v3, v3 | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v2, v3 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v3, s1 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: ds_read_b32 v3, v3 | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v2, v3 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, 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_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v2, s0 | |
| ; CHECK-NEXT: ds_read_b32 v2, v2 | |
| ; CHECK-NEXT: s_mov_b32 m0, s0 | |
| ; CHECK-NEXT: v_mov_b32_e32 v3, s1 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: ds_read_b32 v3, v3 | |
| ; CHECK-NEXT: global_load_lds_dword v[0:1], off | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v2, v3 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.lds(ptr addrspace(1) %g, ptr addrspace(3) %lds, i32 4, i32 0, i32 0) | |
| %s = add i32 %v1, %v2 | |
| ret i32 %s | |
| } | |
| define i32 @lds_then_dma.buffer.singlethread(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.singlethread: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("singlethread") release, !mmra !0 | |
| call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| ret i32 %v | |
| } | |
| define i32 @lds_then_dma.buffer.wave(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.wave: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("wavefront") release, !mmra !0 | |
| call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| ret i32 %v | |
| } | |
| define i32 @lds_then_dma.buffer.wg(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.wg: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("workgroup") release, !mmra !0 | |
| call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| ret i32 %v | |
| } | |
| define i32 @lds_then_dma.buffer.agent(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.agent: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence syncscope("agent") release, !mmra !0 | |
| call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| ret i32 %v | |
| } | |
| define i32 @lds_then_dma.buffer.system(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.system: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] | |
| %v = load i32, ptr addrspace(3) %lds, align 4 | |
| fence release, !mmra !0 | |
| call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| ret i32 %v | |
| } | |
| define i32 @lds_then_dma.buffer.singlethread.partial(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.singlethread.partial: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s17 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: ds_read_b32 v1, v1 | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v0, v1 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| %s = add i32 %v1, %v2 | |
| ret i32 %s | |
| } | |
| define i32 @lds_then_dma.buffer.wave.partial(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.wave.partial: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s17 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: ds_read_b32 v1, v1 | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v0, v1 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| %s = add i32 %v1, %v2 | |
| ret i32 %s | |
| } | |
| define i32 @lds_then_dma.buffer.wg.partial(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.wg.partial: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s17 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: ds_read_b32 v1, v1 | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v0, v1 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| %s = add i32 %v1, %v2 | |
| ret i32 %s | |
| } | |
| define i32 @lds_then_dma.buffer.agent.partial(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.agent.partial: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s17 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: ds_read_b32 v1, v1 | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v0, v1 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, i32 0) | |
| %s = add i32 %v1, %v2 | |
| ret i32 %s | |
| } | |
| define i32 @lds_then_dma.buffer.system.partial(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds, ptr addrspace(3) inreg %lds2) #0 { | |
| ; CHECK-LABEL: lds_then_dma.buffer.system.partial: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; CHECK-NEXT: v_mov_b32_e32 v0, s16 | |
| ; CHECK-NEXT: ds_read_b32 v0, v0 | |
| ; CHECK-NEXT: s_mov_b32 m0, s16 | |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s17 | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: ds_read_b32 v1, v1 | |
| ; CHECK-NEXT: buffer_load_dword off, s[0:3], 0 lds | |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) | |
| ; CHECK-NEXT: v_add_u32_e32 v0, v0, v1 | |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) | |
| ; CHECK-NEXT: s_setpc_b64 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.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds, i32 4, i32 0, i32 0, i32 0, 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"} |