Skip to content

Commit 84d5ca1

Browse files
committed
address Helena
1 parent cc885d0 commit 84d5ca1

File tree

9 files changed

+44
-110
lines changed

9 files changed

+44
-110
lines changed

clang/lib/CodeGen/CGHLSLBuiltins.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,6 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
364364
QualType HandleTy = E->getArg(0)->getType();
365365
const HLSLAttributedResourceType *RT =
366366
HandleTy->getAs<HLSLAttributedResourceType>();
367-
assert(RT && "Expected a resource type as first parameter");
368367
assert(CGM.getTarget().getTriple().getArch() == llvm::Triple::dxil &&
369368
"Only DXIL currently implements load with status");
370369

clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ struct BuiltinTypeMethodBuilder {
202202
BuiltinTypeMethodBuilder &declareLocalVar(LocalVar &Var);
203203
template <typename... Ts>
204204
BuiltinTypeMethodBuilder &callBuiltin(StringRef BuiltinName,
205-
QualType ReturnType, Ts &&...ArgSpecs);
205+
QualType ReturnType, Ts... ArgSpecs);
206206
template <typename TLHS, typename TRHS>
207207
BuiltinTypeMethodBuilder &assign(TLHS LHS, TRHS RHS);
208208
template <typename T> BuiltinTypeMethodBuilder &dereference(T Ptr);
@@ -572,7 +572,7 @@ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::returnThis() {
572572
template <typename... Ts>
573573
BuiltinTypeMethodBuilder &
574574
BuiltinTypeMethodBuilder::callBuiltin(StringRef BuiltinName,
575-
QualType ReturnType, Ts &&...ArgSpecs) {
575+
QualType ReturnType, Ts... ArgSpecs) {
576576
ensureCompleteDecl();
577577

578578
std::array<Expr *, sizeof...(ArgSpecs)> Args{
@@ -1241,19 +1241,11 @@ BuiltinTypeDeclBuilder::addLoadWithStatusFunction(DeclarationName &Name,
12411241
using PH = BuiltinTypeMethodBuilder::PlaceHolder;
12421242

12431243
QualType ReturnTy = getHandleElementType();
1244-
BuiltinTypeMethodBuilder::LocalVar ResultVar("Result", ReturnTy);
1245-
BuiltinTypeMethodBuilder::LocalVar StatusVar("StatusBool", AST.BoolTy);
1246-
12471244
return BuiltinTypeMethodBuilder(*this, Name, ReturnTy, IsConst)
12481245
.addParam("Index", AST.UnsignedIntTy)
12491246
.addParam("Status", AST.UnsignedIntTy, HLSLParamModifierAttr::Keyword_out)
1250-
.declareLocalVar(ResultVar)
1251-
.declareLocalVar(StatusVar)
12521247
.callBuiltin("__builtin_hlsl_resource_load_with_status", ReturnTy,
1253-
PH::Handle, PH::_0, StatusVar)
1254-
.assign(ResultVar, PH::LastStmt)
1255-
.assign(PH::_1, StatusVar)
1256-
.returnValue(ResultVar)
1248+
PH::Handle, PH::_0, PH::_1)
12571249
.finalize();
12581250
}
12591251

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3016,7 +3016,8 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
30163016
CheckArgTypeMatches(&SemaRef, TheCall->getArg(1),
30173017
SemaRef.getASTContext().UnsignedIntTy) ||
30183018
CheckArgTypeMatches(&SemaRef, TheCall->getArg(2),
3019-
SemaRef.getASTContext().BoolTy))
3019+
SemaRef.getASTContext().UnsignedIntTy) ||
3020+
CheckModifiableLValue(&SemaRef, TheCall, 2))
30203021
return true;
30213022

30223023
auto *ResourceTy =

