llvm-project/llvm/test/CodeGen/AMDGPU/wait-before-stores-with-scope_sys.mir
Pierre van Houtryve a086fb2fbb
[AMDGPU][gfx1250] Add wait_xcnt before any access that cannot be repeated (#168852)
The xcnt wait is actually required before any memory access that can
only be done once, so atomic stores and volatile accesses are affected.
This patch also ensures buffer instructions are handled.
2025-11-25 10:11:04 +01:00

59 lines
3.0 KiB
YAML

# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -run-pass=si-memory-legalizer %s -o - | FileCheck --check-prefix=GFX1200 %s
# RUN: llc -mtriple=amdgcn -mcpu=gfx1250 -run-pass=si-memory-legalizer %s -o - | FileCheck --check-prefix=GFX1250 %s
---
name: intrinsic_store_system_scope
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $vgpr0, $vgpr1, $vgpr2
; GFX1200-LABEL: name: intrinsic_store_system_scope
; GFX1200: liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $vgpr0, $vgpr1, $vgpr2
; GFX1200-NEXT: {{ $}}
; GFX1200-NEXT: S_WAIT_LOADCNT_soft 0
; GFX1200-NEXT: S_WAIT_SAMPLECNT_soft 0
; GFX1200-NEXT: S_WAIT_BVHCNT_soft 0
; GFX1200-NEXT: S_WAIT_KMCNT_soft 0
; GFX1200-NEXT: S_WAIT_STORECNT_soft 0
; GFX1200-NEXT: BUFFER_STORE_DWORD_VBUFFER_BOTHEN_exact killed renamable $vgpr0, killed renamable $vgpr2_vgpr3, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 0, 24, 0, implicit $exec :: (dereferenceable store (s32), align 1, addrspace 8)
; GFX1200-NEXT: S_ENDPGM 0
;
; GFX1250-LABEL: name: intrinsic_store_system_scope
; GFX1250: liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $vgpr0, $vgpr1, $vgpr2
; GFX1250-NEXT: {{ $}}
; GFX1250-NEXT: BUFFER_STORE_DWORD_VBUFFER_BOTHEN_exact killed renamable $vgpr0, killed renamable $vgpr2_vgpr3, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 0, 24, 0, implicit $exec :: (dereferenceable store (s32), align 1, addrspace 8)
; GFX1250-NEXT: S_ENDPGM 0
BUFFER_STORE_DWORD_VBUFFER_BOTHEN_exact killed renamable $vgpr0, killed renamable $vgpr2_vgpr3, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 0, 24, 0, implicit $exec :: (dereferenceable store (s32), align 1, addrspace 8)
S_ENDPGM 0
...
---
name: generic_store_volatile
body: |
bb.0:
liveins: $vgpr0, $vgpr1, $vgpr2
; GFX1200-LABEL: name: generic_store_volatile
; GFX1200: liveins: $vgpr0, $vgpr1, $vgpr2
; GFX1200-NEXT: {{ $}}
; GFX1200-NEXT: S_WAIT_LOADCNT_soft 0
; GFX1200-NEXT: S_WAIT_SAMPLECNT_soft 0
; GFX1200-NEXT: S_WAIT_BVHCNT_soft 0
; GFX1200-NEXT: S_WAIT_KMCNT_soft 0
; GFX1200-NEXT: S_WAIT_STORECNT_soft 0
; GFX1200-NEXT: GLOBAL_STORE_DWORD killed renamable $vgpr2_vgpr3, killed renamable $vgpr0, 0, 24, implicit $exec :: (volatile store (s32), addrspace 1)
; GFX1200-NEXT: S_WAIT_STORECNT_soft 0
; GFX1200-NEXT: S_ENDPGM 0
;
; GFX1250-LABEL: name: generic_store_volatile
; GFX1250: liveins: $vgpr0, $vgpr1, $vgpr2
; GFX1250-NEXT: {{ $}}
; GFX1250-NEXT: S_WAIT_XCNT_soft 0
; GFX1250-NEXT: GLOBAL_STORE_DWORD killed renamable $vgpr2_vgpr3, killed renamable $vgpr0, 0, 24, implicit $exec :: (volatile store (s32), addrspace 1)
; GFX1250-NEXT: S_WAIT_STORECNT_soft 0
; GFX1250-NEXT: S_ENDPGM 0
GLOBAL_STORE_DWORD killed renamable $vgpr2_vgpr3, killed renamable $vgpr0, 0, 0, implicit $exec :: (volatile store (s32), addrspace 1)
S_ENDPGM 0
...