Skip to content

Commit 6d4f8b1

Browse files
s-perronhekota
andauthored
[HLSL] Fix resource wrapper declaration (#129100)
The resource wrapper should have internal linkage because it contains a handle to the global resource, and it not the actual global. Makeing this changed exposed that we were zeroinitializing the resouce, which is a problem. The handle cannot be zeroinitialized. This is changed to use poison instead. Fixes #122767. --------- Co-authored-by: Helena Kotas <[email protected]>
1 parent e49180d commit 6d4f8b1

File tree

11 files changed

+86
-78
lines changed

11 files changed

+86
-78
lines changed

clang/include/clang/AST/Type.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2661,6 +2661,7 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
26612661
bool isHLSLSpecificType() const; // Any HLSL specific type
26622662
bool isHLSLBuiltinIntangibleType() const; // Any HLSL builtin intangible type
26632663
bool isHLSLAttributedResourceType() const;
2664+
bool isHLSLResourceRecord() const;
26642665
bool isHLSLIntangibleType()
26652666
const; // Any HLSL intangible type (builtin, array, class)
26662667

clang/lib/AST/Type.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5114,6 +5114,10 @@ bool Type::hasSizedVLAType() const {
51145114
return false;
51155115
}
51165116

5117+
bool Type::isHLSLResourceRecord() const {
5118+
return HLSLAttributedResourceType::findHandleTypeOnResource(this) != nullptr;
5119+
}
5120+
51175121
bool Type::isHLSLIntangibleType() const {
51185122
const Type *Ty = getUnqualifiedDesugaredType();
51195123

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,11 @@ llvm::Triple::ArchType CGHLSLRuntime::getArch() {
8585
return CGM.getTarget().getTriple().getArch();
8686
}
8787

88-
// Returns true if the type is an HLSL resource class
89-
static bool isResourceRecordType(const clang::Type *Ty) {
90-
return HLSLAttributedResourceType::findHandleTypeOnResource(Ty) != nullptr;
91-
}
92-
9388
// Returns true if the type is an HLSL resource class or an array of them
9489
static bool isResourceRecordTypeOrArrayOf(const clang::Type *Ty) {
9590
while (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty))
9691
Ty = CAT->getArrayElementTypeNoTypeQual();
97-
return isResourceRecordType(Ty);
92+
return Ty->isHLSLResourceRecord();
9893
}
9994

10095
// Emits constant global variables for buffer constants declarations
@@ -658,7 +653,7 @@ void CGHLSLRuntime::handleGlobalVarDefinition(const VarDecl *VD,
658653
// on?
659654
return;
660655

661-
if (!isResourceRecordType(VD->getType().getTypePtr()))
656+
if (!VD->getType().getTypePtr()->isHLSLResourceRecord())
662657
// FIXME: Only simple declarations of resources are supported for now.
663658
// Arrays of resources or resources in user defined classes are
664659
// not implemented yet.

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5595,7 +5595,11 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
55955595
if (D->getType()->isReferenceType())
55965596
T = D->getType();
55975597

5598-
if (getLangOpts().CPlusPlus) {
5598+
if (getLangOpts().HLSL &&
5599+
D->getType().getTypePtr()->isHLSLResourceRecord()) {
5600+
Init = llvm::PoisonValue::get(getTypes().ConvertType(ASTTy));
5601+
NeedsGlobalCtor = true;
5602+
} else if (getLangOpts().CPlusPlus) {
55995603
Init = EmitNullConstant(T);
56005604
if (!IsDefinitionAvailableExternally)
56015605
NeedsGlobalCtor = true;

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3065,6 +3065,16 @@ void SemaHLSL::ActOnVariableDeclarator(VarDecl *VD) {
30653065
if (VD->getType()->isHLSLIntangibleType())
30663066
collectResourceBindingsOnVarDecl(VD);
30673067

3068+
const Type *VarType = VD->getType().getTypePtr();
3069+
while (VarType->isArrayType())
3070+
VarType = VarType->getArrayElementTypeNoTypeQual();
3071+
if (VarType->isHLSLResourceRecord()) {
3072+
// Make the variable for resources static. The global externally visible
3073+
// storage is accessed through the handle, which is a member. The variable
3074+
// itself is not externally visible.
3075+
VD->setStorageClass(StorageClass::SC_Static);
3076+
}
3077+
30683078
// process explicit bindings
30693079
processExplicitBindingsOnDecl(VD);
30703080
}

clang/test/AST/HLSL/cbuffer.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ cbuffer CB {
159159
static float SV;
160160
// CHECK: VarDecl {{.*}} s7 'EmptyStruct' callinit
161161
EmptyStruct s7;
162-
// CHECK: VarDecl {{.*}} Buf 'RWBuffer<float>':'hlsl::RWBuffer<float>' callinit
162+
// CHECK: VarDecl {{.*}} Buf 'RWBuffer<float>':'hlsl::RWBuffer<float>' static callinit
163163
RWBuffer<float> Buf;
164164
// CHECK: VarDecl {{.*}} ea 'EmptyArrayTypedef':'float[10][0]'
165165
EmptyArrayTypedef ea;

clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@ RasterizerOrderedByteAddressBuffer Buffer2: register(u3, space4);
1111
// CHECK: "class.hlsl::RWByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 0) }
1212
// CHECK: "class.hlsl::RasterizerOrderedByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 1) }
1313

14-
// CHECK: @Buffer0 = global %"class.hlsl::ByteAddressBuffer" zeroinitializer, align 4
15-
// CHECK: @Buffer1 = global %"class.hlsl::RWByteAddressBuffer" zeroinitializer, align 4
16-
// CHECK: @Buffer2 = global %"class.hlsl::RasterizerOrderedByteAddressBuffer" zeroinitializer, align 4
14+
// CHECK: @_ZL7Buffer0 = internal global %"class.hlsl::ByteAddressBuffer" poison, align 4
15+
// CHECK: @_ZL7Buffer1 = internal global %"class.hlsl::RWByteAddressBuffer" poison, align 4
16+
// CHECK: @_ZL7Buffer2 = internal global %"class.hlsl::RasterizerOrderedByteAddressBuffer" poison, align 4
1717

1818
// CHECK; define internal void @_init_resource_Buffer0()
19-
// CHECK-DXIL: %Buffer0_h = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false)
20-
// CHECK-DXIL: store target("dx.RawBuffer", i8, 0, 0) %Buffer0_h, ptr @Buffer0, align 4
19+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false)
20+
// CHECK-DXIL: store target("dx.RawBuffer", i8, 0, 0) [[H]], ptr @_ZL7Buffer0, align 4
2121

2222
// CHECK; define internal void @_init_resource_Buffer1()
23-
// CHECK-DXIL: %Buffer1_h = call target("dx.RawBuffer", i8, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_0t(i32 2, i32 1, i32 1, i32 0, i1 false)
24-
// CHECK-DXIL: store target("dx.RawBuffer", i8, 1, 0) %Buffer1_h, ptr @Buffer1, align 4
23+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", i8, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_0t(i32 2, i32 1, i32 1, i32 0, i1 false)
24+
// CHECK-DXIL: store target("dx.RawBuffer", i8, 1, 0) [[H]], ptr @_ZL7Buffer1, align 4
2525

2626
// CHECK; define internal void @_init_resource_Buffer2()
27-
// CHECK-DXIL: %Buffer2_h = call target("dx.RawBuffer", i8, 1, 1) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_1t(i32 4, i32 3, i32 1, i32 0, i1 false)
28-
// CHECK-DXIL: store target("dx.RawBuffer", i8, 1, 1) %Buffer2_h, ptr @Buffer2, align 4
27+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", i8, 1, 1) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_1_1t(i32 4, i32 3, i32 1, i32 0, i1 false)
28+
// CHECK-DXIL: store target("dx.RawBuffer", i8, 1, 1) [[H]], ptr @_ZL7Buffer2, align 4
2929

3030
// CHECK: define internal void @_GLOBAL__sub_I_ByteAddressBuffers_constructors.hlsl()
3131
// CHECK: entry:
32-
// CHECK: call void @_init_resource_Buffer0()
33-
// CHECK: call void @_init_resource_Buffer1()
34-
// CHECK: call void @_init_resource_Buffer2()
32+
// CHECK: call void @_init_resource__ZL7Buffer0()
33+
// CHECK: call void @_init_resource__ZL7Buffer1()
34+
// CHECK: call void @_init_resource__ZL7Buffer2()
Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
1-
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -O3 -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-DXIL
2-
// RUN: %clang_cc1 -triple spirv-vulkan-compute -x hlsl -emit-llvm -O3 -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-SPIRV
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -O3 -o - %s | FileCheck %s
2+
// RUN: %clang_cc1 -triple spirv-vulkan-compute -x hlsl -emit-llvm -O3 -o - %s | FileCheck %s
33

4-
// CHECK-SPIRV: %"class.hlsl::RWBuffer" = type { target("spirv.Image", float, 5, 2, 0, 0, 2, 0) }
5-
// CHECK-DXIL: %"class.hlsl::RWBuffer" = type { target("dx.TypedBuffer", float, 1, 0, 0) }
4+
// All referenced to an unused resource should be removed by optimizations.
65
RWBuffer<float> Buf : register(u5, space3);
76

87
[shader("compute")]
98
[numthreads(1, 1, 1)]
109
void main() {
10+
// CHECK-NOT: resource.handlefrombinding
1111
// CHECK: define void @main()
1212
// CHECK-NEXT: entry:
13-
14-
// CHECK-SPIRV-NEXT: %[[HANDLE:.*]] = tail call target("spirv.Image", float, 5, 2, 0, 0, 2, 0) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
15-
// CHECK-SPIRV-NEXT: store target("spirv.Image", float, 5, 2, 0, 0, 2, 0) %[[HANDLE:.*]], ptr @Buf, align 8
16-
17-
// CHECK-DXIL-NEXT: %[[HANDLE:.*]] = tail call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
18-
// CHECK-DXIL-NEXT: store target("dx.TypedBuffer", float, 1, 0, 0) %[[HANDLE]], ptr @Buf, align 4
19-
2013
// CHECK-NEXT: ret void
14+
// CHECK-NOT: resource.handlefrombinding
2115
}

clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
RWBuffer<float> Buf : register(u5, space3);
88

99
// CHECK: %"class.hlsl::RWBuffer" = type { target("dx.TypedBuffer", float, 1, 0, 0) }
10-
// CHECK: @Buf = global %"class.hlsl::RWBuffer" zeroinitializer, align 4
10+
// CHECK: @_ZL3Buf = internal global %"class.hlsl::RWBuffer" poison, align 4
1111

12-
// CHECK: define internal void @_init_resource_Buf()
13-
// CHECK-DXIL: %Buf_h = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
14-
// CHECK-DXIL: store target("dx.TypedBuffer", float, 1, 0, 0) %Buf_h, ptr @Buf, align 4
12+
// CHECK: define internal void @_init_resource__ZL3Buf()
13+
// CHECK-DXIL: [[H:%.*]] = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
14+
// CHECK-DXIL: store target("dx.TypedBuffer", float, 1, 0, 0) [[H]], ptr @_ZL3Buf, align 4
1515

1616
// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
1717
// CHECK-NEXT: entry:
1818

1919
// CHECK: define internal void @_GLOBAL__sub_I_RWBuffer_constructor.hlsl()
20-
// CHECK: call void @_init_resource_Buf()
20+
// CHECK: call void @_init_resource__ZL3Buf()

clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,31 @@ RasterizerOrderedStructuredBuffer<float> Buf5 : register(u1, space2);
1515
// CHECK: %"class.hlsl::ConsumeStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0) }
1616
// CHECK: %"class.hlsl::RasterizerOrderedStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 1) }
1717

18-
// CHECK: @Buf = global %"class.hlsl::StructuredBuffer" zeroinitializer, align 4
19-
// CHECK: @Buf2 = global %"class.hlsl::RWStructuredBuffer" zeroinitializer, align 4
20-
// CHECK: @Buf3 = global %"class.hlsl::AppendStructuredBuffer" zeroinitializer, align 4
21-
// CHECK: @Buf4 = global %"class.hlsl::ConsumeStructuredBuffer" zeroinitializer, align 4
22-
// CHECK: @Buf5 = global %"class.hlsl::RasterizerOrderedStructuredBuffer" zeroinitializer, align 4
18+
// CHECK: @_ZL3Buf = internal global %"class.hlsl::StructuredBuffer" poison, align 4
19+
// CHECK: @_ZL4Buf2 = internal global %"class.hlsl::RWStructuredBuffer" poison, align 4
20+
// CHECK: @_ZL4Buf3 = internal global %"class.hlsl::AppendStructuredBuffer" poison, align 4
21+
// CHECK: @_ZL4Buf4 = internal global %"class.hlsl::ConsumeStructuredBuffer" poison, align 4
22+
// CHECK: @_ZL4Buf5 = internal global %"class.hlsl::RasterizerOrderedStructuredBuffer" poison, align 4
2323

24-
// CHECK: define internal void @_init_resource_Buf()
25-
// CHECK-DXIL: %Buf_h = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 10, i32 1, i32 0, i1 false)
26-
// CHECK-DXIL: store target("dx.RawBuffer", float, 0, 0) %Buf_h, ptr @Buf, align 4
24+
// CHECK: define internal void @_init_resource__ZL3Buf()
25+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 10, i32 1, i32 0, i1 false)
26+
// CHECK-DXIL: store target("dx.RawBuffer", float, 0, 0) [[H]], ptr @_ZL3Buf, align 4
2727

28-
// CHECK: define internal void @_init_resource_Buf2()
29-
// CHECK-DXIL: %Buf2_h = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 1, i32 5, i32 1, i32 0, i1 false)
30-
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 0) %Buf2_h, ptr @Buf2, align 4
28+
// CHECK: define internal void @_init_resource__ZL4Buf2()
29+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 1, i32 5, i32 1, i32 0, i1 false)
30+
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 0) [[H]], ptr @_ZL4Buf2, align 4
3131