clang/test/AST/HLSL/StructuredBuffers-AST.hlsl

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,7 @@ RESOURCE<float> Buffer;
333333
// CHECK-LOAD-NEXT: ParmVarDecl {{.*}} Status 'unsigned int &__restrict'
334334
// CHECK-LOAD-NEXT: HLSLParamModifierAttr {{.*}} out
335335
// CHECK-LOAD-NEXT: CompoundStmt
336-
// CHECK-LOAD-NEXT: DeclStmt
337-
// CHECK-LOAD-NEXT: VarDecl {{.*}} Result 'element_type'
338-
// CHECK-LOAD-NEXT: DeclStmt
339-
// CHECK-LOAD-NEXT: VarDecl {{.*}} StatusBool 'bool'
340-
// CHECK-LOAD-NEXT: BinaryOperator {{.*}} 'element_type' '='
341-
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'element_type' lvalue Var {{.*}} 'Result' 'element_type'
336+
// CHECK-LOAD-NEXT: ReturnStmt
342337
// CHECK-LOAD-NEXT: CallExpr {{.*}} 'element_type'
343338
// CHECK-LOAD-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
344339
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_load_with_status' 'void (...) noexcept'
@@ -348,12 +343,7 @@ RESOURCE<float> Buffer;
348343
// CHECK-LOAD-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
349344
// CHECK-LOAD-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this
350345
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
351-
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'bool' lvalue Var {{.*}} 'StatusBool' 'bool'
352-
// CHECK-LOAD-NEXT: BinaryOperator {{.*}} 'unsigned int' '='
353346
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Status' 'unsigned int &__restrict'
354-
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'bool' lvalue Var {{.*}} 'StatusBool' 'bool'
355-
// CHECK-LOAD-NEXT: ReturnStmt
356-
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'element_type' lvalue Var {{.*}} 'Result' 'element_type'
357347
// CHECK-LOAD-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
358348

359349
// IncrementCounter method

clang/test/AST/HLSL/TypedBuffers-AST.hlsl

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,27 +220,17 @@ RESOURCE<float> Buffer;
220220
// CHECK-NEXT: ParmVarDecl {{.*}} Status 'unsigned int &__restrict'
221221
// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
222222
// CHECK-NEXT: CompoundStmt
223-
// CHECK-NEXT: DeclStmt
224-
// CHECK-NEXT: VarDecl {{.*}} Result 'element_type'
225-
// CHECK-NEXT: DeclStmt
226-
// CHECK-NEXT: VarDecl {{.*}} StatusBool 'bool'
227-
// CHECK-NEXT: BinaryOperator {{.*}} 'element_type' '='
228-
// CHECK-NEXT: DeclRefExpr {{.*}} 'element_type' lvalue Var {{.*}} 'Result' 'element_type'
223+
// CHECK-NEXT: ReturnStmt
229224
// CHECK-NEXT: CallExpr {{.*}} 'element_type'
230-
// CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
225+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'void (*)(...) noexcept' <BuiltinFnToFnPtr>
231226
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_load_with_status' 'void (...) noexcept'
232227
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
233228
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
234229
// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
235230
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
236231
// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this
237232
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
238-
// CHECK-NEXT: DeclRefExpr {{.*}} 'bool' lvalue Var {{.*}} 'StatusBool' 'bool'
239-
// CHECK-NEXT: BinaryOperator {{.*}} 'unsigned int' '='
240233
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Status' 'unsigned int &__restrict'
241-
// CHECK-NEXT: DeclRefExpr {{.*}} 'bool' lvalue Var {{.*}} 'StatusBool' 'bool'
242-
// CHECK-NEXT: ReturnStmt
243-
// CHECK-NEXT: DeclRefExpr {{.*}} 'element_type' lvalue Var {{.*}} 'Result' 'element_type'
244234
// CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
245235

246236
// GetDimensions method

clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-lib.hlsl

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -113,46 +113,34 @@ export float TestLoadWithStatus() {
113113
}
114114

115115
// CHECK: define noundef nofpclass(nan inf) float @TestLoadWithStatus()()
116-
// CHECK: call {{.*}} float @hlsl::RWStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @RWSB1, i32 noundef 1, ptr noalias noundef nonnull align 4 dereferenceable(4) %tmp)
117-
// CHECK: call {{.*}} float @hlsl::StructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @SB1, i32 noundef 2, ptr noalias noundef nonnull align 4 dereferenceable(4) %tmp1)
116+
// CHECK: call {{.*}} float @hlsl::RWStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @RWSB1, i32 noundef 1, ptr {{.*}} %tmp)
117+
// CHECK: call {{.*}} float @hlsl::StructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @SB1, i32 noundef 2, ptr {{.*}} %tmp1)
118118
// CHECK: add
119119
// CHECK: ret float
120120

