Missing BackOffBarrier feature added to gfx1250. Checking for S_BARRIER only does not imply prior DS Stores getting drained.
194 lines
8.5 KiB
LLVM
194 lines
8.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck --check-prefixes=GFX9-NO-BACKOFF %s
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a < %s | FileCheck --check-prefixes=GFX9-BACKOFF %s
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx942 < %s | FileCheck --check-prefixes=GFX942-BACKOFF %s
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -mattr=-back-off-barrier < %s | FileCheck --check-prefixes=GFX9-NO-BACKOFF %s
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck --check-prefixes=GFX10-BACKOFF %s
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck --check-prefixes=GFX11-BACKOFF %s
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 < %s | FileCheck --check-prefixes=GFX12-BACKOFF %s
|
|
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 < %s | FileCheck --check-prefixes=GFX1250-BACKOFF %s
|
|
|
|
; Subtargets must wait for outstanding memory instructions before a barrier if
|
|
; they cannot back off of the barrier.
|
|
|
|
define void @back_off_barrier_no_fence(ptr %in, ptr %out) #0 {
|
|
; GFX9-NO-BACKOFF-LABEL: back_off_barrier_no_fence:
|
|
; GFX9-NO-BACKOFF: ; %bb.0:
|
|
; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX9-NO-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX9-NO-BACKOFF-NEXT: s_barrier
|
|
; GFX9-NO-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX9-NO-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX9-BACKOFF-LABEL: back_off_barrier_no_fence:
|
|
; GFX9-BACKOFF: ; %bb.0:
|
|
; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX9-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX9-BACKOFF-NEXT: s_barrier
|
|
; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX9-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX9-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX942-BACKOFF-LABEL: back_off_barrier_no_fence:
|
|
; GFX942-BACKOFF: ; %bb.0:
|
|
; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX942-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX942-BACKOFF-NEXT: s_barrier
|
|
; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX942-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX942-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX10-BACKOFF-LABEL: back_off_barrier_no_fence:
|
|
; GFX10-BACKOFF: ; %bb.0:
|
|
; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX10-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX10-BACKOFF-NEXT: s_barrier
|
|
; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX10-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX10-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX10-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX11-BACKOFF-LABEL: back_off_barrier_no_fence:
|
|
; GFX11-BACKOFF: ; %bb.0:
|
|
; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX11-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]
|
|
; GFX11-BACKOFF-NEXT: s_barrier
|
|
; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX11-BACKOFF-NEXT: flat_store_b32 v[2:3], v0
|
|
; GFX11-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX12-BACKOFF-LABEL: back_off_barrier_no_fence:
|
|
; GFX12-BACKOFF: ; %bb.0:
|
|
; GFX12-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_expcnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_samplecnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_bvhcnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_kmcnt 0x0
|
|
; GFX12-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]
|
|
; GFX12-BACKOFF-NEXT: s_barrier_signal -1
|
|
; GFX12-BACKOFF-NEXT: s_barrier_wait -1
|
|
; GFX12-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX12-BACKOFF-NEXT: flat_store_b32 v[2:3], v0
|
|
; GFX12-BACKOFF-NEXT: s_wait_dscnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX1250-BACKOFF-LABEL: back_off_barrier_no_fence:
|
|
; GFX1250-BACKOFF: ; %bb.0:
|
|
; GFX1250-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: s_wait_kmcnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]
|
|
; GFX1250-BACKOFF-NEXT: s_barrier_signal -1
|
|
; GFX1250-BACKOFF-NEXT: s_barrier_wait -1
|
|
; GFX1250-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: flat_store_b32 v[2:3], v0
|
|
; GFX1250-BACKOFF-NEXT: s_wait_dscnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: s_set_pc_i64 s[30:31]
|
|
%load = load i32, ptr %in
|
|
call void @llvm.amdgcn.s.barrier()
|
|
store i32 %load, ptr %out
|
|
ret void
|
|
}
|
|
|
|
define void @back_off_barrier_with_fence(ptr %in, ptr %out) #0 {
|
|
; GFX9-NO-BACKOFF-LABEL: back_off_barrier_with_fence:
|
|
; GFX9-NO-BACKOFF: ; %bb.0:
|
|
; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX9-NO-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX9-NO-BACKOFF-NEXT: s_barrier
|
|
; GFX9-NO-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX9-NO-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX9-BACKOFF-LABEL: back_off_barrier_with_fence:
|
|
; GFX9-BACKOFF: ; %bb.0:
|
|
; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX9-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX9-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-BACKOFF-NEXT: s_barrier
|
|
; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0)
|
|
; GFX9-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX9-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX942-BACKOFF-LABEL: back_off_barrier_with_fence:
|
|
; GFX942-BACKOFF: ; %bb.0:
|
|
; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX942-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX942-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX942-BACKOFF-NEXT: s_barrier
|
|
; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0)
|
|
; GFX942-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX942-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX10-BACKOFF-LABEL: back_off_barrier_with_fence:
|
|
; GFX10-BACKOFF: ; %bb.0:
|
|
; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX10-BACKOFF-NEXT: flat_load_dword v0, v[0:1]
|
|
; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX10-BACKOFF-NEXT: s_waitcnt_vscnt null, 0x0
|
|
; GFX10-BACKOFF-NEXT: s_barrier
|
|
; GFX10-BACKOFF-NEXT: buffer_gl0_inv
|
|
; GFX10-BACKOFF-NEXT: flat_store_dword v[2:3], v0
|
|
; GFX10-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX10-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX11-BACKOFF-LABEL: back_off_barrier_with_fence:
|
|
; GFX11-BACKOFF: ; %bb.0:
|
|
; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GFX11-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]
|
|
; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
|
|
; GFX11-BACKOFF-NEXT: s_waitcnt_vscnt null, 0x0
|
|
; GFX11-BACKOFF-NEXT: s_barrier
|
|
; GFX11-BACKOFF-NEXT: buffer_gl0_inv
|
|
; GFX11-BACKOFF-NEXT: flat_store_b32 v[2:3], v0
|
|
; GFX11-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX12-BACKOFF-LABEL: back_off_barrier_with_fence:
|
|
; GFX12-BACKOFF: ; %bb.0:
|
|
; GFX12-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_expcnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_samplecnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_bvhcnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_kmcnt 0x0
|
|
; GFX12-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]
|
|
; GFX12-BACKOFF-NEXT: s_wait_storecnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_barrier_signal -1
|
|
; GFX12-BACKOFF-NEXT: s_barrier_wait -1
|
|
; GFX12-BACKOFF-NEXT: global_inv scope:SCOPE_SE
|
|
; GFX12-BACKOFF-NEXT: flat_store_b32 v[2:3], v0
|
|
; GFX12-BACKOFF-NEXT: s_wait_dscnt 0x0
|
|
; GFX12-BACKOFF-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GFX1250-BACKOFF-LABEL: back_off_barrier_with_fence:
|
|
; GFX1250-BACKOFF: ; %bb.0:
|
|
; GFX1250-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: s_wait_kmcnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]
|
|
; GFX1250-BACKOFF-NEXT: s_wait_storecnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: s_wait_loadcnt_dscnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: s_barrier_signal -1
|
|
; GFX1250-BACKOFF-NEXT: s_barrier_wait -1
|
|
; GFX1250-BACKOFF-NEXT: flat_store_b32 v[2:3], v0
|
|
; GFX1250-BACKOFF-NEXT: s_wait_dscnt 0x0
|
|
; GFX1250-BACKOFF-NEXT: s_set_pc_i64 s[30:31]
|
|
%load = load i32, ptr %in
|
|
fence syncscope("workgroup") release
|
|
call void @llvm.amdgcn.s.barrier()
|
|
fence syncscope("workgroup") acquire
|
|
store i32 %load, ptr %out
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.amdgcn.s.barrier()
|
|
|
|
attributes #0 = { nounwind }
|