https://github.com/s-perron created https://github.com/llvm/llvm-project/pull/186110
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 >From ef7301ca21c59b5ac588a86c6d6d7617527f5566 Mon Sep 17 00:00:00 2001 From: Steven Perron <[email protected]> Date: Tue, 10 Mar 2026 12:46:02 -0400 Subject: [PATCH] [HLSL] Implement Texture2D::operator[] 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 --- .../clang/Basic/DiagnosticSemaKinds.td | 3 + clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp | 28 +++++-- clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h | 3 +- clang/lib/Sema/HLSLExternalSemaSource.cpp | 13 ++-- clang/lib/Sema/SemaHLSL.cpp | 44 ++++++++++- clang/test/AST/HLSL/Texture2D-scalar-AST.hlsl | 17 +++++ clang/test/AST/HLSL/Texture2D-vector-AST.hlsl | 17 +++++ .../resources/ByteAddressBuffers-methods.hlsl | 16 ++-- .../StructuredBuffers-methods-lib.hlsl | 14 ++-- .../StructuredBuffers-methods-ps.hlsl | 8 +- .../StructuredBuffers-subscripts.hlsl | 20 ++--- .../resources/Texture2D-Subscript.hlsl | 74 +++++++++++++++++++ .../resources/TypedBuffers-methods.hlsl | 8 +- .../resources/TypedBuffers-subscript.hlsl | 16 ++-- .../BuiltIns/resource_getpointer-errors.hlsl | 28 ++++++- .../Resources/Texture2D-Subscript.hlsl | 23 ++++++ llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 +- llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 +- .../DirectX/MemIntrinsics/memcpy-pointee.ll | 4 +- .../DirectX/forward_handle_on_alloca.ll | 4 +- .../GVN/PRE/no-pre-load-for-token-like.ll | 8 +- .../Transforms/GVN/no-sink-dxgetpointer.ll | 24 +++--- .../DirectX/no-sink-dxgetpointer.ll | 28 +++---- .../Transforms/SimplifyCFG/token_like_type.ll | 8 +- 24 files changed, 312 insertions(+), 100 deletions(-) create mode 100644 clang/test/CodeGenHLSL/resources/Texture2D-Subscript.hlsl create mode 100644 clang/test/SemaHLSL/Resources/Texture2D-Subscript.hlsl 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:.*]] = 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 float %[[VALUE]], ptr %[[PTR]] // CHECK-NEXT: ret void @@ -168,7 +168,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 float> %[[VALUE]], ptr %[[PTR]] // CHECK-NEXT: ret void diff --git a/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-lib.hlsl b/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-lib.hlsl index 54c386cab537b..f62dec5d07984 100644 --- a/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-lib.hlsl +++ b/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-lib.hlsl @@ -57,7 +57,7 @@ export void TestAppend(float value) { // CHECK-NEXT: %__counter_handle = getelementptr inbounds nuw %"class.hlsl::AppendStructuredBuffer", ptr %{{.*}}, i32 0, i32 1 // DXIL-NEXT: %[[COUNTER_HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 0), ptr %__counter_handle // DXIL-NEXT: %[[COUNTER:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[COUNTER_HANDLE]], i8 1) -// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i32 %[[COUNTER]]) +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t.i32(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i32 %[[COUNTER]]) // CHECK-NEXT: store float %[[VALUE]], ptr %[[PTR]] // CHECK-NEXT: ret void @@ -74,7 +74,7 @@ export double TestConsume() { // CHECK-NEXT: %__counter_handle = getelementptr inbounds nuw %"class.hlsl::ConsumeStructuredBuffer", ptr %{{.*}}, i32 0, i32 1 // DXIL-NEXT: %[[COUNTER_HANDLE:.*]] = load target("dx.RawBuffer", double, 1, 0), ptr %__counter_handle // DXIL-NEXT: %[[COUNTER:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0) %[[COUNTER_HANDLE]], i8 -1) -// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0) %[[HANDLE]], i32 %[[COUNTER]]) +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f64_1_0t.i32(target("dx.RawBuffer", double, 1, 0) %[[HANDLE]], i32 %[[COUNTER]]) // CHECK-NEXT: %[[VAL:.*]] = load double, ptr %[[PTR]], align 8 // CHECK-NEXT: ret double %[[VAL]] @@ -92,7 +92,7 @@ export float TestLoad() { // CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 // DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 0), ptr %__handle // CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr -// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i32 %[[INDEX]]) +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t.i32(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i32 %[[INDEX]]) // CHECK-NEXT: %[[VAL:.*]] = load float, ptr %[[PTR]] // CHECK-NEXT: ret float %[[VAL]] @@ -100,7 +100,7 @@ export float TestLoad() { // CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %{{.*}}, i32 0, i32 0 // DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 0, 0), ptr %__handle // CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr -// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0) %[[HANDLE]], i32 %[[INDEX]]) +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t.i32(target("dx.RawBuffer", float, 0, 0) %[[HANDLE]], i32 %[[INDEX]]) // CHECK-NEXT: %[[VAL:.*]] = load float, ptr %[[PTR]] // CHECK-NEXT: ret float %[[VAL]] @@ -188,10 +188,10 @@ export uint TestGetDimensions() { // DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8) // DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_v4i32_1_0t(target("dx.RawBuffer", <4 x i32>, 1, 0), i8) -// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i32) +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t.i32(target("dx.RawBuffer", float, 1, 0), i32) // DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0), i8) -// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0), i32) -// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0), i32) +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f64_1_0t.i32(target("dx.RawBuffer", double, 1, 0), i32) +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t.i32(target("dx.RawBuffer", float, 0, 0), i32) // DXIL: declare i32 @llvm.dx.resource.getdimensions.x.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0)) // DXIL: declare i32 @llvm.dx.resource.getdimensions.x.tdx.RawBuffer_v4i32_1_0t(target("dx.RawBuffer", <4 x i32>, 1, 0)) diff --git a/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-ps.hlsl b/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-ps.hlsl index 157bae2e08a78..9712f8768b639 100644 --- a/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-ps.hlsl +++ b/clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-ps.hlsl @@ -53,7 +53,7 @@ export float TestLoad() { // CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RasterizerOrderedStructuredBuffer", ptr {{.*}}, i32 0, i32 0 // CHECK-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 1), ptr %__handle // CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr -// DXIL-NEXT: %[[BUFPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1) %[[HANDLE]], i32 %[[INDEX]]) +// DXIL-NEXT: %[[BUFPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_1t.i32(target("dx.RawBuffer", float, 1, 1) %[[HANDLE]], i32 %[[INDEX]]) // CHECK-NEXT: %[[VAL:.*]] = load float, ptr %[[BUFPTR]] // CHECK-NEXT: ret float %[[VAL]] @@ -61,7 +61,7 @@ export float TestLoad() { // CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RasterizerOrderedStructuredBuffer.0", ptr {{.*}}, i32 0, i32 0 // CHECK-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", <2 x i32>, 1, 1), ptr %__handle // CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr -// DXIL-NEXT: %[[BUFPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_v2i32_1_1t(target("dx.RawBuffer", <2 x i32>, 1, 1) %[[HANDLE]], i32 %[[INDEX]]) +// DXIL-NEXT: %[[BUFPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_v2i32_1_1t.i32(target("dx.RawBuffer", <2 x i32>, 1, 1) %[[HANDLE]], i32 %[[INDEX]]) // CHECK-NEXT: %[[VAL:.*]] = load <2 x i32>, ptr %[[BUFPTR]] // CHECK-NEXT: ret <2 x i32> %[[VAL]] @@ -136,8 +136,8 @@ export uint TestGetDimensions() { // DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1), i8) // DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_v2i32_1_1t(target("dx.RawBuffer", <2 x i32>, 1, 1), i8) -// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1), i32) -// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_v2i32_1_1t(target("dx.RawBuffer", <2 x i32>, 1, 1), i32) +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_1t.i32(target("dx.RawBuffer", float, 1, 1), i32) +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_v2i32_1_1t.i32(target("dx.RawBuffer", <2 x i32>, 1, 1), i32) // DXIL: declare i32 @llvm.dx.resource.getdimensions.x.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1)) // DXIL: declare i32 @llvm.dx.resource.getdimensions.x.tdx.RawBuffer_v2i32_1_1t(target("dx.RawBuffer", <2 x i32>, 1, 1)) diff --git a/clang/test/CodeGenHLSL/resources/StructuredBuffers-subscripts.hlsl b/clang/test/CodeGenHLSL/resources/StructuredBuffers-subscripts.hlsl index 4c26d70c0924c..2e6a7ef86c610 100644 --- a/clang/test/CodeGenHLSL/resources/StructuredBuffers-subscripts.hlsl +++ b/clang/test/CodeGenHLSL/resources/StructuredBuffers-subscripts.hlsl @@ -18,18 +18,18 @@ RasterizerOrderedStructuredBuffer<int> Out2; void main(unsigned GI : SV_GroupIndex) { // CHECK: define void @main() - // DXIL: %[[INPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_0_0t(target("dx.RawBuffer", i32, 0, 0) %{{.*}}, i32 %{{.*}}) - // SPV: %[[INPTR:.*]] = call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0i32_12_0t(target("spirv.VulkanBuffer", [0 x i32], 12, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[INPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_0_0t.i32(target("dx.RawBuffer", i32, 0, 0) %{{.*}}, i32 %{{.*}}) + // SPV: %[[INPTR:.*]] = call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0i32_12_0t.i32(target("spirv.VulkanBuffer", [0 x i32], 12, 0) %{{.*}}, i32 %{{.*}}) // CHECK: %[[LOAD:.*]] = load i32, ptr {{.*}}%[[INPTR]] - // DXIL: %[[OUT1PTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %{{.*}}, i32 %{{.*}}) - // SPV: %[[OUT1PTR:.*]] = call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0i32_12_1t(target("spirv.VulkanBuffer", [0 x i32], 12, 1) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[OUT1PTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %{{.*}}, i32 %{{.*}}) + // SPV: %[[OUT1PTR:.*]] = call noundef align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0i32_12_1t.i32(target("spirv.VulkanBuffer", [0 x i32], 12, 1) %{{.*}}, i32 %{{.*}}) // CHECK: store i32 %[[LOAD]], ptr {{.*}}%[[OUT1PTR]] Out1[GI] = In[GI]; #ifndef __SPIRV__ - // DXIL: %[[INPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_0_0t(target("dx.RawBuffer", i32, 0, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[INPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_0_0t.i32(target("dx.RawBuffer", i32, 0, 0) %{{.*}}, i32 %{{.*}}) // DXIL: %[[LOAD:.*]] = load i32, ptr %[[INPTR]] - // DXIL: %[[OUT2PTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_1t(target("dx.RawBuffer", i32, 1, 1) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[OUT2PTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_1t.i32(target("dx.RawBuffer", i32, 1, 1) %{{.*}}, i32 %{{.*}}) // DXIL: store i32 %[[LOAD]], ptr %[[OUT2PTR]] Out2[GI] = In[GI]; #endif @@ -37,15 +37,15 @@ void main(unsigned GI : SV_GroupIndex) { // For SPIR-V, the addrspacecast comes from `S::operator=` member function, which expects // parameters in address space 0. This is why hlsl_device is a sub address // space of the default address space. - // SPV: %[[INPTR:.*]] = call noundef align 1 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0s_struct.Ss_12_1t(target("spirv.VulkanBuffer", [0 x %struct.S], 12, 1) %{{.*}}, i32 %{{.*}}) + // SPV: %[[INPTR:.*]] = call noundef align 1 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0s_struct.Ss_12_1t.i32(target("spirv.VulkanBuffer", [0 x %struct.S], 12, 1) %{{.*}}, i32 %{{.*}}) // SPV: %[[INCAST:.*]] = addrspacecast ptr addrspace(11) %[[INPTR]] to ptr - // SPV: %[[OUTPTR:.*]] = call noundef align 1 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0s_struct.Ss_12_1t(target("spirv.VulkanBuffer", [0 x %struct.S], 12, 1) %{{.*}}, i32 %{{.*}}) + // SPV: %[[OUTPTR:.*]] = call noundef align 1 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0s_struct.Ss_12_1t.i32(target("spirv.VulkanBuffer", [0 x %struct.S], 12, 1) %{{.*}}, i32 %{{.*}}) // SPV: %[[OUTCAST:.*]] = addrspacecast ptr addrspace(11) %[[OUTPTR]] to ptr // SPV: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %[[OUTCAST]], ptr align 1 %[[INCAST]], i64 4, i1 false) // For DXIL, hlsl_device and the default address space map to the same target address space. No need for an address space cast. - // DXIL: %[[INPTR:.*]] = call noundef nonnull align 1 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_1_0t(target("dx.RawBuffer", %struct.S, 1, 0) %{{.*}}, i32 %{{.*}}) - // DXIL: %[[OUTPTR:.*]] = call noundef nonnull align 1 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_1_0t(target("dx.RawBuffer", %struct.S, 1, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[INPTR:.*]] = call noundef nonnull align 1 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_1_0t.i32(target("dx.RawBuffer", %struct.S, 1, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[OUTPTR:.*]] = call noundef nonnull align 1 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_1_0t.i32(target("dx.RawBuffer", %struct.S, 1, 0) %{{.*}}, i32 %{{.*}}) // DXIL: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %[[OUTPTR]], ptr align 1 %[[INPTR]], i32 4, i1 false) RWSB3[0] = RWSB3[1]; } diff --git a/clang/test/CodeGenHLSL/resources/Texture2D-Subscript.hlsl b/clang/test/CodeGenHLSL/resources/Texture2D-Subscript.hlsl new file mode 100644 index 0000000000000..e02fcb0ec13d3 --- /dev/null +++ b/clang/test/CodeGenHLSL/resources/Texture2D-Subscript.hlsl @@ -0,0 +1,74 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm -disable-llvm-passes -finclude-default-header -Wno-sign-conversion -o - %s | llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,DXIL +// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm -disable-llvm-passes -finclude-default-header -Wno-sign-conversion -o - %s | llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,SPIRV + +Texture2D<float4> Tex : register(t0); +Texture2D<float> Tex2 : register(t1); +Texture2D<int3> Tex3 : register(t2); + +[numthreads(1,1,1)] +void main(uint2 DTid : SV_DispatchThreadID) { + float4 val = Tex[DTid]; + float val2 = Tex2[DTid]; + int3 val3 = Tex3[DTid]; +} + +// CHECK: define hidden {{.*}}void @main(unsigned int vector[2])(<2 x i32> noundef %[[DTID:.*]]) +// CHECK: %[[DTID_ADDR:.*]] = alloca <2 x i32>, align 8 +// CHECK: %[[VAL:.*]] = alloca <4 x float>, align 16 +// CHECK: %[[VAL2:.*]] = alloca float, align 4 +// CHECK: %[[VAL3:.*]] = alloca <3 x i32>, align 16 +// CHECK: store <2 x i32> %[[DTID]], ptr %[[DTID_ADDR]], align 8 +// CHECK: %[[DTID_VAL:.*]] = load <2 x i32>, ptr %[[DTID_ADDR]], align 8 +// CHECK: %[[CALL1:.*]] = call noundef {{.*}}ptr{{.*}} @hlsl::Texture2D<float vector[4]>::operator[](unsigned int vector[2]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex, <2 x i32> noundef %[[DTID_VAL]]) +// CHECK: %[[LOAD_VAL:.*]] = load <4 x float>, ptr{{.*}} %[[CALL1]], align 16 +// CHECK: store <4 x float> %[[LOAD_VAL]], ptr %[[VAL]], align 16 +// CHECK: %[[DTID_VAL2:.*]] = load <2 x i32>, ptr %[[DTID_ADDR]], align 8 +// CHECK: %[[CALL2:.*]] = call noundef {{.*}}ptr{{.*}} @hlsl::Texture2D<float>::operator[](unsigned int vector[2]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex2, <2 x i32> noundef %[[DTID_VAL2]]) +// CHECK: %[[LOAD_VAL2:.*]] = load float, ptr{{.*}} %[[CALL2]], align 4 +// CHECK: store float %[[LOAD_VAL2]], ptr %[[VAL2]], align 4 +// CHECK: %[[DTID_VAL3:.*]] = load <2 x i32>, ptr %[[DTID_ADDR]], align 8 +// CHECK: %[[CALL3:.*]] = call noundef {{.*}}ptr{{.*}} @hlsl::Texture2D<int vector[3]>::operator[](unsigned int vector[2]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex3, <2 x i32> noundef %[[DTID_VAL3]]) +// CHECK: %[[LOAD_VAL3:.*]] = load <3 x i32>, ptr{{.*}} %[[CALL3]], align 16 +// CHECK: store <3 x i32> %[[LOAD_VAL3]], ptr %[[VAL3]], align 16 + +// CHECK: define linkonce_odr hidden noundef {{.*}}ptr{{.*}} @hlsl::Texture2D<float vector[4]>::operator[](unsigned int vector[2]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], <2 x i32> noundef %[[INDEX:.*]]) +// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align {{.*}} +// CHECK: %[[INDEX_ADDR:.*]] = alloca <2 x i32>, align 8 +// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align {{.*}} +// CHECK: store <2 x i32> %[[INDEX]], ptr %[[INDEX_ADDR]], align 8 +// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align {{.*}} +// CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::Texture2D", ptr %[[THIS1]], i32 0, i32 0 +// DXIL: %[[HANDLE:.*]] = load target("dx.Texture", <4 x float>, 0, 0, 0, 2), ptr %[[HANDLE_PTR]], align 4 +// SPIRV: %[[HANDLE:.*]] = load target("spirv.Image", float, 1, 2, 0, 0, 1, 0), ptr %[[HANDLE_PTR]], align 8 +// CHECK: %[[INDEX_VAL:.*]] = load <2 x i32>, ptr %[[INDEX_ADDR]], align 8 +// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.Texture_v4f32_0_0_0_2t.v2i32(target("dx.Texture", <4 x float>, 0, 0, 0, 2) %[[HANDLE]], <2 x i32> %[[INDEX_VAL]]) +// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.Image_f32_1_2_0_0_1_0t.v2i32(target("spirv.Image", float, 1, 2, 0, 0, 1, 0) %[[HANDLE]], <2 x i32> %[[INDEX_VAL]]) +// CHECK: ret ptr {{.*}}%[[PTR]] + +// CHECK: define linkonce_odr hidden noundef {{.*}}ptr{{.*}} @hlsl::Texture2D<float>::operator[](unsigned int vector[2]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], <2 x i32> noundef %[[INDEX:.*]]) +// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align {{.*}} +// CHECK: %[[INDEX_ADDR:.*]] = alloca <2 x i32>, align 8 +// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align {{.*}} +// CHECK: store <2 x i32> %[[INDEX]], ptr %[[INDEX_ADDR]], align 8 +// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align {{.*}} +// CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::Texture2D.0", ptr %[[THIS1]], i32 0, i32 0 +// DXIL: %[[HANDLE:.*]] = load target("dx.Texture", float, 0, 0, 0, 2), ptr %[[HANDLE_PTR]], align 4 +// SPIRV: %[[HANDLE:.*]] = load target("spirv.Image", float, 1, 2, 0, 0, 1, 0), ptr %[[HANDLE_PTR]], align 8 +// CHECK: %[[INDEX_VAL:.*]] = load <2 x i32>, ptr %[[INDEX_ADDR]], align 8 +// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.Texture_f32_0_0_0_2t.v2i32(target("dx.Texture", float, 0, 0, 0, 2) %[[HANDLE]], <2 x i32> %[[INDEX_VAL]]) +// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.Image_f32_1_2_0_0_1_0t.v2i32(target("spirv.Image", float, 1, 2, 0, 0, 1, 0) %[[HANDLE]], <2 x i32> %[[INDEX_VAL]]) +// CHECK: ret ptr {{.*}}%[[PTR]] + +// CHECK: define linkonce_odr hidden noundef {{.*}}ptr{{.*}} @hlsl::Texture2D<int vector[3]>::operator[](unsigned int vector[2]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], <2 x i32> noundef %[[INDEX:.*]]) +// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align {{.*}} +// CHECK: %[[INDEX_ADDR:.*]] = alloca <2 x i32>, align 8 +// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align {{.*}} +// CHECK: store <2 x i32> %[[INDEX]], ptr %[[INDEX_ADDR]], align 8 +// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align {{.*}} +// CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::Texture2D.1", ptr %[[THIS1]], i32 0, i32 0 +// DXIL: %[[HANDLE:.*]] = load target("dx.Texture", <3 x i32>, 0, 0, 1, 2), ptr %[[HANDLE_PTR]], align 4 +// SPIRV: %[[HANDLE:.*]] = load target("spirv.SignedImage", i32, 1, 2, 0, 0, 1, 0), ptr %[[HANDLE_PTR]], align 8 +// CHECK: %[[INDEX_VAL:.*]] = load <2 x i32>, ptr %[[INDEX_ADDR]], align 8 +// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.Texture_v3i32_0_0_1_2t.v2i32(target("dx.Texture", <3 x i32>, 0, 0, 1, 2) %[[HANDLE]], <2 x i32> %[[INDEX_VAL]]) +// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_1_2_0_0_1_0t.v2i32(target("spirv.SignedImage", i32, 1, 2, 0, 0, 1, 0) %[[HANDLE]], <2 x i32> %[[INDEX_VAL]]) +// CHECK: ret ptr {{.*}}%[[PTR]] diff --git a/clang/test/CodeGenHLSL/resources/TypedBuffers-methods.hlsl b/clang/test/CodeGenHLSL/resources/TypedBuffers-methods.hlsl index 499f5b1ca54ef..8f255100159a9 100644 --- a/clang/test/CodeGenHLSL/resources/TypedBuffers-methods.hlsl +++ b/clang/test/CodeGenHLSL/resources/TypedBuffers-methods.hlsl @@ -26,7 +26,7 @@ export float TestLoad() { // CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::Buffer", ptr %{{.*}}, i32 0, i32 0 // DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.TypedBuffer", float, 0, 0, 0), ptr %__handle // CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr -// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_f32_0_0_0t(target("dx.TypedBuffer", float, 0, 0, 0) %[[HANDLE]], i32 %[[INDEX]]) +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_f32_0_0_0t.i32(target("dx.TypedBuffer", float, 0, 0, 0) %[[HANDLE]], i32 %[[INDEX]]) // CHECK-NEXT: %[[VAL:.*]] = load float, ptr %[[PTR]] // CHECK-NEXT: ret float %[[VAL]] @@ -34,7 +34,7 @@ export float TestLoad() { // CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %{{.*}}, i32 0, i32 0 // DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.TypedBuffer", <4 x i32>, 1, 0, 0), ptr %__handle // CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr -// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_v4i32_1_0_0t(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %[[HANDLE]], i32 %[[INDEX]]) +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_v4i32_1_0_0t.i32(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %[[HANDLE]], i32 %[[INDEX]]) // CHECK-NEXT: %[[VEC:.*]] = load <4 x i32>, ptr %[[PTR]] // CHECK-NEXT: ret <4 x i32> %[[VEC]] @@ -105,8 +105,8 @@ export uint TestGetDimensions() { // CHECK-NEXT: store i32 %[[DIM]], ptr %[[DIMPTR]] // CHECK-NEXT: ret void -// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_f32_0_0_0t(target("dx.TypedBuffer", float, 0, 0, 0), i32) -// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_v4i32_1_0_0t(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0), i32) +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_f32_0_0_0t.i32(target("dx.TypedBuffer", float, 0, 0, 0), i32) +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_v4i32_1_0_0t.i32(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0), i32) // DXIL: declare i32 @llvm.dx.resource.getdimensions.x.tdx.TypedBuffer_f32_0_0_0t(target("dx.TypedBuffer", float, 0, 0, 0)) // DXIL: declare i32 @llvm.dx.resource.getdimensions.x.tdx.TypedBuffer_v4i32_1_0_0t(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0)) diff --git a/clang/test/CodeGenHLSL/resources/TypedBuffers-subscript.hlsl b/clang/test/CodeGenHLSL/resources/TypedBuffers-subscript.hlsl index adc35f6097403..ac6932d362e37 100644 --- a/clang/test/CodeGenHLSL/resources/TypedBuffers-subscript.hlsl +++ b/clang/test/CodeGenHLSL/resources/TypedBuffers-subscript.hlsl @@ -8,19 +8,19 @@ RWBuffer<int> Out; void main(unsigned GI : SV_GroupIndex) { // CHECK: define void @main() - // DXIL: %[[INPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_0_0_1t(target("dx.TypedBuffer", i32, 0, 0, 1) %{{.*}}, i32 %{{.*}}) - // SPIRV: %[[INPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_1_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 1, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[INPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_0_0_1t.i32(target("dx.TypedBuffer", i32, 0, 0, 1) %{{.*}}, i32 %{{.*}}) + // SPIRV: %[[INPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_1_0t.i32(target("spirv.SignedImage", i32, 5, 2, 0, 0, 1, 0) %{{.*}}, i32 %{{.*}}) // CHECK: %[[LOAD:.*]] = load i32, ptr {{.*}}%[[INPTR]] - // DXIL: %[[OUTPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}}) - // SPIRV: %[[OUTPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[OUTPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}}) + // SPIRV: %[[OUTPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t.i32(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}}) // CHECK: store i32 %[[LOAD]], ptr {{.*}}%[[OUTPTR]] Out[GI] = In[GI]; - // DXIL: %[[INPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}}) - // SPIRV: %[[INPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[INPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}}) + // SPIRV: %[[INPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t.i32(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}}) // CHECK: %[[LOAD:.*]] = load i32, ptr {{.*}}%[[INPTR]] - // DXIL: %[[OUTPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}}) - // SPIRV: %[[OUTPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}}) + // DXIL: %[[OUTPTR:.*]] = call {{.*}} ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}}) + // SPIRV: %[[OUTPTR:.*]] = call {{.*}} ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.SignedImage_i32_5_2_0_0_2_0t.i32(target("spirv.SignedImage", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}}) // CHECK: store i32 %[[LOAD]], ptr {{.*}}%[[OUTPTR]] Out[GI + 1] = Out[GI]; } diff --git a/clang/test/SemaHLSL/BuiltIns/resource_getpointer-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/resource_getpointer-errors.hlsl index 0f2064fe7e45f..20de0773a1742 100644 --- a/clang/test/SemaHLSL/BuiltIns/resource_getpointer-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/resource_getpointer-errors.hlsl @@ -16,7 +16,7 @@ void test_args(unsigned int x) { handle_t res; - // expected-error@+1 {{passing 'const char *' to parameter of incompatible type 'unsigned int'}} + // expected-error@+1 {{used type 'const char *' where integer is required}} __builtin_hlsl_resource_getpointer(res, "1"); // no error @@ -24,4 +24,30 @@ void test_args(unsigned int x) { // no error __builtin_hlsl_resource_getpointer(res, x); + + // expected-error@+1 {{builtin '__builtin_hlsl_resource_getpointer' resource coordinate dimension mismatch: expected 1, found 2}} + __builtin_hlsl_resource_getpointer(res, uint2(1, 2)); +} + +using tex2d_handle_t = __hlsl_resource_t + [[hlsl::resource_class(SRV)]] [[hlsl::dimension("2D")]] [[hlsl::contained_type(float4)]]; + +using tex3d_handle_t = __hlsl_resource_t + [[hlsl::resource_class(SRV)]] [[hlsl::dimension("3D")]] [[hlsl::contained_type(float4)]]; + +void test_tex_handles(tex2d_handle_t tex2d, tex3d_handle_t tex3d) { + // expected-error@+1 {{builtin '__builtin_hlsl_resource_getpointer' resource coordinate dimension mismatch: expected 2, found 1}} + __builtin_hlsl_resource_getpointer(tex2d, 1u); + + // no error + __builtin_hlsl_resource_getpointer(tex2d, uint2(1, 2)); + + // expected-error@+1 {{builtin '__builtin_hlsl_resource_getpointer' resource coordinate dimension mismatch: expected 2, found 3}} + __builtin_hlsl_resource_getpointer(tex2d, uint3(1, 2, 3)); + + // expected-error@+1 {{builtin '__builtin_hlsl_resource_getpointer' resource coordinate dimension mismatch: expected 3, found 2}} + __builtin_hlsl_resource_getpointer(tex3d, uint2(1, 2)); + + // no error + __builtin_hlsl_resource_getpointer(tex3d, uint3(1, 2, 3)); } diff --git a/clang/test/SemaHLSL/Resources/Texture2D-Subscript.hlsl b/clang/test/SemaHLSL/Resources/Texture2D-Subscript.hlsl new file mode 100644 index 0000000000000..28098366f9390 --- /dev/null +++ b/clang/test/SemaHLSL/Resources/Texture2D-Subscript.hlsl @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -finclude-default-header -verify -o - %s + +Texture2D<float4> Tex; + +struct S { int a; }; + +void main() { + uint2 valid_index = uint2(1, 2); + float4 val1 = Tex[valid_index]; // OK + + S s = { 1 }; + // expected-error@+2 {{no viable overloaded operator[] for type 'Texture2D<float4>'}} + // expected-note@*:* {{candidate function not viable: no known conversion from 'S' to 'vector<unsigned int, 2>'}} + float4 val2 = Tex[s]; + + int i = 1; + float4 val3 = Tex[i]; // expected-warning {{implicit conversion changes signedness: 'int' to 'vector<unsigned int, 2>' (vector of 2 'unsigned int' values)}} + + int3 i3 = int3(1, 2, 3); + // expected-warning@+2 {{implicit conversion truncates vector: 'int3' (aka 'vector<int, 3>') to 'vector<unsigned int, 2>' (vector of 2 'unsigned int' values)}} + // expected-warning@+1 {{implicit conversion changes signedness: 'int3' (aka 'vector<int, 3>') to 'vector<unsigned int, 2>' (vector of 2 'unsigned int' values)}} + float4 val4 = Tex[i3]; +} diff --git a/llvm/include/llvm/IR/IntrinsicsDirectX.td b/llvm/include/llvm/IR/IntrinsicsDirectX.td index 52a305888f699..aadc56d4c707a 100644 --- a/llvm/include/llvm/IR/IntrinsicsDirectX.td +++ b/llvm/include/llvm/IR/IntrinsicsDirectX.td @@ -37,7 +37,7 @@ def int_dx_resource_handlefromimplicitbinding [IntrNoMem]>; def int_dx_resource_getpointer - : DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_i32_ty], + : DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_any_ty], [IntrConvergent, IntrNoMem]>; def int_dx_resource_nonuniformindex diff --git a/llvm/include/llvm/IR/IntrinsicsSPIRV.td b/llvm/include/llvm/IR/IntrinsicsSPIRV.td index 5bc93ec87ef66..d3cfa49475f84 100644 --- a/llvm/include/llvm/IR/IntrinsicsSPIRV.td +++ b/llvm/include/llvm/IR/IntrinsicsSPIRV.td @@ -275,7 +275,7 @@ def int_spv_rsqrt : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty] [IntrReadMem]>; def int_spv_resource_getpointer - : DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_i32_ty], + : DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_any_ty], [IntrNoMem]>; def int_spv_pushconstant_getpointer diff --git a/llvm/test/CodeGen/DirectX/MemIntrinsics/memcpy-pointee.ll b/llvm/test/CodeGen/DirectX/MemIntrinsics/memcpy-pointee.ll index d24c1d6592c42..05e522d1e86a6 100644 --- a/llvm/test/CodeGen/DirectX/MemIntrinsics/memcpy-pointee.ll +++ b/llvm/test/CodeGen/DirectX/MemIntrinsics/memcpy-pointee.ll @@ -80,9 +80,9 @@ define void @test_structarray_in_buffer() "hlsl.export" { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[H_OUT:%.*]] = tail call target("dx.RawBuffer", [[STRUCT_S:%.*]], 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_s_struct.Ss_1_0t(i32 0, i32 0, i32 1, i32 0, ptr null) ; CHECK-NEXT: [[H_IN:%.*]] = tail call target("dx.RawBuffer", [[STRUCT_S]], 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_s_struct.Ss_0_0t(i32 0, i32 1, i32 1, i32 0, ptr null) -; CHECK-NEXT: [[P_OUT:%.*]] = tail call noundef nonnull align 1 dereferenceable(48) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_1_0t(target("dx.RawBuffer", [[STRUCT_S]], 1, 0) [[H_OUT]], i32 0) +; CHECK-NEXT: [[P_OUT:%.*]] = tail call noundef nonnull align 1 dereferenceable(48) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_1_0t.i32(target("dx.RawBuffer", [[STRUCT_S]], 1, 0) [[H_OUT]], i32 0) ; CHECK-NEXT: [[OUT_I:%.*]] = getelementptr inbounds nuw i8, ptr [[P_OUT]], i32 16 -; CHECK-NEXT: [[P_IN:%.*]] = tail call noundef nonnull align 1 dereferenceable(48) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_0_0t(target("dx.RawBuffer", [[STRUCT_S]], 0, 0) [[H_IN]], i32 0) +; CHECK-NEXT: [[P_IN:%.*]] = tail call noundef nonnull align 1 dereferenceable(48) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Ss_0_0t.i32(target("dx.RawBuffer", [[STRUCT_S]], 0, 0) [[H_IN]], i32 0) ; CHECK-NEXT: [[IN_I:%.*]] = getelementptr inbounds nuw i8, ptr [[P_IN]], i32 16 ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[OUT_I]], i32 0 ; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4 diff --git a/llvm/test/CodeGen/DirectX/forward_handle_on_alloca.ll b/llvm/test/CodeGen/DirectX/forward_handle_on_alloca.ll index 4f2871341ff8c..405eed597faae 100644 --- a/llvm/test/CodeGen/DirectX/forward_handle_on_alloca.ll +++ b/llvm/test/CodeGen/DirectX/forward_handle_on_alloca.ll @@ -18,7 +18,7 @@ define void @CSMain() local_unnamed_addr { ; CHECK-NEXT: store target("dx.RawBuffer", i32, 1, 0) [[TMP0]], ptr @global, align 4 ; FHCHECK-NEXT: [[TMP2:%.*]] = load i32, ptr @global, align 4 ; FHCHECK-NEXT: store i32 [[TMP2]], ptr [[AGG_TMP_I1_SROA_0]], align 8 -; CHECK-NEXT: [[TMP3:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP0]], i32 0) +; CHECK-NEXT: [[TMP3:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP0]], i32 0) ; CHECK-NEXT: store i32 0, ptr [[TMP3]], align 4 ; CHECK-NEXT: ret void ; @@ -30,7 +30,7 @@ entry: call void @llvm.lifetime.start.p0(ptr nonnull %alloca) store i32 %val , ptr %alloca, align 8 %indirect = load target("dx.RawBuffer", i32, 1, 0), ptr %alloca, align 8 - %buff = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %indirect, i32 0) + %buff = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %indirect, i32 0) store i32 0, ptr %buff, align 4 call void @llvm.lifetime.end.p0(ptr nonnull %alloca) ret void diff --git a/llvm/test/Transforms/GVN/PRE/no-pre-load-for-token-like.ll b/llvm/test/Transforms/GVN/PRE/no-pre-load-for-token-like.ll index 1b36aba6bca09..fa3d7aaf0749e 100644 --- a/llvm/test/Transforms/GVN/PRE/no-pre-load-for-token-like.ll +++ b/llvm/test/Transforms/GVN/PRE/no-pre-load-for-token-like.ll @@ -12,11 +12,11 @@ define ptr @main() { ; CHECK-NEXT: br label %[[IF_END_I:.*]] ; CHECK: [[IF_THEN_I]]: ; CHECK-NEXT: [[TMP0:%.*]] = load target("dx.RawBuffer", half, 1, 0), ptr null, align 4 -; CHECK-NEXT: [[TMP1:%.*]] = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) [[TMP0]], i32 0) +; CHECK-NEXT: [[TMP1:%.*]] = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) [[TMP0]], i32 0) ; CHECK-NEXT: br label %[[IF_END_I]] ; CHECK: [[IF_END_I]]: ; CHECK-NEXT: [[TMP2:%.*]] = load target("dx.RawBuffer", half, 1, 0), ptr null, align 4 -; CHECK-NEXT: [[TMP3:%.*]] = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) [[TMP2]], i32 0) +; CHECK-NEXT: [[TMP3:%.*]] = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) [[TMP2]], i32 0) ; CHECK-NEXT: ret ptr [[TMP3]] ; entry: @@ -24,11 +24,11 @@ entry: if.then.i: ; preds = %entry %0 = load target("dx.RawBuffer", half, 1, 0), ptr null, align 4 - %1 = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) %0, i32 0) + %1 = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) %0, i32 0) br label %if.end.i if.end.i: ; preds = %if.then.i, %entry %2 = load target("dx.RawBuffer", half, 1, 0), ptr null, align 4 - %3 = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) %2, i32 0) + %3 = tail call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) %2, i32 0) ret ptr %3 } diff --git a/llvm/test/Transforms/GVN/no-sink-dxgetpointer.ll b/llvm/test/Transforms/GVN/no-sink-dxgetpointer.ll index b1af3f6bd0846..2d5a07562f4a4 100644 --- a/llvm/test/Transforms/GVN/no-sink-dxgetpointer.ll +++ b/llvm/test/Transforms/GVN/no-sink-dxgetpointer.ll @@ -39,23 +39,23 @@ define void @main() local_unnamed_addr { ; CHECK-NEXT: [[LOADEDV_I:%.*]] = trunc nuw i32 [[TMP4]] to i1 ; CHECK-NEXT: br i1 [[LOADEDV_I]], label %[[IF_THEN_I:.*]], label %[[IF_ELSE_I:.*]] ; CHECK: [[IF_THEN_I]]: -; CHECK-NEXT: [[TMP5:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) [[TMP0]], i32 [[TMP3]]) +; CHECK-NEXT: [[TMP5:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) [[TMP0]], i32 [[TMP3]]) ; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4 ; CHECK-NEXT: [[HLSL_WAVE_ACTIVE_SUM_I:%.*]] = tail call i32 @llvm.dx.wave.reduce.sum.i32(i32 [[TMP6]]) -; CHECK-NEXT: [[TMP7:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 [[TMP3]]) +; CHECK-NEXT: [[TMP7:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 [[TMP3]]) ; CHECK-NEXT: store i32 [[HLSL_WAVE_ACTIVE_SUM_I]], ptr [[TMP7]], align 4 ; CHECK-NEXT: br label %[[MAIN_EXIT:.*]] ; CHECK: [[IF_ELSE_I]]: -; CHECK-NEXT: [[TMP8:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) [[TMP0]], i32 [[TMP3]]) +; CHECK-NEXT: [[TMP8:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) [[TMP0]], i32 [[TMP3]]) ; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4 -; CHECK-NEXT: [[TMP10:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 0) +; CHECK-NEXT: [[TMP10:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 0) ; CHECK-NEXT: store i32 [[TMP9]], ptr [[TMP10]], align 4 ; CHECK-NEXT: br label %[[MAIN_EXIT]] ; CHECK: [[MAIN_EXIT]]: -; CHECK-NEXT: [[TMP11:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) [[TMP0]], i32 [[TMP3]]) +; CHECK-NEXT: [[TMP11:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) [[TMP0]], i32 [[TMP3]]) ; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 4 ; CHECK-NEXT: [[HLSL_WAVE_ACTIVE_SUM5_I:%.*]] = tail call i32 @llvm.dx.wave.reduce.sum.i32(i32 [[TMP12]]) -; CHECK-NEXT: [[TMP13:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 [[TMP3]]) +; CHECK-NEXT: [[TMP13:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 [[TMP3]]) ; CHECK-NEXT: store i32 [[HLSL_WAVE_ACTIVE_SUM5_I]], ptr [[TMP13]], align 4 ; CHECK-NEXT: ret void ; @@ -76,25 +76,25 @@ entry: br i1 %loadedv.i, label %if.then.i, label %if.else.i if.then.i: ; preds = %entry - %5 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %0, i32 %3) + %5 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) %0, i32 %3) %6 = load i32, ptr %5, align 4 %hlsl.wave.active.sum.i = tail call i32 @llvm.dx.wave.reduce.sum.i32(i32 %6) - %7 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %1, i32 %3) + %7 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %1, i32 %3) store i32 %hlsl.wave.active.sum.i, ptr %7, align 4 br label %main.exit if.else.i: ; preds = %entry - %8 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %0, i32 %3) + %8 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) %0, i32 %3) %9 = load i32, ptr %8, align 4 - %10 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %1, i32 0) + %10 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %1, i32 0) store i32 %9, ptr %10, align 4 br label %main.exit main.exit: ; preds = %if.then.i, %if.else.i - %11 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %0, i32 %3) + %11 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t.i32(target("dx.TypedBuffer", i32, 1, 0, 1) %0, i32 %3) %12 = load i32, ptr %11, align 4 %hlsl.wave.active.sum5.i = tail call i32 @llvm.dx.wave.reduce.sum.i32(i32 %12) - %13 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %1, i32 %3) + %13 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %1, i32 %3) store i32 %hlsl.wave.active.sum5.i, ptr %13, align 4 ret void } diff --git a/llvm/test/Transforms/SimplifyCFG/DirectX/no-sink-dxgetpointer.ll b/llvm/test/Transforms/SimplifyCFG/DirectX/no-sink-dxgetpointer.ll index 4cc8a7e7f5012..038b25d765d6f 100644 --- a/llvm/test/Transforms/SimplifyCFG/DirectX/no-sink-dxgetpointer.ll +++ b/llvm/test/Transforms/SimplifyCFG/DirectX/no-sink-dxgetpointer.ll @@ -43,10 +43,10 @@ define void @main() local_unnamed_addr { ; CHECK-NEXT: br i1 [[TOBOOL_NOT_I]], label %[[IF_ELSE_I:.*]], label %[[IF_THEN_I:.*]] ; CHECK: [[IF_THEN_I]]: ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(2) @f, align 4 -; CHECK-NEXT: [[TMP5:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 [[TMP4]]) +; CHECK-NEXT: [[TMP5:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 [[TMP4]]) ; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4 ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr addrspace(2) @g, align 4 -; CHECK-NEXT: [[TMP8:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 [[TMP7]]) +; CHECK-NEXT: [[TMP8:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 [[TMP7]]) ; CHECK-NEXT: store i32 [[TMP6]], ptr [[TMP8]], align 4 ; CHECK-NEXT: br label %[[MAIN_EXIT:.*]] ; CHECK: [[IF_ELSE_I]]: @@ -54,22 +54,22 @@ define void @main() local_unnamed_addr { ; CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[TMP9]], 0 ; CHECK-NEXT: br i1 [[CMP_I]], label %[[IF_THEN2_I:.*]], label %[[IF_ELSE6_I:.*]] ; CHECK: [[IF_THEN2_I]]: -; CHECK-NEXT: [[TMP10:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 0) +; CHECK-NEXT: [[TMP10:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP1]], i32 0) ; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4 -; CHECK-NEXT: [[TMP12:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 0) +; CHECK-NEXT: [[TMP12:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 0) ; CHECK-NEXT: store i32 [[TMP11]], ptr [[TMP12]], align 4 ; CHECK-NEXT: br label %[[MAIN_EXIT]] ; CHECK: [[IF_ELSE6_I]]: ; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr addrspace(2) @e, align 4 -; CHECK-NEXT: [[TMP14:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP0]], i32 [[TMP13]]) +; CHECK-NEXT: [[TMP14:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP0]], i32 [[TMP13]]) ; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 4 -; CHECK-NEXT: [[TMP16:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 [[TMP9]]) +; CHECK-NEXT: [[TMP16:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 [[TMP9]]) ; CHECK-NEXT: store i32 [[TMP15]], ptr [[TMP16]], align 4 ; CHECK-NEXT: br label %[[MAIN_EXIT]] ; CHECK: [[MAIN_EXIT]]: ; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr addrspace(2) @f, align 4 ; CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr addrspace(2) @g, align 4 -; CHECK-NEXT: [[TMP19:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 [[TMP18]]) +; CHECK-NEXT: [[TMP19:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) [[TMP2]], i32 [[TMP18]]) ; CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4 ; CHECK-NEXT: [[ADD_I:%.*]] = add i32 [[TMP20]], [[TMP17]] ; CHECK-NEXT: store i32 [[ADD_I]], ptr [[TMP19]], align 4 @@ -93,10 +93,10 @@ entry: if.then.i: ; preds = %entry %4 = load i32, ptr addrspace(2) @f, align 4 - %5 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %1, i32 %4) + %5 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %1, i32 %4) %6 = load i32, ptr %5, align 4 %7 = load i32, ptr addrspace(2) @g, align 4 - %8 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %2, i32 %7) + %8 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %2, i32 %7) store i32 %6, ptr %8, align 4 br label %main.exit @@ -106,24 +106,24 @@ if.else.i: ; preds = %entry br i1 %cmp.i, label %if.then2.i, label %if.else6.i if.then2.i: ; preds = %if.else.i - %10 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %1, i32 0) + %10 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %1, i32 0) %11 = load i32, ptr %10, align 4 - %12 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %2, i32 0) + %12 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %2, i32 0) store i32 %11, ptr %12, align 4 br label %main.exit if.else6.i: ; preds = %if.else.i %13 = load i32, ptr addrspace(2) @e, align 4 - %14 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %0, i32 %13) + %14 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %0, i32 %13) %15 = load i32, ptr %14, align 4 - %16 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %2, i32 %9) + %16 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %2, i32 %9) store i32 %15, ptr %16, align 4 br label %main.exit main.exit: ; preds = %if.then.i, %if.then2.i, %if.else6.i %17 = load i32, ptr addrspace(2) @f, align 4 %18 = load i32, ptr addrspace(2) @g, align 4 - %19 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %2, i32 %18) + %19 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %2, i32 %18) %20 = load i32, ptr %19, align 4 %add.i = add i32 %20, %17 store i32 %add.i, ptr %19, align 4 diff --git a/llvm/test/Transforms/SimplifyCFG/token_like_type.ll b/llvm/test/Transforms/SimplifyCFG/token_like_type.ll index 21a14ccebed86..14eaea7ffdc58 100644 --- a/llvm/test/Transforms/SimplifyCFG/token_like_type.ll +++ b/llvm/test/Transforms/SimplifyCFG/token_like_type.ll @@ -14,11 +14,11 @@ define half @CSMain() local_unnamed_addr { ; CHECK-NEXT: br i1 [[TOBOOL_NOT_I]], label %[[IF_ELSE_I:.*]], label %[[IF_THEN_I:.*]] ; CHECK: [[IF_THEN_I]]: ; CHECK-NEXT: [[IFSTMTCALLRAWBUFFERBINDING:%.*]] = tail call target("dx.RawBuffer", half, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f16_1_0t(i32 1, i32 0, i32 1, i32 0, ptr nonnull @.str) -; CHECK-NEXT: [[IFSTMTCALLRESOURCEGEP:%.*]] = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) [[IFSTMTCALLRAWBUFFERBINDING]], i32 [[LOADGLOBAL]]) +; CHECK-NEXT: [[IFSTMTCALLRESOURCEGEP:%.*]] = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) [[IFSTMTCALLRAWBUFFERBINDING]], i32 [[LOADGLOBAL]]) ; CHECK-NEXT: br label %[[_Z6CSMAINV_EXIT:.*]] ; CHECK: [[IF_ELSE_I]]: ; CHECK-NEXT: [[CALL2NDRAWBUFFERBINDING:%.*]] = tail call target("dx.RawBuffer", half, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f16_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str) -; CHECK-NEXT: [[ELSESTMTCALLRESOURCEGEP:%.*]] = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) [[CALL2NDRAWBUFFERBINDING]], i32 [[LOADGLOBAL]]) +; CHECK-NEXT: [[ELSESTMTCALLRESOURCEGEP:%.*]] = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) [[CALL2NDRAWBUFFERBINDING]], i32 [[LOADGLOBAL]]) ; CHECK-NEXT: br label %[[_Z6CSMAINV_EXIT]] ; CHECK: [[_Z6CSMAINV_EXIT]]: ; CHECK-NEXT: [[DOTSINK1:%.*]] = phi ptr [ [[IFSTMTCALLRESOURCEGEP]], %[[IF_THEN_I]] ], [ [[ELSESTMTCALLRESOURCEGEP]], %[[IF_ELSE_I]] ] @@ -31,12 +31,12 @@ define half @CSMain() local_unnamed_addr { if.then.i: ; preds = %entry %ifStmtcallRawBufferBinding = tail call target("dx.RawBuffer", half, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f16_1_0t(i32 1, i32 0, i32 1, i32 0, ptr nonnull @.str) - %ifStmtCallResourceGEP = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) %ifStmtcallRawBufferBinding, i32 %loadGlobal) + %ifStmtCallResourceGEP = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) %ifStmtcallRawBufferBinding, i32 %loadGlobal) br label %_Z6CSMainv.exit if.else.i: ; preds = %entry %call2ndRawBufferBinding = tail call target("dx.RawBuffer", half, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f16_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str) - %elseStmtCallResourceGEP = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t(target("dx.RawBuffer", half, 1, 0) %call2ndRawBufferBinding, i32 %loadGlobal) + %elseStmtCallResourceGEP = tail call noundef nonnull align 2 dereferenceable(2) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f16_1_0t.i32(target("dx.RawBuffer", half, 1, 0) %call2ndRawBufferBinding, i32 %loadGlobal) br label %_Z6CSMainv.exit _Z6CSMainv.exit: ; preds = %if.else.i, %if.then.i _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