121-
// CHECK: define {{.*}} float @hlsl::RWStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr noalias noundef nonnull align 4 dereferenceable(4) %Status)
121+
// CHECK: define {{.*}} float @hlsl::RWStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr {{.*}} %Status)
122122
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %{{.*}}, i32 0, i32 0
123123
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 0), ptr %__handle
124124
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
125+
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr
125126
// DXIL-NEXT: %[[STRUCT:.*]] = call { float, i1 } @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i32 %[[INDEX]], i32 0)
126127
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { float, i1 } %[[STRUCT]], 0
127128
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { float, i1 } %[[STRUCT]], 1
128129
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
129-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %StatusBool, align 4
130-
// CHECK-NEXT: store float %ld.value, ptr %Result, align 4
131-
// CHECK-NEXT: %[[STATUS_INT:.*]] = load i32, ptr %StatusBool, align 4
132-
// CHECK-NEXT: %[[LOADED_VALUE:.*]] = trunc i32 %[[STATUS_INT]] to i1
133-
// CHECK-NEXT: %[[ZEXT_VALUE:.*]] = zext i1 %[[LOADED_VALUE]] to i32
134-
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
135-
// CHECK-NEXT: store i32 %[[ZEXT_VALUE]], ptr %[[LOADED_STATUS_ADDR]], align 4
136-
// CHECK-NEXT: %[[RETURN_VALUE:.*]] = load float, ptr %Result, align 4
137-
// CHECK-NEXT: ret float %[[RETURN_VALUE]]
130+
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %[[LOADED_STATUS_ADDR]], align 4
131+
// CHECK-NEXT: ret float %[[VALUE]]
138132

139-
// CHECK: define {{.*}} float @hlsl::StructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr noalias noundef nonnull align 4 dereferenceable(4) %Status)
133+
// CHECK: define {{.*}} float @hlsl::StructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr {{.*}} %Status)
140134
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %{{.*}}, i32 0, i32 0
141135
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 0, 0), ptr %__handle
142136
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
137+
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
143138
// DXIL-NEXT: %[[STRUCT:.*]] = call { float, i1 } @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0) %[[HANDLE]], i32 %[[INDEX]], i32 0)
144139
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { float, i1 } %[[STRUCT]], 0
145140
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { float, i1 } %[[STRUCT]], 1
146141
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
147-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %StatusBool, align 4
148-
// CHECK-NEXT: store float %ld.value, ptr %Result, align 4
149-
// CHECK-NEXT: %[[STATUS_INT:.*]] = load i32, ptr %StatusBool, align 4
150-
// CHECK-NEXT: %[[LOADED_VALUE:.*]] = trunc i32 %[[STATUS_INT]] to i1
151-
// CHECK-NEXT: %[[ZEXT_VALUE:.*]] = zext i1 %[[LOADED_VALUE]] to i32
152-
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
153-
// CHECK-NEXT: store i32 %[[ZEXT_VALUE]], ptr %[[LOADED_STATUS_ADDR]], align 4
154-
// CHECK-NEXT: %[[RETURN_VALUE:.*]] = load float, ptr %Result, align 4
155-
// CHECK-NEXT: ret float %[[RETURN_VALUE]]
142+
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %[[LOADED_STATUS_ADDR]], align 4
143+
// CHECK-NEXT: ret float %[[VALUE]]
156144