32-
// CHECK: define internal void @_init_resource_Buf3()
33-
// CHECK-DXIL: %Buf3_h = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 0, i32 3, i32 1, i32 0, i1 false)
34-
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 0) %Buf3_h, ptr @Buf3, align 4
32+
// CHECK: define internal void @_init_resource__ZL4Buf3()
33+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 0, i32 3, i32 1, i32 0, i1 false)
34+
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 0) [[H]], ptr @_ZL4Buf3, align 4
3535

36-
// CHECK: define internal void @_init_resource_Buf4()
37-
// CHECK-DXIL: %Buf4_h = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 0, i32 4, i32 1, i32 0, i1 false)
38-
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 0) %Buf4_h, ptr @Buf4, align 4
36+
// CHECK: define internal void @_init_resource__ZL4Buf4()
37+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0t(i32 0, i32 4, i32 1, i32 0, i1 false)
38+
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 0) [[H]], ptr @_ZL4Buf4, align 4
3939

40-
// CHECK: define internal void @_init_resource_Buf5()
41-
// CHECK-DXIL: %Buf5_h = call target("dx.RawBuffer", float, 1, 1) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_1t(i32 2, i32 1, i32 1, i32 0, i1 false)
42-
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 1) %Buf5_h, ptr @Buf5, align 4
40+
// CHECK: define internal void @_init_resource__ZL4Buf5()
41+
// CHECK-DXIL: [[H:%.*]] = call target("dx.RawBuffer", float, 1, 1) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_1t(i32 2, i32 1, i32 1, i32 0, i1 false)
42+
// CHECK-DXIL: store target("dx.RawBuffer", float, 1, 1) [[H]], ptr @_ZL4Buf5, align 4
4343

