[clang] [llvm] [HLSL] Implement Texture2D::operator[] (PR #186110)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 12 05:49:31 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-directx
Author: Steven Perron (s-perron)
<details>
<summary>Changes</summary>
Implments the Texture2D::operator[] method. It uses the same design as
Buffer::operator[]. However, this requires us to chagne the
resource_getpointer intrinsic to accept integer vectors for the index.
Assisted-by: Gemini
---
Patch is 75.63 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/186110.diff
24 Files Affected:
- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+3)
- (modified) clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp (+21-7)
- (modified) clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h (+2-1)
- (modified) clang/lib/Sema/HLSLExternalSemaSource.cpp (+7-6)
- (modified) clang/lib/Sema/SemaHLSL.cpp (+40-4)
- (modified) clang/test/AST/HLSL/Texture2D-scalar-AST.hlsl (+17)
- (modified) clang/test/AST/HLSL/Texture2D-vector-AST.hlsl (+17)
- (modified) clang/test/CodeGenHLSL/resources/ByteAddressBuffers-methods.hlsl (+8-8)
- (modified) clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-lib.hlsl (+7-7)
- (modified) clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-ps.hlsl (+4-4)
- (modified) clang/test/CodeGenHLSL/resources/StructuredBuffers-subscripts.hlsl (+10-10)
- (added) clang/test/CodeGenHLSL/resources/Texture2D-Subscript.hlsl (+74)
- (modified) clang/test/CodeGenHLSL/resources/TypedBuffers-methods.hlsl (+4-4)
- (modified) clang/test/CodeGenHLSL/resources/TypedBuffers-subscript.hlsl (+8-8)
- (modified) clang/test/SemaHLSL/BuiltIns/resource_getpointer-errors.hlsl (+27-1)
- (added) clang/test/SemaHLSL/Resources/Texture2D-Subscript.hlsl (+23)
- (modified) llvm/include/llvm/IR/IntrinsicsDirectX.td (+1-1)
- (modified) llvm/include/llvm/IR/IntrinsicsSPIRV.td (+1-1)
- (modified) llvm/test/CodeGen/DirectX/MemIntrinsics/memcpy-pointee.ll (+2-2)
- (modified) llvm/test/CodeGen/DirectX/forward_handle_on_alloca.ll (+2-2)
- (modified) llvm/test/Transforms/GVN/PRE/no-pre-load-for-token-like.ll (+4-4)
- (modified) llvm/test/Transforms/GVN/no-sink-dxgetpointer.ll (+12-12)
- (modified) llvm/test/Transforms/SimplifyCFG/DirectX/no-sink-dxgetpointer.ll (+14-14)
- (modified) llvm/test/Transforms/SimplifyCFG/token_like_type.ll (+4-4)
``````````diff
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 0c25eb2443d5e..e5da6155f4472 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -13507,6 +13507,9 @@ def err_std_source_location_impl_malformed : Error<
def err_std_initializer_list_malformed : Error<
"%0 layout not recognized. Must be a non-polymorphic class type with no bases and two fields: a 'const E *' and either another 'const E *' or a 'std::size_t'">;
+def err_hlsl_builtin_resource_coordinate_dimension_mismatch : Error<
+ "builtin %0 resource coordinate dimension mismatch: expected %1, found %2">;
+
// HLSL Diagnostics
def err_hlsl_langstd_unimplemented : Error<"support for HLSL language version %0 is incomplete">;
def err_hlsl_attr_unsupported_in_stage : Error<"attribute %0 is unsupported in '%1' shaders, requires %select{|one of the following: }2%3">;
diff --git a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
index 708b06bc1d03a..a99b9446fd65f 100644
--- a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
+++ b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
@@ -1231,14 +1231,26 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCopyAssignmentOperator() {
return MMB.returnThis().finalize();
}
-BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addArraySubscriptOperators() {
+BuiltinTypeDeclBuilder &
+BuiltinTypeDeclBuilder::addArraySubscriptOperators(ResourceDimension Dim) {
+ assert(!Record->isCompleteDefinition() && "record is already complete");
ASTContext &AST = Record->getASTContext();
+
+ uint32_t VecSize = 1;
+ if (Dim != ResourceDimension::Unknown)
+ VecSize = getResourceDimensions(Dim);
+
+ QualType IndexTy = VecSize > 1
+ ? AST.getExtVectorType(AST.UnsignedIntTy, VecSize)
+ : AST.UnsignedIntTy;
+
DeclarationName Subscript =
AST.DeclarationNames.getCXXOperatorName(OO_Subscript);
- addHandleAccessFunction(Subscript, /*IsConst=*/true, /*IsRef=*/true);
+ addHandleAccessFunction(Subscript, /*IsConst=*/true, /*IsRef=*/true, IndexTy);
if (getResourceAttrs().ResourceClass == llvm::dxil::ResourceClass::UAV)
- addHandleAccessFunction(Subscript, /*IsConst=*/false, /*IsRef=*/true);
+ addHandleAccessFunction(Subscript, /*IsConst=*/false, /*IsRef=*/true,
+ IndexTy);
return *this;
}
@@ -1250,7 +1262,8 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addLoadMethods() {
IdentifierInfo &II = AST.Idents.get("Load", tok::TokenKind::identifier);
DeclarationName Load(&II);
// TODO: We also need versions with status for CheckAccessFullyMapped.
- addHandleAccessFunction(Load, /*IsConst=*/false, /*IsRef=*/false);
+ addHandleAccessFunction(Load, /*IsConst=*/false, /*IsRef=*/false,
+ AST.UnsignedIntTy);
addLoadWithStatusFunction(Load, /*IsConst=*/false);
return *this;
@@ -1295,7 +1308,7 @@ BuiltinTypeDeclBuilder::addByteAddressBufferLoadMethods() {
DeclarationName Load(&II);
addHandleAccessFunction(Load, /*IsConst=*/false, /*IsRef=*/false,
- ReturnType);
+ AST.UnsignedIntTy, ReturnType);
addLoadWithStatusFunction(Load, /*IsConst=*/false, ReturnType);
};
@@ -1885,7 +1898,8 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addLoadWithStatusFunction(
}
BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addHandleAccessFunction(
- DeclarationName &Name, bool IsConst, bool IsRef, QualType ElemTy) {
+ DeclarationName &Name, bool IsConst, bool IsRef, QualType IndexTy,
+ QualType ElemTy) {
assert(!Record->isCompleteDefinition() && "record is already complete");
ASTContext &AST = SemaRef.getASTContext();
using PH = BuiltinTypeMethodBuilder::PlaceHolder;
@@ -1915,7 +1929,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addHandleAccessFunction(
}
MMB.ReturnTy = ReturnTy;
- MMB.addParam("Index", AST.UnsignedIntTy);
+ MMB.addParam("Index", IndexTy);
if (NeedsTypedBuiltin)
MMB.callBuiltin("__builtin_hlsl_resource_getpointer_typed", ElemPtrTy,
diff --git a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h
index 5a0b9a02defdb..d4694f72dd289 100644
--- a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h
+++ b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h
@@ -83,7 +83,7 @@ class BuiltinTypeDeclBuilder {
addTextureHandle(ResourceClass RC, bool IsROV, ResourceDimension RD,
AccessSpecifier Access = AccessSpecifier::AS_private);
BuiltinTypeDeclBuilder &addSamplerHandle();
- BuiltinTypeDeclBuilder &addArraySubscriptOperators();
+ BuiltinTypeDeclBuilder &addArraySubscriptOperators(ResourceDimension Dim);
// Builtin types constructors
BuiltinTypeDeclBuilder &addDefaultHandleConstructor();
@@ -110,6 +110,7 @@ class BuiltinTypeDeclBuilder {
BuiltinTypeDeclBuilder &addDecrementCounterMethod();
BuiltinTypeDeclBuilder &addHandleAccessFunction(DeclarationName &Name,
bool IsConst, bool IsRef,
+ QualType IndexTy,
QualType ElemTy = QualType());
BuiltinTypeDeclBuilder &
addLoadWithStatusFunction(DeclarationName &Name, bool IsConst,
diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp
index e2267ac503b73..c93bf77e7a138 100644
--- a/clang/lib/Sema/HLSLExternalSemaSource.cpp
+++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp
@@ -259,6 +259,7 @@ static BuiltinTypeDeclBuilder setupTextureType(CXXRecordDecl *Decl, Sema &S,
return BuiltinTypeDeclBuilder(S, Decl)
.addTextureHandle(RC, IsROV, Dim)
.addTextureLoadMethods(Dim)
+ .addArraySubscriptOperators(Dim)
.addDefaultHandleConstructor()
.addCopyConstructor()
.addCopyAssignmentOperator()
@@ -475,7 +476,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
/*RawBuffer=*/false, /*HasCounter=*/false)
- .addArraySubscriptOperators()
+ .addArraySubscriptOperators(ResourceDimension::Unknown)
.addLoadMethods()
.addGetDimensionsMethodForBuffer()
.completeDefinition();
@@ -488,7 +489,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
/*RawBuffer=*/false, /*HasCounter=*/false)
- .addArraySubscriptOperators()
+ .addArraySubscriptOperators(ResourceDimension::Unknown)
.addLoadMethods()
.addGetDimensionsMethodForBuffer()
.completeDefinition();
@@ -501,7 +502,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
/*RawBuffer=*/false, /*HasCounter=*/false)
- .addArraySubscriptOperators()
+ .addArraySubscriptOperators(ResourceDimension::Unknown)
.addLoadMethods()
.addGetDimensionsMethodForBuffer()
.completeDefinition();
@@ -513,7 +514,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
/*RawBuffer=*/true, /*HasCounter=*/false)
- .addArraySubscriptOperators()
+ .addArraySubscriptOperators(ResourceDimension::Unknown)
.addLoadMethods()
.addGetDimensionsMethodForBuffer()
.completeDefinition();
@@ -525,7 +526,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
/*RawBuffer=*/true, /*HasCounter=*/true)
- .addArraySubscriptOperators()
+ .addArraySubscriptOperators(ResourceDimension::Unknown)
.addLoadMethods()
.addIncrementCounterMethod()
.addDecrementCounterMethod()
@@ -564,7 +565,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
/*RawBuffer=*/true, /*HasCounter=*/true)
- .addArraySubscriptOperators()
+ .addArraySubscriptOperators(ResourceDimension::Unknown)
.addLoadMethods()
.addIncrementCounterMethod()
.addDecrementCounterMethod()
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index e200c595ab2c2..2b225d1adc7fb 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -3350,6 +3350,44 @@ static bool CheckVectorSelect(Sema *S, CallExpr *TheCall) {
return false;
}
+static bool CheckIndexType(Sema *S, CallExpr *TheCall, unsigned IndexArgIndex) {
+ assert(TheCall->getNumArgs() > IndexArgIndex && "Index argument missing");
+ QualType ArgType = TheCall->getArg(IndexArgIndex)->getType();
+ QualType IndexTy = ArgType;
+ unsigned int ActualDim = 1;
+ if (const auto *VTy = IndexTy->getAs<VectorType>()) {
+ ActualDim = VTy->getNumElements();
+ IndexTy = VTy->getElementType();
+ }
+ if (!IndexTy->isIntegerType()) {
+ S->Diag(TheCall->getArg(IndexArgIndex)->getBeginLoc(),
+ diag::err_typecheck_expect_int)
+ << ArgType;
+ return true;
+ }
+
+ QualType ResourceArgTy = TheCall->getArg(0)->getType();
+ const HLSLAttributedResourceType *ResTy =
+ ResourceArgTy.getTypePtr()->getAs<HLSLAttributedResourceType>();
+ assert(ResTy && "Resource argument must be a resource");
+ HLSLAttributedResourceType::Attributes ResAttrs = ResTy->getAttrs();
+
+ unsigned int ExpectedDim = 1;
+ if (ResAttrs.ResourceDimension != llvm::dxil::ResourceDimension::Unknown) {
+ ExpectedDim = getResourceDimensions(ResAttrs.ResourceDimension);
+ }
+
+ if (ActualDim != ExpectedDim) {
+ S->Diag(TheCall->getArg(IndexArgIndex)->getBeginLoc(),
+ diag::err_hlsl_builtin_resource_coordinate_dimension_mismatch)
+ << cast<NamedDecl>(TheCall->getCalleeDecl()) << ExpectedDim
+ << ActualDim;
+ return true;
+ }
+
+ return false;
+}
+
static bool CheckResourceHandle(
Sema *S, CallExpr *TheCall, unsigned ArgIndex,
llvm::function_ref<bool(const HLSLAttributedResourceType *ResType)> Check =
@@ -3689,8 +3727,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
case Builtin::BI__builtin_hlsl_resource_getpointer: {
if (SemaRef.checkArgCount(TheCall, 2) ||
CheckResourceHandle(&SemaRef, TheCall, 0) ||
- CheckArgTypeMatches(&SemaRef, TheCall->getArg(1),
- SemaRef.getASTContext().UnsignedIntTy))
+ CheckIndexType(&SemaRef, TheCall, 1))
return true;
auto *ResourceTy =
@@ -3707,8 +3744,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
case Builtin::BI__builtin_hlsl_resource_getpointer_typed: {
if (SemaRef.checkArgCount(TheCall, 3) ||
CheckResourceHandle(&SemaRef, TheCall, 0) ||
- CheckArgTypeMatches(&SemaRef, TheCall->getArg(1),
- SemaRef.getASTContext().UnsignedIntTy))
+ CheckIndexType(&SemaRef, TheCall, 1))
return true;
QualType ElementTy = TheCall->getArg(2)->getType();
diff --git a/clang/test/AST/HLSL/Texture2D-scalar-AST.hlsl b/clang/test/AST/HLSL/Texture2D-scalar-AST.hlsl
index a1d0341681df5..fbebbf4a29c31 100644
--- a/clang/test/AST/HLSL/Texture2D-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Texture2D-scalar-AST.hlsl
@@ -53,6 +53,23 @@
// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<int, 2>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, 2>'
// CHECK-NEXT: AlwaysInlineAttr
+// CHECK: CXXMethodDecl {{.*}} operator[] 'const hlsl_device element_type &(vector<unsigned int, 2>) const' inline
+// CHECK-NEXT: ParmVarDecl {{.*}} Index 'vector<unsigned int, 2>'
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ReturnStmt
+// CHECK-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' lvalue prefix '*' cannot overflow
+// CHECK-NEXT: CStyleCastExpr {{.*}} 'hlsl_device element_type *' <Dependent>
+// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
+// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// CHECK-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
+// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// CHECK-SAME{LITERAL}: [[hlsl::resource_dimension(2D)]]
+// CHECK-SAME: ' lvalue .__handle
+// CHECK-NEXT: CXXThisExpr {{.*}} 'const hlsl::Texture2D<element_type>' lvalue implicit this
+// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<unsigned int, 2>' lvalue ParmVar {{.*}} 'Index' 'vector<unsigned int, 2>'
+// CHECK-NEXT: AlwaysInlineAttr
+
// CHECK: CXXMethodDecl {{.*}} Sample 'element_type (hlsl::SamplerState, vector<float, 2>)'
// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, 2>'
diff --git a/clang/test/AST/HLSL/Texture2D-vector-AST.hlsl b/clang/test/AST/HLSL/Texture2D-vector-AST.hlsl
index 097232a50ceb9..19effd16fcc7a 100644
--- a/clang/test/AST/HLSL/Texture2D-vector-AST.hlsl
+++ b/clang/test/AST/HLSL/Texture2D-vector-AST.hlsl
@@ -57,6 +57,23 @@
// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<int, 2>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, 2>'
// CHECK-NEXT: AlwaysInlineAttr
+// CHECK: CXXMethodDecl {{.*}} operator[] 'vector<element_type, element_count> const hlsl_device &(vector<unsigned int, 2>) const' inline
+// CHECK-NEXT: ParmVarDecl {{.*}} Index 'vector<unsigned int, 2>'
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ReturnStmt
+// CHECK-NEXT: UnaryOperator {{.*}} 'vector<element_type, element_count> hlsl_device' lvalue prefix '*' cannot overflow
+// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count> hlsl_device *' <Dependent>
+// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
+// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// CHECK-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
+// CHECK-SAME{LITERAL}: [[hlsl::contained_type(vector<element_type, element_count>)]]
+// CHECK-SAME{LITERAL}: [[hlsl::resource_dimension(2D)]]
+// CHECK-SAME: ' lvalue .__handle
+// CHECK-NEXT: CXXThisExpr {{.*}} 'const hlsl::Texture2D<vector<element_type, element_count>>' lvalue implicit this
+// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<unsigned int, 2>' lvalue ParmVar {{.*}} 'Index' 'vector<unsigned int, 2>'
+// CHECK-NEXT: AlwaysInlineAttr
+
// CHECK: CXXMethodDecl {{.*}} Sample 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, 2>)'
// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, 2>'
diff --git a/clang/test/CodeGenHLSL/resources/ByteAddressBuffers-methods.hlsl b/clang/test/CodeGenHLSL/resources/ByteAddressBuffers-methods.hlsl
index af0fc75df6e89..d4a5e74aaa087 100644
--- a/clang/test/CodeGenHLSL/resources/ByteAddressBuffers-methods.hlsl
+++ b/clang/test/CodeGenHLSL/resources/ByteAddressBuffers-methods.hlsl
@@ -28,7 +28,7 @@ export float TestLoad() {
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", i8, 0, 0), ptr %__handle
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
-// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_0_0t(target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], i32 %[[INDEX]])
+// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_0_0t.i32(target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], i32 %[[INDEX]])
// CHECK-NEXT: %[[VAL:.*]] = load i32, ptr %[[PTR]]
// CHECK-NEXT: ret i32 %[[VAL]]
@@ -36,7 +36,7 @@ export float TestLoad() {
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", i8, 1, 0), ptr %__handle
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
-// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
+// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t.i32(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
// CHECK-NEXT: %[[VEC:.*]] = load <4 x i32>, ptr %[[PTR]]
// CHECK-NEXT: ret <4 x i32> %[[VEC]]
@@ -44,7 +44,7 @@ export float TestLoad() {
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", i8, 0, 0), ptr %__handle
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
-// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_0_0t(target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], i32 %[[INDEX]])
+// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_0_0t.i32(target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], i32 %[[INDEX]])
// CHECK-NEXT: %[[VAL:.*]] = load float, ptr %[[PTR]]
// CHECK-NEXT: ret float %[[VAL]]
@@ -52,7 +52,7 @@ export float TestLoad() {
// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", i8, 1, 0), ptr %__handle
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
-// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
+// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t.i32(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
// CHECK-NEXT: %[[VEC:.*]] = load <4 x float>, ptr %[[PTR]]
// CHECK-NEXT: ret <4 x float> %[[VEC]]
@@ -141,7 +141,7 @@ export void TestStore() {
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", i8, 1, 0), ptr %__handle
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
-// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
+// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t.i32(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
// CHECK-NEXT: store i32 %[[VALUE]], ptr %[[PTR]]
// CHECK-NEXT: ret void
@@ -150,7 +150,7 @@ export void TestStore() {
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", i8, 1, 0), ptr %__handle
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
-// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
+// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t.i32(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
// CHECK-NEXT: store <4 x i32> %[[VALUE]], ptr %[[PTR]]
// CHECK-NEXT: ret void
@@ -159,7 +159,7 @@ export void TestStore() {
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", i8, 1, 0), ptr %__handle
// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr
-// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i8_1_0t(target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], i32 %[[INDEX]])
+// DXIL-NEXT: %[[PTR:.*]] =...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/186110
More information about the cfe-commits
mailing list