157145
export uint TestGetDimensions() {
158146
uint dim1, dim2, dim3, stride1, stride2, stride3;

clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-ps.hlsl

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -73,45 +73,33 @@ export float TestLoadWithStatus() {
7373
}
7474

7575
// CHECK: define {{.*}} float @TestLoadWithStatus()()
76-
// CHECK: call {{.*}} float @hlsl::RasterizerOrderedStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @ROSB1, i32 noundef 10, ptr noalias noundef nonnull align 4 dereferenceable(4) %tmp)
77-
// CHECK: call {{.*}} <2 x i32> @hlsl::RasterizerOrderedStructuredBuffer<int vector[2]>::Load(unsigned int, unsigned int&)(ptr {{.*}} @ROSB2, i32 noundef 20, ptr noalias noundef nonnull align 4 dereferenceable(4) %tmp2)
76+
// CHECK: call {{.*}} float @hlsl::RasterizerOrderedStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @ROSB1, i32 noundef 10, ptr {{.*}} %tmp)
77+
// CHECK: call {{.*}} <2 x i32> @hlsl::RasterizerOrderedStructuredBuffer<int vector[2]>::Load(unsigned int, unsigned int&)(ptr {{.*}} @ROSB2, i32 noundef 20, ptr {{.*}} %tmp2)
7878
// CHECK: ret
7979

80-
// CHECK: define {{.*}} float @hlsl::RasterizerOrderedStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr noalias noundef nonnull align 4 dereferenceable(4) %Status)
80+
// CHECK: define {{.*}} float @hlsl::RasterizerOrderedStructuredBuffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr {{.*}} %Status)
8181
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RasterizerOrderedStructuredBuffer", ptr {{.*}}, i32 0, i32 0
8282
// CHECK-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 1), ptr %__handle
8383
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
84+
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
8485
// DXIL-NEXT: %[[STRUCT:.*]] = call { float, i1 } @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1) %[[HANDLE]], i32 %[[INDEX]], i32 0)
8586
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { float, i1 } %[[STRUCT]], 0
8687
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { float, i1 } %[[STRUCT]], 1
8788
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
88-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %StatusBool, align 4
89-
// CHECK-NEXT: store float %ld.value, ptr %Result, align 4
90-
// CHECK-NEXT: %[[STATUS_INT:.*]] = load i32, ptr %StatusBool, align 4
91-
// CHECK-NEXT: %[[LOADED_VALUE:.*]] = trunc i32 %[[STATUS_INT]] to i1
92-
// CHECK-NEXT: %[[ZEXT_VALUE:.*]] = zext i1 %[[LOADED_VALUE]] to i32
93-
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
94-
// CHECK-NEXT: store i32 %[[ZEXT_VALUE]], ptr %[[LOADED_STATUS_ADDR]], align 4
95-
// CHECK-NEXT: %[[RETURN_VALUE:.*]] = load float, ptr %Result, align 4
96-
// CHECK-NEXT: ret float %[[RETURN_VALUE]]
89+
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %[[LOADED_STATUS_ADDR]], align 4
90+
// CHECK-NEXT: ret float %[[VALUE]]
9791

98-
// CHECK: define {{.*}} <2 x i32> @hlsl::RasterizerOrderedStructuredBuffer<int vector[2]>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr noalias noundef nonnull align 4 dereferenceable(4) %Status)
92+
// CHECK: define {{.*}} <2 x i32> @hlsl::RasterizerOrderedStructuredBuffer<int vector[2]>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr {{.*}} %Status)
9993
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RasterizerOrderedStructuredBuffer.0", ptr {{.*}}, i32 0, i32 0
10094
// CHECK-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", <2 x i32>, 1, 1), ptr %__handle
10195
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
96+
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
10297
// DXIL-NEXT: %[[STRUCT:.*]] = call { <2 x i32>, i1 } @llvm.dx.resource.load.rawbuffer.v2i32.tdx.RawBuffer_v2i32_1_1t(target("dx.RawBuffer", <2 x i32>, 1, 1) %[[HANDLE]], i32 %[[INDEX]], i32 0)
10398
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { <2 x i32>, i1 } %[[STRUCT]], 0
10499
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { <2 x i32>, i1 } %[[STRUCT]], 1
105100
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
106-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %StatusBool, align 4
107-
// CHECK-NEXT: store <2 x i32> %ld.value, ptr %Result, align 8
108-
// CHECK-NEXT: %[[STATUS_INT:.*]] = load i32, ptr %StatusBool, align 4
109-
// CHECK-NEXT: %[[LOADED_VALUE:.*]] = trunc i32 %[[STATUS_INT]] to i1
110-
// CHECK-NEXT: %[[ZEXT_VALUE:.*]] = zext i1 %[[LOADED_VALUE]] to i32
111-
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
112-
// CHECK-NEXT: store i32 %[[ZEXT_VALUE]], ptr %[[LOADED_STATUS_ADDR]], align 4
113-
// CHECK-NEXT: %[[RETURN_VALUE:.*]] = load <2 x i32>, ptr %Result, align 8
114-
// CHECK-NEXT: ret <2 x i32> %[[RETURN_VALUE]]
101+
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %[[LOADED_STATUS_ADDR]], align 4
102+
// CHECK-NEXT: ret <2 x i32> %[[VALUE]]
115103

116104

117105
export uint TestGetDimensions() {

clang/test/CodeGenHLSL/resources/TypedBuffers-methods.hlsl

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -47,46 +47,34 @@ export float TestLoadWithStatus() {
4747
}
4848

4949
// CHECK: define noundef nofpclass(nan inf) float @TestLoadWithStatus()()
50-
// CHECK: call {{.*}} float @hlsl::Buffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @Buf, i32 noundef 1, ptr noalias noundef nonnull align 4 dereferenceable(4) %tmp)
51-
// CHECK: call {{.*}} <4 x i32> @hlsl::RWBuffer<unsigned int vector[4]>::Load(unsigned int, unsigned int&)(ptr {{.*}} @RWBuf, i32 noundef 2, ptr noalias noundef nonnull align 4 dereferenceable(4) %tmp1)
50+
// CHECK: call {{.*}} float @hlsl::Buffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} @Buf, i32 noundef 1, ptr {{.*}} %tmp)
51+
// CHECK: call {{.*}} <4 x i32> @hlsl::RWBuffer<unsigned int vector[4]>::Load(unsigned int, unsigned int&)(ptr {{.*}} @RWBuf, i32 noundef 2, ptr {{.*}} %tmp1)
5252
// CHECK: add
5353
// CHECK: ret float
5454

55-
// CHECK: define {{.*}} float @hlsl::Buffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr noalias noundef nonnull align 4 dereferenceable(4) %Status)
55+
// CHECK: define {{.*}} float @hlsl::Buffer<float>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr {{.*}} %Status)
5656
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::Buffer", ptr %{{.*}}, i32 0, i32 0
5757
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.TypedBuffer", float, 0, 0, 0), ptr %__handle
5858
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
59+
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr
5960
// DXIL-NEXT: %[[STRUCT:.*]] = call { float, i1 } @llvm.dx.resource.load.typedbuffer.f32.tdx.TypedBuffer_f32_0_0_0t(target("dx.TypedBuffer", float, 0, 0, 0) %[[HANDLE]], i32 %[[INDEX]])
6061
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { float, i1 } %[[STRUCT]], 0
6162
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { float, i1 } %[[STRUCT]], 1
6263
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
63-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %StatusBool, align 4
64-
// CHECK-NEXT: store float %ld.value, ptr %Result, align 4
65-
// CHECK-NEXT: %[[STATUS_INT:.*]] = load i32, ptr %StatusBool, align 4
66-
// CHECK-NEXT: %[[LOADED_VALUE:.*]] = trunc i32 %[[STATUS_INT]] to i1
67-
// CHECK-NEXT: %[[ZEXT_VALUE:.*]] = zext i1 %[[LOADED_VALUE]] to i32
68-
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
69-
// CHECK-NEXT: store i32 %[[ZEXT_VALUE]], ptr %[[LOADED_STATUS_ADDR]], align 4
70-
// CHECK-NEXT: %[[RETURN_VALUE:.*]] = load float, ptr %Result, align 4
71-
// CHECK-NEXT: ret float %[[RETURN_VALUE]]
72-
73-
// CHECK: define {{.*}} <4 x i32> @hlsl::RWBuffer<unsigned int vector[4]>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr noalias noundef nonnull align 4 dereferenceable(4) %Status)
64+
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %[[LOADED_STATUS_ADDR]], align 4
65+
// CHECK-NEXT: ret float %[[VALUE]]
66+
67+
// CHECK: define {{.*}} <4 x i32> @hlsl::RWBuffer<unsigned int vector[4]>::Load(unsigned int, unsigned int&)(ptr {{.*}} %this, i32 noundef %Index, ptr {{.*}} %Status)
7468
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %{{.*}}, i32 0, i32 0
7569
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.TypedBuffer", <4 x i32>, 1, 0, 0), ptr %__handle
7670
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
71+
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr
7772
// DXIL-NEXT: %[[STRUCT:.*]] = call { <4 x i32>, i1 } @llvm.dx.resource.load.typedbuffer.v4i32.tdx.TypedBuffer_v4i32_1_0_0t(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %[[HANDLE]], i32 %[[INDEX]])
7873
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { <4 x i32>, i1 } %[[STRUCT]], 0
7974
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { <4 x i32>, i1 } %[[STRUCT]], 1
8075
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
81-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %StatusBool, align 4
82-
// CHECK-NEXT: store <4 x i32> %ld.value, ptr %Result, align 16
83-
// CHECK-NEXT: %[[STATUS_INT:.*]] = load i32, ptr %StatusBool, align 4
84-
// CHECK-NEXT: %[[LOADED_VALUE:.*]] = trunc i32 %[[STATUS_INT]] to i1
85-
// CHECK-NEXT: %[[ZEXT_VALUE:.*]] = zext i1 %[[LOADED_VALUE]] to i32
86-
// CHECK-NEXT: %[[LOADED_STATUS_ADDR:.*]] = load ptr, ptr %Status.addr, align 4
87-
// CHECK-NEXT: store i32 %[[ZEXT_VALUE]], ptr %[[LOADED_STATUS_ADDR]], align 4
88-
// CHECK-NEXT: %[[RETURN_VALUE:.*]] = load <4 x i32>, ptr %Result, align 16
89-
// CHECK-NEXT: ret <4 x i32> %[[RETURN_VALUE]]
76+
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %[[LOADED_STATUS_ADDR]], align 4
77+
// CHECK-NEXT: ret <4 x i32> %[[VALUE]]
9078

9179
export uint TestGetDimensions() {
9280
uint dim1, dim2;

0 commit comments

Comments
 (0)