4444
// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %this)
4545
// CHECK-NEXT: entry:
@@ -52,8 +52,8 @@ RasterizerOrderedStructuredBuffer<float> Buf5 : register(u1, space2);
5252
// CHECK-NEXT: entry:
5353

5454
// CHECK: define internal void @_GLOBAL__sub_I_StructuredBuffers_constructors.hlsl()
55-
// CHECK: call void @_init_resource_Buf()
56-
// CHECK: call void @_init_resource_Buf2()
57-
// CHECK: call void @_init_resource_Buf3()
58-
// CHECK: call void @_init_resource_Buf4()
59-
// CHECK: call void @_init_resource_Buf5()
55+
// CHECK: call void @_init_resource__ZL3Buf()
56+
// CHECK: call void @_init_resource__ZL4Buf2()
57+
// CHECK: call void @_init_resource__ZL4Buf3()
58+
// CHECK: call void @_init_resource__ZL4Buf4()
59+
// CHECK: call void @_init_resource__ZL4Buf5()
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
// RUN: %clang_cc1 -triple dxil--shadermodel6.6-compute -x hlsl -finclude-default-header -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
22

3-
// CHECK: define internal void @_init_resource_U0S0()
4-
// CHECK: %U0S0_h = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false)
5-
// CHECK: store target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %U0S0_h, ptr @U0S0, align 4
3+
// CHECK: define internal void @_init_resource__ZL4U0S0()
4+
// CHECK: [[H:%.*]] = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false)
5+
// CHECK: store target("dx.TypedBuffer", <4 x float>, 1, 0, 0) [[H]], ptr @_ZL4U0S0, align 4
66
RWBuffer<float4> U0S0 : register(u0);
77

