201 lines · plain
1; RUN: opt -S -disable-output -passes="print<dxil-resources>" < %s 2>&1 | FileCheck %s2 3@G = external constant <4 x float>, align 44 5@Zero.str = private unnamed_addr constant [5 x i8] c"Zero\00", align 16@One.str = private unnamed_addr constant [4 x i8] c"One\00", align 17@Two.str = private unnamed_addr constant [4 x i8] c"Two\00", align 18@Three.str = private unnamed_addr constant [6 x i8] c"Three\00", align 19@Four.str = private unnamed_addr constant [5 x i8] c"Four\00", align 110@Array.str = private unnamed_addr constant [6 x i8] c"Array\00", align 111@Five.str = private unnamed_addr constant [5 x i8] c"Five\00", align 112@Six.str = private unnamed_addr constant [4 x i8] c"Six\00", align 113@CB.str = private unnamed_addr constant [3 x i8] c"CB\00", align 114@Constants.str = private unnamed_addr constant [10 x i8] c"Constants\00", align 115 16define void @test_typedbuffer() {17 ; ByteAddressBuffer Buf : register(t8, space1)18 %srv0 = call target("dx.RawBuffer", void, 0, 0)19 @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, ptr @Zero.str)20 ; CHECK: Resource [[SRV0:[0-9]+]]:21 ; CHECK: Name: Zero22 ; CHECK: Binding:23 ; CHECK: Record ID: 024 ; CHECK: Space: 125 ; CHECK: Lower Bound: 826 ; CHECK: Size: 127 ; CHECK: Class: SRV28 ; CHECK: Kind: RawBuffer29 30 ; struct S { float4 a; uint4 b; };31 ; StructuredBuffer<S> Buf : register(t2, space4)32 %srv1 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0)33 @llvm.dx.resource.handlefrombinding(i32 4, i32 2, i32 1, i32 0, ptr @One.str)34 ; CHECK: Resource [[SRV1:[0-9]+]]:35 ; CHECK: Name: One36 ; CHECK: Binding:37 ; CHECK: Record ID: 138 ; CHECK: Space: 439 ; CHECK: Lower Bound: 240 ; CHECK: Size: 141 ; CHECK: Class: SRV42 ; CHECK: Kind: StructuredBuffer43 ; CHECK: Buffer Stride: 3244 ; CHECK: Alignment: 445 46 ; Buffer<uint4> Buf[24] : register(t3, space5)47 %srv2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0)48 @llvm.dx.resource.handlefrombinding(i32 5, i32 3, i32 24, i32 0, ptr @Two.str)49 ; CHECK: Resource [[SRV2:[0-9]+]]:50 ; CHECK: Name: Two51 ; CHECK: Binding:52 ; CHECK: Record ID: 253 ; CHECK: Space: 554 ; CHECK: Lower Bound: 355 ; CHECK: Size: 2456 ; CHECK: Class: SRV57 ; CHECK: Kind: Buffer58 ; CHECK: Element Type: u3259 ; CHECK: Element Count: 460 61 ; RWBuffer<int> Buf : register(u7, space2)62 %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1)63 @llvm.dx.resource.handlefrombinding(i32 2, i32 7, i32 1, i32 0, ptr @Three.str)64 ; CHECK: Resource [[UAV0:[0-9]+]]:65 ; CHECK: Name: Three66 ; CHECK: Binding:67 ; CHECK: Record ID: 068 ; CHECK: Space: 269 ; CHECK: Lower Bound: 770 ; CHECK: Size: 171 ; CHECK: Globally Coherent: 072 ; CHECK: Counter Direction: Unknown73 ; CHECK: Class: UAV74 ; CHECK: Kind: Buffer75 ; CHECK: IsROV: 076 ; CHECK: Element Type: i3277 ; CHECK: Element Count: 178 79 ; RWBuffer<float4> Buf : register(u5, space3)80 %uav1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)81 @llvm.dx.resource.handlefrombinding(i32 3, i32 5, i32 1, i32 0, ptr @Four.str)82 call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav1, i8 -1)83 ; CHECK: Resource [[UAV1:[0-9]+]]:84 ; CHECK: Name: Four85 ; CHECK: Binding:86 ; CHECK: Record ID: 187 ; CHECK: Space: 388 ; CHECK: Lower Bound: 589 ; CHECK: Size: 190 ; CHECK: Globally Coherent: 091 ; CHECK: Counter Direction: Decrement92 ; CHECK: Class: UAV93 ; CHECK: Kind: Buffer94 ; CHECK: IsROV: 095 ; CHECK: Element Type: f3296 ; CHECK: Element Count: 497 98 ; RWBuffer<float4> BufferArray[10] : register(u0, space4)99 ; RWBuffer<float4> Buf = BufferArray[0]100 %uav2_1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)101 @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 0, ptr @Array.str)102 ; RWBuffer<float4> Buf = BufferArray[5]103 %uav2_2 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)104 @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 5, ptr @Array.str)105 call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav2_2, i8 1)106 ; CHECK: Resource [[UAV2:[0-9]+]]:107 ; CHECK: Name: Array108 ; CHECK: Binding:109 ; CHECK: Record ID: 2110 ; CHECK: Space: 4111 ; CHECK: Lower Bound: 0112 ; CHECK: Size: 10113 ; CHECK: Globally Coherent: 0114 ; CHECK: Counter Direction: Increment115 ; CHECK: Class: UAV116 ; CHECK: Kind: Buffer117 ; CHECK: IsROV: 0118 ; CHECK: Element Type: f32119 ; CHECK: Element Count: 4120 121 ; RWBuffer<float4> Buf : register(u0, space5)122 %uav3 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)123 @llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, ptr @Five.str)124 call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 -1)125 call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 1)126 ; CHECK: Resource [[UAV3:[0-9]+]]:127 ; CHECK: Name: Five128 ; CHECK: Binding:129 ; CHECK: Record ID: 3130 ; CHECK: Space: 5131 ; CHECK: Lower Bound: 0132 ; CHECK: Size: 1133 ; CHECK: Globally Coherent: 0134 ; CHECK: Counter Direction: Invalid135 ; CHECK: Class: UAV136 ; CHECK: Kind: Buffer137 ; CHECK: IsROV: 0138 ; CHECK: Element Type: f32139 ; CHECK: Element Count: 4140 141 %uav4 = call target("dx.TypedBuffer", double, 1, 0, 0) 142 @llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, ptr @Six.str)143 ; CHECK: Resource [[UAV4:[0-9]+]]:144 ; CHECK: Name: Six145 ; CHECK: Binding:146 ; CHECK: Record ID: 4147 ; CHECK: Space: 5148 ; CHECK: Lower Bound: 0149 ; CHECK: Size: 1150 ; CHECK: Globally Coherent: 0151 ; CHECK: Counter Direction: Unknown152 ; CHECK: Class: UAV153 ; CHECK: Kind: Buffer154 ; CHECK: IsROV: 0155 ; CHECK: Element Type: f64 (stored as u32)156 ; CHECK: Element Count: 1157 158 %cb0 = call target("dx.CBuffer", {float})159 @llvm.dx.resource.handlefrombinding(i32 1, i32 0, i32 1, i32 0, ptr @CB.str)160 ; CHECK: Resource [[CB0:[0-9]+]]:161 ; CHECK: Name: CB162 ; CHECK: Binding:163 ; CHECK: Record ID: 0164 ; CHECK: Space: 1165 ; CHECK: Lower Bound: 0166 ; CHECK: Size: 1167 ; CHECK: Class: CBV168 ; CHECK: Kind: CBuffer169 ; CHECK: CBuffer size: 4170 171 %cb1 = call target("dx.CBuffer", <{ [2 x <{ float, target("dx.Padding", 12) }>], float }>)172 @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, ptr @Constants.str)173 ; CHECK: Resource [[CB1:[0-9]+]]:174 ; CHECK: Name: Constants175 ; CHECK: Binding:176 ; CHECK: Record ID: 1177 ; CHECK: Space: 1178 ; CHECK: Lower Bound: 8179 ; CHECK: Size: 1180 ; CHECK: Class: CBV181 ; CHECK: Kind: CBuffer182 ; CHECK: CBuffer size: 36183 184 ; CHECK-NOT: Resource {{[0-9]+}}:185 186 ret void187}188 189; CHECK-DAG: Call bound to [[SRV0]]: %srv0 =190; CHECK-DAG: Call bound to [[SRV1]]: %srv1 =191; CHECK-DAG: Call bound to [[SRV2]]: %srv2 =192; CHECK-DAG: Call bound to [[UAV0]]: %uav0 =193; CHECK-DAG: Call bound to [[UAV1]]: %uav1 =194; CHECK-DAG: Call bound to [[UAV2]]: %uav2_1 =195; CHECK-DAG: Call bound to [[UAV2]]: %uav2_2 =196; CHECK-DAG: Call bound to [[UAV4]]: %uav4 =197; CHECK-DAG: Call bound to [[CB0]]: %cb0 =198; CHECK-DAG: Call bound to [[CB1]]: %cb1 =199 200attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) }201