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

Reply via email to