8-
// CHECK: define internal void @_init_resource_U5S3()
9-
// CHECK: %U5S3_h = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
10-
// CHECK: store target("dx.TypedBuffer", float, 1, 0, 0) %U5S3_h, ptr @U5S3, align 4
8+
// CHECK: define internal void @_init_resource__ZL4U5S3()
9+
// CHECK: [[H:%.*]] = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
10+
// CHECK: store target("dx.TypedBuffer", float, 1, 0, 0) [[H]], ptr @_ZL4U5S3, align 4
1111
RWBuffer<float> U5S3 : register(u5, space3);
1212

13-
// CHECK: define internal void @_init_resource_T2S2()
14-
// CHECK: %T2S2_h = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_0_0t(i32 2, i32 2, i32 1, i32 0, i1 false)
15-
// CHECK: store target("dx.RawBuffer", i32, 0, 0) %T2S2_h, ptr @T2S2, align 4
13+
// CHECK: define internal void @_init_resource__ZL4T2S2()
14+
// CHECK: [[H:%.*]] = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_0_0t(i32 2, i32 2, i32 1, i32 0, i1 false)
15+
// CHECK: store target("dx.RawBuffer", i32, 0, 0) [[H]], ptr @_ZL4T2S2, align 4
1616
StructuredBuffer<int> T2S2 : register(t2, space2);
1717
struct S {
1818
float4 f;
1919
int i;
2020
};
2121

