In DXIL, some 64bit types are actually represented with their 32bit counterpart. This was already being address in the codegen, however the metadata generation was lacking this information. This PR is fixing this issue. Closes: [#146735](https://github.com/llvm/llvm-project/issues/146735)
201 lines
7.2 KiB
LLVM
201 lines
7.2 KiB
LLVM
; RUN: opt -S -disable-output -passes="print<dxil-resources>" < %s 2>&1 | FileCheck %s
|
|
|
|
@G = external constant <4 x float>, align 4
|
|
|
|
@Zero.str = private unnamed_addr constant [5 x i8] c"Zero\00", align 1
|
|
@One.str = private unnamed_addr constant [4 x i8] c"One\00", align 1
|
|
@Two.str = private unnamed_addr constant [4 x i8] c"Two\00", align 1
|
|
@Three.str = private unnamed_addr constant [6 x i8] c"Three\00", align 1
|
|
@Four.str = private unnamed_addr constant [5 x i8] c"Four\00", align 1
|
|
@Array.str = private unnamed_addr constant [6 x i8] c"Array\00", align 1
|
|
@Five.str = private unnamed_addr constant [5 x i8] c"Five\00", align 1
|
|
@Six.str = private unnamed_addr constant [4 x i8] c"Six\00", align 1
|
|
@CB.str = private unnamed_addr constant [3 x i8] c"CB\00", align 1
|
|
@Constants.str = private unnamed_addr constant [10 x i8] c"Constants\00", align 1
|
|
|
|
define void @test_typedbuffer() {
|
|
; ByteAddressBuffer Buf : register(t8, space1)
|
|
%srv0 = call target("dx.RawBuffer", void, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, ptr @Zero.str)
|
|
; CHECK: Resource [[SRV0:[0-9]+]]:
|
|
; CHECK: Name: Zero
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 0
|
|
; CHECK: Space: 1
|
|
; CHECK: Lower Bound: 8
|
|
; CHECK: Size: 1
|
|
; CHECK: Class: SRV
|
|
; CHECK: Kind: RawBuffer
|
|
|
|
; struct S { float4 a; uint4 b; };
|
|
; StructuredBuffer<S> Buf : register(t2, space4)
|
|
%srv1 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 4, i32 2, i32 1, i32 0, ptr @One.str)
|
|
; CHECK: Resource [[SRV1:[0-9]+]]:
|
|
; CHECK: Name: One
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 1
|
|
; CHECK: Space: 4
|
|
; CHECK: Lower Bound: 2
|
|
; CHECK: Size: 1
|
|
; CHECK: Class: SRV
|
|
; CHECK: Kind: StructuredBuffer
|
|
; CHECK: Buffer Stride: 32
|
|
; CHECK: Alignment: 4
|
|
|
|
; Buffer<uint4> Buf[24] : register(t3, space5)
|
|
%srv2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 5, i32 3, i32 24, i32 0, ptr @Two.str)
|
|
; CHECK: Resource [[SRV2:[0-9]+]]:
|
|
; CHECK: Name: Two
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 2
|
|
; CHECK: Space: 5
|
|
; CHECK: Lower Bound: 3
|
|
; CHECK: Size: 24
|
|
; CHECK: Class: SRV
|
|
; CHECK: Kind: Buffer
|
|
; CHECK: Element Type: u32
|
|
; CHECK: Element Count: 4
|
|
|
|
; RWBuffer<int> Buf : register(u7, space2)
|
|
%uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1)
|
|
@llvm.dx.resource.handlefrombinding(i32 2, i32 7, i32 1, i32 0, ptr @Three.str)
|
|
; CHECK: Resource [[UAV0:[0-9]+]]:
|
|
; CHECK: Name: Three
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 0
|
|
; CHECK: Space: 2
|
|
; CHECK: Lower Bound: 7
|
|
; CHECK: Size: 1
|
|
; CHECK: Globally Coherent: 0
|
|
; CHECK: Counter Direction: Unknown
|
|
; CHECK: Class: UAV
|
|
; CHECK: Kind: Buffer
|
|
; CHECK: IsROV: 0
|
|
; CHECK: Element Type: i32
|
|
; CHECK: Element Count: 1
|
|
|
|
; RWBuffer<float4> Buf : register(u5, space3)
|
|
%uav1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 3, i32 5, i32 1, i32 0, ptr @Four.str)
|
|
call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav1, i8 -1)
|
|
; CHECK: Resource [[UAV1:[0-9]+]]:
|
|
; CHECK: Name: Four
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 1
|
|
; CHECK: Space: 3
|
|
; CHECK: Lower Bound: 5
|
|
; CHECK: Size: 1
|
|
; CHECK: Globally Coherent: 0
|
|
; CHECK: Counter Direction: Decrement
|
|
; CHECK: Class: UAV
|
|
; CHECK: Kind: Buffer
|
|
; CHECK: IsROV: 0
|
|
; CHECK: Element Type: f32
|
|
; CHECK: Element Count: 4
|
|
|
|
; RWBuffer<float4> BufferArray[10] : register(u0, space4)
|
|
; RWBuffer<float4> Buf = BufferArray[0]
|
|
%uav2_1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 0, ptr @Array.str)
|
|
; RWBuffer<float4> Buf = BufferArray[5]
|
|
%uav2_2 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 5, ptr @Array.str)
|
|
call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav2_2, i8 1)
|
|
; CHECK: Resource [[UAV2:[0-9]+]]:
|
|
; CHECK: Name: Array
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 2
|
|
; CHECK: Space: 4
|
|
; CHECK: Lower Bound: 0
|
|
; CHECK: Size: 10
|
|
; CHECK: Globally Coherent: 0
|
|
; CHECK: Counter Direction: Increment
|
|
; CHECK: Class: UAV
|
|
; CHECK: Kind: Buffer
|
|
; CHECK: IsROV: 0
|
|
; CHECK: Element Type: f32
|
|
; CHECK: Element Count: 4
|
|
|
|
; RWBuffer<float4> Buf : register(u0, space5)
|
|
%uav3 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, ptr @Five.str)
|
|
call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 -1)
|
|
call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 1)
|
|
; CHECK: Resource [[UAV3:[0-9]+]]:
|
|
; CHECK: Name: Five
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 3
|
|
; CHECK: Space: 5
|
|
; CHECK: Lower Bound: 0
|
|
; CHECK: Size: 1
|
|
; CHECK: Globally Coherent: 0
|
|
; CHECK: Counter Direction: Invalid
|
|
; CHECK: Class: UAV
|
|
; CHECK: Kind: Buffer
|
|
; CHECK: IsROV: 0
|
|
; CHECK: Element Type: f32
|
|
; CHECK: Element Count: 4
|
|
|
|
%uav4 = call target("dx.TypedBuffer", double, 1, 0, 0)
|
|
@llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, ptr @Six.str)
|
|
; CHECK: Resource [[UAV4:[0-9]+]]:
|
|
; CHECK: Name: Six
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 4
|
|
; CHECK: Space: 5
|
|
; CHECK: Lower Bound: 0
|
|
; CHECK: Size: 1
|
|
; CHECK: Globally Coherent: 0
|
|
; CHECK: Counter Direction: Unknown
|
|
; CHECK: Class: UAV
|
|
; CHECK: Kind: Buffer
|
|
; CHECK: IsROV: 0
|
|
; CHECK: Element Type: f64 (stored as u32)
|
|
; CHECK: Element Count: 1
|
|
|
|
%cb0 = call target("dx.CBuffer", {float})
|
|
@llvm.dx.resource.handlefrombinding(i32 1, i32 0, i32 1, i32 0, ptr @CB.str)
|
|
; CHECK: Resource [[CB0:[0-9]+]]:
|
|
; CHECK: Name: CB
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 0
|
|
; CHECK: Space: 1
|
|
; CHECK: Lower Bound: 0
|
|
; CHECK: Size: 1
|
|
; CHECK: Class: CBV
|
|
; CHECK: Kind: CBuffer
|
|
; CHECK: CBuffer size: 4
|
|
|
|
%cb1 = call target("dx.CBuffer", <{ [2 x <{ float, target("dx.Padding", 12) }>], float }>)
|
|
@llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, ptr @Constants.str)
|
|
; CHECK: Resource [[CB1:[0-9]+]]:
|
|
; CHECK: Name: Constants
|
|
; CHECK: Binding:
|
|
; CHECK: Record ID: 1
|
|
; CHECK: Space: 1
|
|
; CHECK: Lower Bound: 8
|
|
; CHECK: Size: 1
|
|
; CHECK: Class: CBV
|
|
; CHECK: Kind: CBuffer
|
|
; CHECK: CBuffer size: 36
|
|
|
|
; CHECK-NOT: Resource {{[0-9]+}}:
|
|
|
|
ret void
|
|
}
|
|
|
|
; CHECK-DAG: Call bound to [[SRV0]]: %srv0 =
|
|
; CHECK-DAG: Call bound to [[SRV1]]: %srv1 =
|
|
; CHECK-DAG: Call bound to [[SRV2]]: %srv2 =
|
|
; CHECK-DAG: Call bound to [[UAV0]]: %uav0 =
|
|
; CHECK-DAG: Call bound to [[UAV1]]: %uav1 =
|
|
; CHECK-DAG: Call bound to [[UAV2]]: %uav2_1 =
|
|
; CHECK-DAG: Call bound to [[UAV2]]: %uav2_2 =
|
|
; CHECK-DAG: Call bound to [[UAV4]]: %uav4 =
|
|
; CHECK-DAG: Call bound to [[CB0]]: %cb0 =
|
|
; CHECK-DAG: Call bound to [[CB1]]: %cb1 =
|
|
|
|
attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) }
|