blob: 0bedebe59c539bd824291cb01a91d7133480bc5d [file] [edit]
; RUN: opt -S -disable-output -passes="print<dxil-resources>" < %s 2>&1 | FileCheck %s
; Verifies that the DXILResourceMap analysis detects 64-bit atomic uses on
; UAV resources and sets `HasAtomic64Use` on the corresponding ResourceInfo.
;
; * `Atomic64UAV` is used by a 64-bit `atomicrmw` -> Has Atomic64 Use: 1
; * `Atomic32UAV` is used by a 32-bit `atomicrmw` -> Has Atomic64 Use: 0
; * `PlainUAV` is only stored to (no atomics) -> Has Atomic64 Use: 0
target triple = "dxil-pc-shadermodel6.6-compute"
define void @main() {
; RWByteAddressBuffer Atomic64UAV : register(u0);
%h64 = call target("dx.RawBuffer", i8, 1, 0)
@llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_0t(
i32 0, i32 0, i32 1, i32 0, ptr null)
; CHECK: Binding:
; CHECK: Binding ID: 0
; CHECK: Space: 0
; CHECK: Lower Bound: 0
; CHECK: Size: 1
; CHECK: Has Atomic64 Use: 1
%p64 = call ptr @llvm.dx.resource.getpointer(
target("dx.RawBuffer", i8, 1, 0) %h64, i32 0)
%old64 = atomicrmw add ptr %p64, i64 1 monotonic
; RWByteAddressBuffer Atomic32UAV : register(u1);
%h32 = call target("dx.RawBuffer", i8, 1, 0)
@llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_0t(
i32 0, i32 1, i32 1, i32 0, ptr null)
; CHECK: Binding:
; CHECK: Binding ID: 1
; CHECK: Space: 0
; CHECK: Lower Bound: 1
; CHECK: Size: 1
; CHECK: Has Atomic64 Use: 0
%p32 = call ptr @llvm.dx.resource.getpointer(
target("dx.RawBuffer", i8, 1, 0) %h32, i32 0)
%old32 = atomicrmw add ptr %p32, i32 1 monotonic
; RWBuffer<int> PlainUAV : register(u2);
%hp = call target("dx.TypedBuffer", i32, 1, 0, 1)
@llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_1t(
i32 0, i32 2, i32 1, i32 0, ptr null)
; CHECK: Binding:
; CHECK: Binding ID: 2
; CHECK: Space: 0
; CHECK: Lower Bound: 2
; CHECK: Size: 1
; CHECK: Has Atomic64 Use: 0
%pp = call ptr @llvm.dx.resource.getpointer(
target("dx.TypedBuffer", i32, 1, 0, 1) %hp, i32 0)
store i32 42, ptr %pp
ret void
}