22-
// CHECK: define internal void @_init_resource_T3S0()
23-
// CHECK: %T3S0_h = call target("dx.RawBuffer", %struct.S, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_s_struct.Ss_0_0t(i32 0, i32 3, i32 1, i32 0, i1 false)
24-
// CHECK: store target("dx.RawBuffer", %struct.S, 0, 0) %T3S0_h, ptr @T3S0, align 4
22+
// CHECK: define internal void @_init_resource__ZL4T3S0()
23+
// CHECK: [[H:%.*]] = call target("dx.RawBuffer", %struct.S, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_s_struct.Ss_0_0t(i32 0, i32 3, i32 1, i32 0, i1 false)
24+
// CHECK: store target("dx.RawBuffer", %struct.S, 0, 0) [[H]], ptr @_ZL4T3S0, align 4
2525
StructuredBuffer<S> T3S0 : register(t3);
2626

2727
// CHECK: define void @main()
28-
// CHECK: call void @_init_resource_U0S0()
29-
// CHECK: call void @_init_resource_U5S3()
30-
// CHECK: call void @_init_resource_T2S2()
31-
// CHECK: call void @_init_resource_T3S0()
28+
// CHECK: call void @_init_resource__ZL4U0S0()
29+
// CHECK: call void @_init_resource__ZL4U5S3()
30+
// CHECK: call void @_init_resource__ZL4T2S2()
31+
// CHECK: call void @_init_resource__ZL4T3S0()
3232

3333
[numthreads(4,1,1)]
3434
void main() {}

0 commit comments

Comments
 (0)