[llvm-branch-commits] [clang] [HLSL] Implement Texture1D and its variants (PR #221061)

Deric C. via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Sep 11 13:52:52 PDT 2026


https://github.com/Icohedron updated https://github.com/llvm/llvm-project/pull/221061

>From 1b30e18e97dcaf21896f49f57e9a68f1a1c17c90 Mon Sep 17 00:00:00 2001
From: Deric Cheung <cheung.deric at gmail.com>
Date: Wed, 19 Aug 2026 15:32:55 -0700
Subject: [PATCH 1/6] [HLSL] Implement Texture1D and its variants

---
 clang/lib/CodeGen/CGHLSLBuiltins.cpp          |  19 +-
 clang/lib/CodeGen/Targets/DirectX.cpp         |   3 +-
 clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp |  89 ++--
 clang/lib/Sema/HLSLExternalSemaSource.cpp     |  14 +
 clang/test/AST/HLSL/Textures-AST.hlsl         | 275 ++++++-----
 clang/test/AST/HLSL/Textures-scalar-AST.hlsl  | 388 ++++++++-------
 .../test/AST/HLSL/Textures-shorthand-AST.hlsl |  23 +-
 clang/test/AST/HLSL/Textures-vector-AST.hlsl  | 388 ++++++++-------
 .../Textures-CalculateLevelOfDetail.hlsl      | 188 +++++---
 .../CodeGenHLSL/resources/Textures-Load.hlsl  | 452 ++++++++++++------
 .../CodeGenHLSL/resources/Textures-Mips.hlsl  | 109 +++--
 .../resources/Textures-Sample.hlsl            | 244 ++++++----
 .../resources/Textures-SampleBias.hlsl        | 213 ++++++---
 .../resources/Textures-SampleCmp.hlsl         | 196 +++++---
 .../Textures-SampleCmpLevelZero.hlsl          | 170 +++++--
 .../resources/Textures-SampleGrad.hlsl        | 296 ++++++++----
 .../resources/Textures-SampleLevel.hlsl       | 217 ++++++---
 .../resources/Textures-Subscript.hlsl         | 345 +++++++++----
 .../resources/Textures-default.hlsl           |  71 ++-
 .../Textures-CalculateLevelOfDetail.hlsl      |   9 +
 .../Resources/Textures-SampleBias.hlsl        |   8 +
 .../Resources/Textures-SampleCmp.hlsl         |  12 +-
 .../Textures-SampleCmpLevelZero.hlsl          |  12 +-
 .../Resources/Textures-SampleGrad.hlsl        |   8 +
 .../Resources/Textures-SampleLevel.hlsl       |   8 +
 .../SemaHLSL/Resources/Textures-Sema.hlsl     |  14 +-
 .../Resources/Textures-Subscript.hlsl         |  83 +++-
 .../Resources/Textures-declaration-order.hlsl |  28 +-
 .../Resources/Textures-mips-errors.hlsl       |  20 +-
 .../Textures-unsupported-methods-errors.hlsl  |  42 +-
 30 files changed, 2596 insertions(+), 1348 deletions(-)

diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
index 45b3d8ab27a25..9926cd78fd147 100644
--- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp
+++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
@@ -803,13 +803,18 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
       unsigned NumElts = CoordLODVecTy->getNumElements();
       assert(NumElts >= 2 && "CoordLOD must have at least 2 elements");
 
-      // Split CoordLOD into Coord and LOD
-      SmallVector<int, 4> Mask;
-      for (unsigned I = 0; I < NumElts - 1; ++I)
-        Mask.push_back(I);
-
-      CoordOp =
-          Builder.CreateShuffleVector(CoordLODOp, Mask, "hlsl.load.coord");
+      // Split CoordLOD into Coord and LOD. 1D resources use a scalar
+      // coordinate rather than a 1-element vector.
+      if (NumElts == 2) {
+        CoordOp = Builder.CreateExtractElement(CoordLODOp, uint64_t(0),
+                                               "hlsl.load.coord");
+      } else {
+        SmallVector<int, 4> Mask;
+        for (unsigned I = 0; I < NumElts - 1; ++I)
+          Mask.push_back(I);
+        CoordOp =
+            Builder.CreateShuffleVector(CoordLODOp, Mask, "hlsl.load.coord");
+      }
       LODOp = Builder.CreateExtractElement(CoordLODOp, NumElts - 1,
                                            "hlsl.load.lod");
     }
diff --git a/clang/lib/CodeGen/Targets/DirectX.cpp b/clang/lib/CodeGen/Targets/DirectX.cpp
index e2c918d861e35..f5a5b565d948f 100644
--- a/clang/lib/CodeGen/Targets/DirectX.cpp
+++ b/clang/lib/CodeGen/Targets/DirectX.cpp
@@ -109,7 +109,8 @@ llvm::Type *DirectXTargetCodeGenInfo::getHLSLType(
       llvm::dxil::ResourceKind RK = llvm::dxil::ResourceKind::Invalid;
       switch (ResAttrs.ResourceDimension) {
       case llvm::dxil::ResourceDimension::Dim1D:
-        RK = llvm::dxil::ResourceKind::Texture1D;
+        RK = ResAttrs.IsArray ? llvm::dxil::ResourceKind::Texture1DArray
+                              : llvm::dxil::ResourceKind::Texture1D;
         break;
       case llvm::dxil::ResourceDimension::Dim2D:
         if (ResAttrs.isMultiSampled())
diff --git a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
index 5d499b7d6a96b..1e1cb97b0d132 100644
--- a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
+++ b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
@@ -88,6 +88,12 @@ convertParamModifierToParamABI(HLSLParamModifierAttr::Spelling Modifier) {
   }
 }
 
+QualType getVectorOrScalarType(ASTContext &AST, QualType Ty,
+                               uint32_t NumElements) {
+  assert(NumElements > 0 && "Cannot create a zero-element type");
+  return NumElements > 1 ? AST.getExtVectorType(Ty, NumElements) : Ty;
+}
+
 QualType getInoutParameterType(ASTContext &AST, QualType Ty) {
   assert(!Ty->isReferenceType() &&
          "Pointer and reference types cannot be inout or out parameters");
@@ -689,24 +695,27 @@ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::concat(V Vec, S Scalar,
                                                            QualType ResultTy) {
   assert(ResultTy->isVectorType() && "The result type must be a vector type.");
   Expr *VecExpr = convertPlaceholder(Vec);
-  auto *VecTy = VecExpr->getType()->castAs<VectorType>();
   Expr *ScalarExpr = convertPlaceholder(Scalar);
 
-  // Save the vector to a local variable to avoid evaluating the placeholder
-  // multiple times or sharing the AST node.
-  LocalVar VecVar("vec_tmp", VecTy->desugar());
-  declareLocalVar(VecVar);
-  assign(VecVar, VecExpr);
-
-  QualType EltTy = VecTy->getElementType();
-  unsigned NumElts = VecTy->getNumElements();
-
   ASTContext &AST = getASTContext();
   SmallVector<Expr *, 4> Elts;
-  for (unsigned I = 0; I < NumElts; ++I) {
-    Elts.push_back(new (AST) ArraySubscriptExpr(
-        convertPlaceholder(VecVar), DeclBuilder.getConstantIntExpr(I), EltTy,
-        VK_PRValue, OK_Ordinary, SourceLocation()));
+  if (const auto *VecTy = VecExpr->getType()->getAs<VectorType>()) {
+    // Save the vector to a local variable to avoid evaluating the placeholder
+    // multiple times or sharing the AST node.
+    LocalVar VecVar("vec_tmp", VecTy->desugar());
+    declareLocalVar(VecVar);
+    assign(VecVar, VecExpr);
+
+    QualType EltTy = VecTy->getElementType();
+    unsigned NumElts = VecTy->getNumElements();
+
+    for (unsigned I = 0; I < NumElts; ++I) {
+      Elts.push_back(new (AST) ArraySubscriptExpr(
+          convertPlaceholder(VecVar), DeclBuilder.getConstantIntExpr(I), EltTy,
+          VK_PRValue, OK_Ordinary, SourceLocation()));
+    }
+  } else {
+    Elts.push_back(VecExpr);
   }
   Elts.push_back(ScalarExpr);
 
@@ -1456,9 +1465,7 @@ BuiltinTypeDeclBuilder::addArraySubscriptOperators(ResourceDimension Dim,
   if (Dim != ResourceDimension::Unknown)
     VecSize = getResourceDimensions(Dim) + (IsArray ? 1 : 0);
 
-  QualType IndexTy = VecSize > 1
-                         ? AST.getExtVectorType(AST.UnsignedIntTy, VecSize)
-                         : AST.UnsignedIntTy;
+  QualType IndexTy = getVectorOrScalarType(AST, AST.UnsignedIntTy, VecSize);
 
   DeclarationName Subscript =
       AST.DeclarationNames.getCXXOperatorName(OO_Subscript);
@@ -1492,7 +1499,7 @@ CXXRecordDecl *BuiltinTypeDeclBuilder::addMipsSliceType(ResourceDimension Dim,
   uint32_t VecSize =
       getResourceDimensions(Dim) + (getResourceAttrs().IsArray ? 1 : 0);
   QualType IntTy = AST.IntTy;
-  QualType IndexTy = VecSize > 1 ? AST.getExtVectorType(IntTy, VecSize) : IntTy;
+  QualType IndexTy = getVectorOrScalarType(AST, IntTy, VecSize);
   QualType CoordLevelTy = AST.getExtVectorType(IntTy, VecSize + 1);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
@@ -1606,8 +1613,8 @@ BuiltinTypeDeclBuilder::addTextureLoadMethods(ResourceDimension Dim,
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 2 : 1);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
-  QualType LocationTy = AST.getExtVectorType(IntTy, CoordSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
+  QualType LocationTy = getVectorOrScalarType(AST, IntTy, CoordSize);
   QualType ReturnType = getHandleElementType();
 
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
@@ -1638,7 +1645,7 @@ BuiltinTypeDeclBuilder::addRWTextureLoadMethods(ResourceDimension Dim,
   ASTContext &AST = Record->getASTContext();
   // A UAV binds a single mip slice: no mip component, no offset overload.
   uint32_t CoordSize = getResourceDimensions(Dim) + (IsArray ? 1 : 0);
-  QualType LocationTy = AST.getExtVectorType(AST.IntTy, CoordSize);
+  QualType LocationTy = getVectorOrScalarType(AST, AST.IntTy, CoordSize);
   QualType ReturnType = getHandleElementType();
 
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
@@ -1662,8 +1669,8 @@ BuiltinTypeDeclBuilder::addTextureLoadMSMethods(ResourceDimension Dim,
   // Multisampled textures use a plain location (no mip/LOD component).
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
-  QualType LocationTy = AST.getExtVectorType(IntTy, CoordSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
+  QualType LocationTy = getVectorOrScalarType(AST, IntTy, CoordSize);
   QualType ReturnType = getHandleElementType();
 
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
@@ -1812,9 +1819,9 @@ BuiltinTypeDeclBuilder::addSampleMethods(ResourceDimension Dim, bool IsArray) {
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType FloatTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(FloatTy, CoordSize);
+  QualType CoordTy = getVectorOrScalarType(AST, FloatTy, CoordSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // T Sample(SamplerState s, float2 location)
@@ -1882,9 +1889,9 @@ BuiltinTypeDeclBuilder::addSampleBiasMethods(ResourceDimension Dim,
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType FloatTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(FloatTy, CoordSize);
+  QualType CoordTy = getVectorOrScalarType(AST, FloatTy, CoordSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // T SampleBias(SamplerState s, float2 location, float bias)
@@ -1957,10 +1964,10 @@ BuiltinTypeDeclBuilder::addSampleGradMethods(ResourceDimension Dim,
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType FloatTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(FloatTy, CoordSize);
-  QualType OffsetFloatTy = AST.getExtVectorType(FloatTy, OffsetSize);
+  QualType CoordTy = getVectorOrScalarType(AST, FloatTy, CoordSize);
+  QualType OffsetFloatTy = getVectorOrScalarType(AST, FloatTy, OffsetSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // T SampleGrad(SamplerState s, float2 location, float2 ddx, float2 ddy)
@@ -2037,9 +2044,9 @@ BuiltinTypeDeclBuilder::addSampleLevelMethods(ResourceDimension Dim,
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType FloatTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(FloatTy, CoordSize);
+  QualType CoordTy = getVectorOrScalarType(AST, FloatTy, CoordSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // T SampleLevel(SamplerState s, float2 location, float lod)
@@ -2083,9 +2090,9 @@ BuiltinTypeDeclBuilder::addSampleCmpMethods(ResourceDimension Dim,
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType FloatTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(FloatTy, CoordSize);
+  QualType CoordTy = getVectorOrScalarType(AST, FloatTy, CoordSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // T SampleCmp(SamplerComparisonState s, float2 location, float compare_value)
@@ -2160,9 +2167,9 @@ BuiltinTypeDeclBuilder::addSampleCmpLevelZeroMethods(ResourceDimension Dim,
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType FloatTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(FloatTy, CoordSize);
+  QualType CoordTy = getVectorOrScalarType(AST, FloatTy, CoordSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // T SampleCmpLevelZero(SamplerComparisonState s, float2 location, float
@@ -2253,7 +2260,7 @@ BuiltinTypeDeclBuilder::addCalculateLodMethods(ResourceDimension Dim) {
       lookupBuiltinType(SemaRef, "SamplerState", Record->getDeclContext());
   uint32_t VecSize = getResourceDimensions(Dim);
   QualType FloatTy = AST.FloatTy;
-  QualType LocationTy = AST.getExtVectorType(FloatTy, VecSize);
+  QualType LocationTy = getVectorOrScalarType(AST, FloatTy, VecSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // float CalculateLevelOfDetail(SamplerState s, float2 location)
@@ -2304,9 +2311,9 @@ BuiltinTypeDeclBuilder::addGatherMethods(ResourceDimension Dim, bool IsArray) {
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType LocationTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(LocationTy, CoordSize);
+  QualType CoordTy = getVectorOrScalarType(AST, LocationTy, CoordSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // Overloads for Gather, GatherRed, GatherGreen, GatherBlue, GatherAlpha
@@ -2362,9 +2369,9 @@ BuiltinTypeDeclBuilder::addGatherCmpMethods(ResourceDimension Dim,
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 1 : 0);
   QualType FloatTy = AST.FloatTy;
-  QualType CoordTy = AST.getExtVectorType(FloatTy, CoordSize);
+  QualType CoordTy = getVectorOrScalarType(AST, FloatTy, CoordSize);
   QualType IntTy = AST.IntTy;
-  QualType OffsetTy = AST.getExtVectorType(IntTy, OffsetSize);
+  QualType OffsetTy = getVectorOrScalarType(AST, IntTy, OffsetSize);
   using PH = BuiltinTypeMethodBuilder::PlaceHolder;
 
   // Overloads for GatherCmp, GatherCmpRed, GatherCmpGreen, GatherCmpBlue,
diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp
index bbd8ca99cb797..3f56792b5ff66 100644
--- a/clang/lib/Sema/HLSLExternalSemaSource.cpp
+++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp
@@ -302,6 +302,20 @@ struct TextureTypeInfo {
 } // namespace
 
 static const TextureTypeInfo TextureTypes[] = {
+    {"Texture1D", ResourceClass::SRV, ResourceDimension::Dim1D,
+     /*IsArray=*/false, /*IsROV=*/false, TemplateShape::ElementType,
+     TexCap::Load | TexCap::Subscript | TexCap::Mips | TexCap::Sample |
+         TexCap::SampleCmp | TexCap::CalcLOD},
+    {"RWTexture1D", ResourceClass::UAV, ResourceDimension::Dim1D,
+     /*IsArray=*/false, /*IsROV=*/false, TemplateShape::ElementType,
+     TexCap::LoadRW | TexCap::Subscript},
+    {"Texture1DArray", ResourceClass::SRV, ResourceDimension::Dim1D,
+     /*IsArray=*/true, /*IsROV=*/false, TemplateShape::ElementType,
+     TexCap::Load | TexCap::Subscript | TexCap::Mips | TexCap::Sample |
+         TexCap::SampleCmp | TexCap::CalcLOD},
+    {"RWTexture1DArray", ResourceClass::UAV, ResourceDimension::Dim1D,
+     /*IsArray=*/true, /*IsROV=*/false, TemplateShape::ElementType,
+     TexCap::LoadRW | TexCap::Subscript},
     {"Texture2D", ResourceClass::SRV, ResourceDimension::Dim2D,
      /*IsArray=*/false, /*IsROV=*/false, TemplateShape::ElementType,
      TexCap::Load | TexCap::Subscript | TexCap::Mips | TexCap::Sample |
diff --git a/clang/test/AST/HLSL/Textures-AST.hlsl b/clang/test/AST/HLSL/Textures-AST.hlsl
index 6e5655f0cbafd..9196c584d0767 100644
--- a/clang/test/AST/HLSL/Textures-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-AST.hlsl
@@ -1,23 +1,61 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
+// RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
+// RUN:   -DTEXTURE=Texture2D -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,GETDIM,GETDIM-SRV -DTEXTURE=Texture2D \
+// RUN:   -DINDEX_DIM=2 -DDIM_NAME=2D -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DLOCATION_TYPE="vector<int, 2>"
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture2D -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV -DTEXTURE=Texture2D \
-// RUN:   -DINDEX_DIM=2 -DDIM_NAME=2D
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture1D -o - %s | FileCheck \
+// RUN:   %s --check-prefixes=CHECK,SRV -DTEXTURE=Texture1D -DINDEX_DIM=1 \
+// RUN:   -DDIM_NAME=1D -DINDEX_TYPE="unsigned int" -DLOCATION_TYPE=int
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
+// RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
+// RUN:   -DTEXTURE=Texture2DArray -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,SRV-ARRAY,GETDIM,GETDIM-SRV,GETDIM-SRV-ARRAY \
+// RUN:   -DTEXTURE=Texture2DArray -DINDEX_DIM=3 -DDIM_NAME=2D \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DLOCATION_TYPE="vector<int, 3>"
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture2DArray -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,SRV-ARRAY \
-// RUN:   -DTEXTURE=Texture2DArray -DINDEX_DIM=3 -DDIM_NAME=2D
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture1DArray -o - %s | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,SRV,SRV-ARRAY \
+// RUN:   -DTEXTURE=Texture1DArray -DINDEX_DIM=2 -DDIM_NAME=1D \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DLOCATION_TYPE="vector<int, 2>"
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
+// RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
+// RUN:   -DTEXTURE=RWTexture2D -DRW=1 -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,UAV-STORE,UAV-TRUNC,GETDIM,GETDIM-UAV \
+// RUN:   -DTEXTURE=RWTexture2D -DINDEX_DIM=2 -DDIM_NAME=2D \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DLOCATION_TYPE="vector<int, 2>" -DTRUNC_TYPE="vector<uint, 2>"
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture2D -DRW=1 -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,UAV-STORE,UAV-TRUNC \
-// RUN:   -DTEXTURE=RWTexture2D -DINDEX_DIM=2 -DDIM_NAME=2D
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture1D -DRW=1 -o - %s | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,UAV-STORE,UAV-TRUNC \
+// RUN:   -DTEXTURE=RWTexture1D -DINDEX_DIM=1 -DDIM_NAME=1D \
+// RUN:   -DINDEX_TYPE="unsigned int" -DLOCATION_TYPE=int \
+// RUN:   -DTRUNC_TYPE="uint':'unsigned int"
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
+// RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
+// RUN:   -DTEXTURE=RWTexture2DArray -DRW=1 -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,UAV-ARRAY,UAV-STORE,UAV-NOTRUNC,GETDIM,GETDIM-UAV,GETDIM-UAV-ARRAY \
+// RUN:   -DTEXTURE=RWTexture2DArray -DINDEX_DIM=3 -DDIM_NAME=2D \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DLOCATION_TYPE="vector<int, 3>"
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture2DArray -DRW=1 -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,UAV-ARRAY,UAV-STORE,UAV-NOTRUNC \
-// RUN:   -DTEXTURE=RWTexture2DArray -DINDEX_DIM=3 -DDIM_NAME=2D
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture1DArray -DRW=1 -o - \
+// RUN:   %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,UAV-ARRAY,UAV-STORE,UAV-TRUNC \
+// RUN:   -DTEXTURE=RWTexture1DArray -DINDEX_DIM=2 -DDIM_NAME=1D \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DLOCATION_TYPE="vector<int, 2>" -DTRUNC_TYPE="vector<uint, 2>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -26,6 +64,8 @@
 //   INDEX_ARG          a literal operator[] index
 //   TEXTURE            resource type name
 //   INDEX_DIM          operator[] index components
+//   INDEX_TYPE         operator[] index type
+//   LOCATION_TYPE      Load location type
 //   DIM_NAME           hlsl::dimension spelling
 //   RW                 dx.Texture UAV operand
 //
@@ -37,6 +77,11 @@
 //   UAV-TRUNC          types whose index is narrower than INDEX_ARG_TYPE
 //   UAV-ARRAY          writable array textures
 //   UAV-NOTRUNC        types whose index matches INDEX_ARG_TYPE
+//   GETDIM             types that have the GetDimensions overloads
+//   GETDIM-SRV         read-only textures that have GetDimensions
+//   GETDIM-UAV         writable textures that have GetDimensions
+//   GETDIM-SRV-ARRAY   read-only array textures that have GetDimensions
+//   GETDIM-UAV-ARRAY   writable array textures that have GetDimensions
 
 // CHECK: ClassTemplateDecl {{.*}} [[TEXTURE]]
 // CHECK: TemplateTypeParmDecl {{.*}} element_type
@@ -50,8 +95,8 @@
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
 // CHECK-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
 
-// UAV: CXXMethodDecl {{.*}} Load 'element_type (vector<int, [[INDEX_DIM]]>)' inline
-// UAV-NEXT: ParmVarDecl {{.*}} Location 'vector<int, [[INDEX_DIM]]>'
+// UAV: CXXMethodDecl {{.*}} Load 'element_type ([[LOCATION_TYPE]])' inline
+// UAV-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // UAV-NEXT: CompoundStmt
 // UAV-NEXT: ReturnStmt
 // UAV-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -64,11 +109,11 @@
 // UAV-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
 // UAV-SAME: ' lvalue .__handle
 // UAV-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// UAV-NEXT: DeclRefExpr {{.*}} 'vector<int, [[INDEX_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<int, [[INDEX_DIM]]>'
+// UAV-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // UAV-NEXT: AlwaysInlineAttr
 
-// SRV: CXXMethodDecl {{.*}} operator[] 'const hlsl_device element_type &(vector<unsigned int, [[INDEX_DIM]]>) const' inline
-// SRV-NEXT: ParmVarDecl {{.*}} Index 'vector<unsigned int, [[INDEX_DIM]]>'
+// SRV: CXXMethodDecl {{.*}} operator[] 'const hlsl_device element_type &([[INDEX_TYPE]]) const' inline
+// SRV-NEXT: ParmVarDecl {{.*}} Index '[[INDEX_TYPE]]'
 // SRV-NEXT: CompoundStmt
 // SRV-NEXT: ReturnStmt
 // SRV-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' lvalue prefix '*' cannot overflow
@@ -82,11 +127,11 @@
 // SRV-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
 // SRV-SAME: ' lvalue .__handle
 // SRV-NEXT: CXXThisExpr {{.*}} 'const hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// SRV-NEXT: DeclRefExpr {{.*}} 'vector<unsigned int, [[INDEX_DIM]]>' lvalue ParmVar {{.*}} 'Index' 'vector<unsigned int, [[INDEX_DIM]]>'
+// SRV-NEXT: DeclRefExpr {{.*}} '[[INDEX_TYPE]]' lvalue ParmVar {{.*}} 'Index' '[[INDEX_TYPE]]'
 // SRV-NEXT: AlwaysInlineAttr
 
-// UAV: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &(vector<unsigned int, [[INDEX_DIM]]>) const' inline
-// UAV-NEXT: ParmVarDecl {{.*}} Index 'vector<unsigned int, [[INDEX_DIM]]>'
+// UAV: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &([[INDEX_TYPE]]) const' inline
+// UAV-NEXT: ParmVarDecl {{.*}} Index '[[INDEX_TYPE]]'
 // UAV-NEXT: CompoundStmt
 // UAV-NEXT: ReturnStmt
 // UAV-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' lvalue prefix '*' cannot overflow
@@ -100,102 +145,102 @@
 // UAV-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
 // UAV-SAME: ' lvalue .__handle
 // UAV-NEXT: CXXThisExpr {{.*}} 'const hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// UAV-NEXT: DeclRefExpr {{.*}} 'vector<unsigned int, [[INDEX_DIM]]>' lvalue ParmVar {{.*}} 'Index' 'vector<unsigned int, [[INDEX_DIM]]>'
+// UAV-NEXT: DeclRefExpr {{.*}} '[[INDEX_TYPE]]' lvalue ParmVar {{.*}} 'Index' '[[INDEX_TYPE]]'
 // UAV-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} GetDimensions 'void (out unsigned int, out unsigned int)'
-// CHECK-NEXT: ParmVarDecl {{.*}} width 'unsigned int &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: ParmVarDecl {{.*}} height 'unsigned int &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_xy' 'void (__hlsl_resource_t, unsigned int &, unsigned int &) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
-// UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
-// SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// CHECK-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// CHECK-SAME: ' lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'width' 'unsigned int &__restrict'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'height' 'unsigned int &__restrict'
-// CHECK-NEXT: AlwaysInlineAttr
+// GETDIM: CXXMethodDecl {{.*}} GetDimensions 'void (out unsigned int, out unsigned int)'
+// GETDIM-NEXT: ParmVarDecl {{.*}} width 'unsigned int &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: ParmVarDecl {{.*}} height 'unsigned int &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: CompoundStmt
+// GETDIM-NEXT: CallExpr {{.*}} '<dependent type>'
+// GETDIM-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_xy' 'void (__hlsl_resource_t, unsigned int &, unsigned int &) noexcept'
+// GETDIM-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// GETDIM-SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// GETDIM-UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
+// GETDIM-SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// GETDIM-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// GETDIM-SAME: ' lvalue .__handle
+// GETDIM-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'width' 'unsigned int &__restrict'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'height' 'unsigned int &__restrict'
+// GETDIM-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} GetDimensions 'void (unsigned int, out unsigned int, out unsigned int, out unsigned int)'
-// CHECK-NEXT: ParmVarDecl {{.*}} mipLevel 'unsigned int'
-// CHECK-NEXT: ParmVarDecl {{.*}} width 'unsigned int &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: ParmVarDecl {{.*}} height 'unsigned int &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: ParmVarDecl {{.*}} numberOfLevels 'unsigned int &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_levels_xy' 'void (__hlsl_resource_t, unsigned int, unsigned int &, unsigned int &, unsigned int &) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
-// UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
-// SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// CHECK-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// CHECK-SAME: ' lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'mipLevel' 'unsigned int'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'width' 'unsigned int &__restrict'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'height' 'unsigned int &__restrict'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'numberOfLevels' 'unsigned int &__restrict'
-// CHECK-NEXT: AlwaysInlineAttr
+// GETDIM: CXXMethodDecl {{.*}} GetDimensions 'void (unsigned int, out unsigned int, out unsigned int, out unsigned int)'
+// GETDIM-NEXT: ParmVarDecl {{.*}} mipLevel 'unsigned int'
+// GETDIM-NEXT: ParmVarDecl {{.*}} width 'unsigned int &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: ParmVarDecl {{.*}} height 'unsigned int &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: ParmVarDecl {{.*}} numberOfLevels 'unsigned int &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: CompoundStmt
+// GETDIM-NEXT: CallExpr {{.*}} '<dependent type>'
+// GETDIM-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_levels_xy' 'void (__hlsl_resource_t, unsigned int, unsigned int &, unsigned int &, unsigned int &) noexcept'
+// GETDIM-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// GETDIM-SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// GETDIM-UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
+// GETDIM-SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// GETDIM-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// GETDIM-SAME: ' lvalue .__handle
+// GETDIM-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'mipLevel' 'unsigned int'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'width' 'unsigned int &__restrict'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'height' 'unsigned int &__restrict'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'numberOfLevels' 'unsigned int &__restrict'
+// GETDIM-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} GetDimensions 'void (out float, out float)'
-// CHECK-NEXT: ParmVarDecl {{.*}} width 'float &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: ParmVarDecl {{.*}} height 'float &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_xy_float' 'void (__hlsl_resource_t, float &, float &) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
-// UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
-// SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// CHECK-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// CHECK-SAME: ' lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'width' 'float &__restrict'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'height' 'float &__restrict'
-// CHECK-NEXT: AlwaysInlineAttr
+// GETDIM: CXXMethodDecl {{.*}} GetDimensions 'void (out float, out float)'
+// GETDIM-NEXT: ParmVarDecl {{.*}} width 'float &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: ParmVarDecl {{.*}} height 'float &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: CompoundStmt
+// GETDIM-NEXT: CallExpr {{.*}} '<dependent type>'
+// GETDIM-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_xy_float' 'void (__hlsl_resource_t, float &, float &) noexcept'
+// GETDIM-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// GETDIM-SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// GETDIM-UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
+// GETDIM-SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// GETDIM-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// GETDIM-SAME: ' lvalue .__handle
+// GETDIM-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'width' 'float &__restrict'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'height' 'float &__restrict'
+// GETDIM-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} GetDimensions 'void (unsigned int, out float, out float, out float)'
-// CHECK-NEXT: ParmVarDecl {{.*}} mipLevel 'unsigned int'
-// CHECK-NEXT: ParmVarDecl {{.*}} width 'float &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: ParmVarDecl {{.*}} height 'float &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: ParmVarDecl {{.*}} numberOfLevels 'float &__restrict'
-// CHECK-NEXT: HLSLParamModifierAttr {{.*}} out
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_levels_xy_float' 'void (__hlsl_resource_t, unsigned int, float &, float &, float &) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
-// UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
-// SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// CHECK-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// CHECK-SAME: ' lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'mipLevel' 'unsigned int'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'width' 'float &__restrict'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'height' 'float &__restrict'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'numberOfLevels' 'float &__restrict'
-// CHECK-NEXT: AlwaysInlineAttr
+// GETDIM: CXXMethodDecl {{.*}} GetDimensions 'void (unsigned int, out float, out float, out float)'
+// GETDIM-NEXT: ParmVarDecl {{.*}} mipLevel 'unsigned int'
+// GETDIM-NEXT: ParmVarDecl {{.*}} width 'float &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: ParmVarDecl {{.*}} height 'float &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: ParmVarDecl {{.*}} numberOfLevels 'float &__restrict'
+// GETDIM-NEXT: HLSLParamModifierAttr {{.*}} out
+// GETDIM-NEXT: CompoundStmt
+// GETDIM-NEXT: CallExpr {{.*}} '<dependent type>'
+// GETDIM-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getdimensions_levels_xy_float' 'void (__hlsl_resource_t, unsigned int, float &, float &, float &) noexcept'
+// GETDIM-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// GETDIM-SRV-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// GETDIM-UAV-SAME{LITERAL}: [[hlsl::resource_class("UAV")]]
+// GETDIM-SRV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-UAV-ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
+// GETDIM-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// GETDIM-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// GETDIM-SAME: ' lvalue .__handle
+// GETDIM-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'unsigned int' lvalue ParmVar {{.*}} 'mipLevel' 'unsigned int'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'width' 'float &__restrict'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'height' 'float &__restrict'
+// GETDIM-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'numberOfLevels' 'float &__restrict'
+// GETDIM-NEXT: AlwaysInlineAttr
 
 // CHECK: ClassTemplatePartialSpecializationDecl {{.*}} class [[TEXTURE]] explicit_specialization
 // CHECK: TemplateTypeParmDecl {{.*}} element_type
@@ -206,11 +251,11 @@
 // UAV-STORE-LABEL: FunctionDecl {{.*}} main 'void ()'
 // UAV-STORE: BinaryOperator {{.*}} 'hlsl_device float' lvalue '='
 // UAV-STORE-NEXT: CXXOperatorCallExpr {{.*}} 'hlsl_device float' lvalue '[]'
-// UAV-STORE-NEXT: ImplicitCastExpr {{.*}} 'hlsl_device float &(*)(vector<unsigned int, [[INDEX_DIM]]>) const' <FunctionToPointerDecay>
-// UAV-STORE-NEXT: DeclRefExpr {{.*}} 'hlsl_device float &(vector<unsigned int, [[INDEX_DIM]]>) const' lvalue CXXMethod {{.*}} 'operator[]' 'hlsl_device float &(vector<unsigned int, [[INDEX_DIM]]>) const'
+// UAV-STORE-NEXT: ImplicitCastExpr {{.*}} 'hlsl_device float &(*)([[INDEX_TYPE]]) const' <FunctionToPointerDecay>
+// UAV-STORE-NEXT: DeclRefExpr {{.*}} 'hlsl_device float &([[INDEX_TYPE]]) const' lvalue CXXMethod {{.*}} 'operator[]' 'hlsl_device float &([[INDEX_TYPE]]) const'
 // UAV-STORE-NEXT: ImplicitCastExpr {{.*}} 'const hlsl::[[TEXTURE]]<float>' lvalue <NoOp>
 // UAV-STORE-NEXT: DeclRefExpr {{.*}} '[[TEXTURE]]<float>':'hlsl::[[TEXTURE]]<float>' lvalue Var {{.*}} 't' '[[TEXTURE]]<float>':'hlsl::[[TEXTURE]]<float>'
-// UAV-TRUNC-NEXT: ImplicitCastExpr {{.*}} 'vector<uint, 2>' <HLSLVectorTruncation>
+// UAV-TRUNC-NEXT: ImplicitCastExpr {{.*}} '[[TRUNC_TYPE]]' <HLSLVectorTruncation>
 // UAV-TRUNC-NEXT: ImplicitCastExpr {{.*}} 'uint3':'vector<uint, 3>' <LValueToRValue>
 // UAV-TRUNC-NEXT: DeclRefExpr {{.*}} 'uint3':'vector<uint, 3>' lvalue Var {{.*}} 'i' 'uint3':'vector<uint, 3>'
 // UAV-NOTRUNC-NEXT: ImplicitCastExpr {{.*}} 'uint3':'vector<uint, 3>' <LValueToRValue>
@@ -226,6 +271,8 @@ void main() {
 #endif
   float x = t[i];
   (void)x;
+#ifdef HAS_GETDIM
   uint w, h;
   t.GetDimensions(w, h);
+#endif
 }
diff --git a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
index 1335863aa9d8b..da9f410295fe0 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -1,43 +1,81 @@
+// Texture1D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1D -DCOORD_TYPE=float \
+// RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc -DOFFSET_ARG="1" -o - %s | \
+// RUN:   FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
+// RUN:   -DTEXTURE=Texture1D -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=1 -DLOAD_DIM=2 \
+// RUN:   -DINDEX_TYPE="unsigned int" -DIS_ARRAY="" -DLOCATION_TYPE=float \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
+
+// Texture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 \
+// RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | \
+// RUN:   FileCheck %s \
+// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
+// RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=2 \
+// RUN:   -DLOAD_DIM=3 -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s \
-// RUN:   | FileCheck %s \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
-// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY=""
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
-// RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
-// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
-// RUN:   -DTEXTURE=TextureCube -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 \
-// RUN:   -DIS_ARRAY=""
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
-// RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
-// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
-// RUN:   -DTEXTURE=TextureCubeArray -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY="" \
+// RUN:   -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER \
 // RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 \
-// RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s \
-// RUN:   | FileCheck %s \
+// RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck \
+// RUN:   %s \
 // RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
 // RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
+
+// Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
-// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,TEXEL,OFFSET \
-// RUN:   -DTEXTURE=Texture3D -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
-// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY=""
+// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s | FileCheck \
+// RUN:   %s --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY="" \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCube \
+// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 -DIS_ARRAY="" \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCubeArray \
+// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 4>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -113,9 +151,9 @@
 // TEXEL-NEXT: DeclRefExpr {{.*}} 'vector<int, [[LOAD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<int, [[LOAD_DIM]]>'
 // TEXEL-NEXT: AlwaysInlineAttr
 
-// TEXEL: CXXMethodDecl {{.*}} Load 'element_type (vector<int, [[LOAD_DIM]]>, vector<int, [[DIM]]>)'
+// TEXEL: CXXMethodDecl {{.*}} Load 'element_type (vector<int, [[LOAD_DIM]]>, [[OFFSET_TYPE]])'
 // TEXEL-NEXT: ParmVarDecl {{.*}} Location 'vector<int, [[LOAD_DIM]]>'
-// TEXEL-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// TEXEL-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // TEXEL-NEXT: CompoundStmt
 // TEXEL-NEXT: ReturnStmt
 // TEXEL-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -129,7 +167,7 @@
 // TEXEL-SAME: ' lvalue .__handle
 // TEXEL-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
 // TEXEL-NEXT: DeclRefExpr {{.*}} 'vector<int, [[LOAD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<int, [[LOAD_DIM]]>'
-// TEXEL-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// TEXEL-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // TEXEL-NEXT: AlwaysInlineAttr
 
 // TEXEL: CXXMethodDecl {{.*}} operator[] 'const hlsl_device element_type &([[INDEX_TYPE]]) const' inline
@@ -150,9 +188,9 @@
 // TEXEL-NEXT: DeclRefExpr {{.*}} '[[INDEX_TYPE]]' lvalue ParmVar {{.*}} 'Index' '[[INDEX_TYPE]]'
 // TEXEL-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} Sample 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} Sample 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -167,13 +205,13 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} Sample 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} Sample 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -190,14 +228,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} Sample 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} Sample 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
@@ -215,14 +253,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleBias 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleBias 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} Bias 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -238,15 +276,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Bias' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleBias 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleBias 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Bias 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -263,16 +301,16 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Bias' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleBias 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} SampleBias 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Bias 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
@@ -290,17 +328,17 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Bias' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleGrad 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<float, [[DIM]]>, vector<float, [[DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} SampleGrad 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], [[GRADIENT_TYPE]], [[GRADIENT_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} DDX 'vector<float, [[DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} DDY 'vector<float, [[DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// CHECK-NEXT: ParmVarDecl {{.*}} DDX '[[GRADIENT_TYPE]]'
+// CHECK-NEXT: ParmVarDecl {{.*}} DDY '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -315,17 +353,17 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDX' 'vector<float, [[DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDY' 'vector<float, [[DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDX' '[[GRADIENT_TYPE]]'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDY' '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<float, [[DIM]]>, vector<float, [[DIM]]>, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], [[GRADIENT_TYPE]], [[GRADIENT_TYPE]], [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDX 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDY 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDX '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDY '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -342,18 +380,18 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDX' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDY' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDX' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDY' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<float, [[DIM]]>, vector<float, [[DIM]]>, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], [[GRADIENT_TYPE]], [[GRADIENT_TYPE]], [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDX 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDY 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDX '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDY '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
@@ -371,16 +409,16 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDX' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDY' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDX' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDY' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleLevel 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleLevel 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} LOD 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -396,15 +434,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'LOD' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleLevel 'element_type (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleLevel 'element_type (hlsl::SamplerState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} LOD 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'element_type' <Dependent>
@@ -421,14 +459,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'LOD' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // SAMPLECMP-NEXT: CompoundStmt
 // SAMPLECMP-NEXT: ReturnStmt
@@ -444,15 +482,15 @@
 // SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-SAME: ' lvalue .__handle
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // SAMPLECMP-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: CompoundStmt
 // SAMPLECMP-OFFSET-NEXT: ReturnStmt
 // SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -469,16 +507,16 @@
 // SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]], float)'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // SAMPLECMP-OFFSET-NEXT: CompoundStmt
 // SAMPLECMP-OFFSET-NEXT: ReturnStmt
@@ -496,15 +534,15 @@
 // SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // SAMPLECMP-NEXT: CompoundStmt
 // SAMPLECMP-NEXT: ReturnStmt
@@ -520,15 +558,15 @@
 // SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-SAME: ' lvalue .__handle
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // SAMPLECMP-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: CompoundStmt
 // SAMPLECMP-OFFSET-NEXT: ReturnStmt
 // SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -545,14 +583,14 @@
 // SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetail 'float (hlsl::SamplerState, vector<float, [[DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetail 'float (hlsl::SamplerState, [[GRADIENT_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -567,12 +605,12 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetailUnclamped 'float (hlsl::SamplerState, vector<float, [[DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetailUnclamped 'float (hlsl::SamplerState, [[GRADIENT_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -587,7 +625,7 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
 // GETDIM-XY: CXXMethodDecl {{.*}} GetDimensions 'void (out unsigned int, out unsigned int)'
@@ -676,9 +714,9 @@
 // GETDIM-XY-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'numberOfLevels' 'float &__restrict'
 // GETDIM-XY-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -688,14 +726,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -705,14 +743,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -722,14 +760,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -739,14 +777,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -756,14 +794,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -773,14 +811,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -790,14 +828,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -807,14 +845,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -824,14 +862,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -841,14 +879,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -859,16 +897,16 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
@@ -878,15 +916,15 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -897,14 +935,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -915,14 +953,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -933,16 +971,16 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
@@ -952,10 +990,10 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
 TEXTURE<float> t;
diff --git a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
index 98d58726ec7fc..e359d00c05d29 100644
--- a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
@@ -1,19 +1,26 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture1D -o \
+// RUN:   - %s | FileCheck %s -DTEXTURE=Texture1D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture1DArray -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D -o \
-// RUN:   - %s \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D
+// RUN:   - %s | FileCheck %s -DTEXTURE=Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
-// RUN:   -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube
+// RUN:   -o - %s | FileCheck %s -DTEXTURE=TextureCube
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=TextureCubeArray -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray
+// RUN:   -DTEXTURE=TextureCubeArray -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCubeArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture2DArray -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray
+// RUN:   -DTEXTURE=Texture2DArray -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray
+
+// Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture3D \
 // RUN:   -o - %s \
diff --git a/clang/test/AST/HLSL/Textures-vector-AST.hlsl b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
index 5086310bb7470..41f707ec8c182 100644
--- a/clang/test/AST/HLSL/Textures-vector-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
@@ -1,43 +1,81 @@
+// Texture1D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1D -DCOORD_TYPE=float \
+// RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc -DOFFSET_ARG="1" -o - %s | \
+// RUN:   FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
+// RUN:   -DTEXTURE=Texture1D -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=1 -DLOAD_DIM=2 \
+// RUN:   -DINDEX_TYPE="unsigned int" -DIS_ARRAY="" -DLOCATION_TYPE=float \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
+
+// Texture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 \
+// RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | \
+// RUN:   FileCheck %s \
+// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
+// RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=2 \
+// RUN:   -DLOAD_DIM=3 -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s \
-// RUN:   | FileCheck %s \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
-// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY=""
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
-// RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
-// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
-// RUN:   -DTEXTURE=TextureCube -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 \
-// RUN:   -DIS_ARRAY=""
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
-// RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
-// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
-// RUN:   -DTEXTURE=TextureCubeArray -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY="" \
+// RUN:   -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER \
 // RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 \
-// RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s \
-// RUN:   | FileCheck %s \
+// RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck \
+// RUN:   %s \
 // RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
 // RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
+
+// Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
-// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,TEXEL,OFFSET \
-// RUN:   -DTEXTURE=Texture3D -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
-// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY=""
+// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s | FileCheck \
+// RUN:   %s --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY="" \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCube \
+// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 -DIS_ARRAY="" \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCubeArray \
+// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 4>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -117,9 +155,9 @@
 // TEXEL-NEXT: DeclRefExpr {{.*}} 'vector<int, [[LOAD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<int, [[LOAD_DIM]]>'
 // TEXEL-NEXT: AlwaysInlineAttr
 
-// TEXEL: CXXMethodDecl {{.*}} Load 'vector<element_type, element_count> (vector<int, [[LOAD_DIM]]>, vector<int, [[DIM]]>)'
+// TEXEL: CXXMethodDecl {{.*}} Load 'vector<element_type, element_count> (vector<int, [[LOAD_DIM]]>, [[OFFSET_TYPE]])'
 // TEXEL-NEXT: ParmVarDecl {{.*}} Location 'vector<int, [[LOAD_DIM]]>'
-// TEXEL-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// TEXEL-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // TEXEL-NEXT: CompoundStmt
 // TEXEL-NEXT: ReturnStmt
 // TEXEL-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count>' <Dependent>
@@ -133,7 +171,7 @@
 // TEXEL-SAME: ' lvalue .__handle
 // TEXEL-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
 // TEXEL-NEXT: DeclRefExpr {{.*}} 'vector<int, [[LOAD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<int, [[LOAD_DIM]]>'
-// TEXEL-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// TEXEL-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // TEXEL-NEXT: AlwaysInlineAttr
 
 // TEXEL: CXXMethodDecl {{.*}} operator[] 'vector<element_type, element_count> const hlsl_device &([[INDEX_TYPE]]) const' inline
@@ -154,9 +192,9 @@
 // TEXEL-NEXT: DeclRefExpr {{.*}} '[[INDEX_TYPE]]' lvalue ParmVar {{.*}} 'Index' '[[INDEX_TYPE]]'
 // TEXEL-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} Sample 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} Sample 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count>' <Dependent>
@@ -171,13 +209,13 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} Sample 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} Sample 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count>' <Dependent>
@@ -194,14 +232,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} Sample 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} Sample 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
@@ -219,14 +257,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleBias 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleBias 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} Bias 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -242,15 +280,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Bias' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleBias 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleBias 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Bias 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count>' <Dependent>
@@ -267,16 +305,16 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Bias' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleBias 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} SampleBias 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Bias 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
@@ -294,17 +332,17 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Bias' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleGrad 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<float, [[DIM]]>, vector<float, [[DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} SampleGrad 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], [[GRADIENT_TYPE]], [[GRADIENT_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} DDX 'vector<float, [[DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} DDY 'vector<float, [[DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// CHECK-NEXT: ParmVarDecl {{.*}} DDX '[[GRADIENT_TYPE]]'
+// CHECK-NEXT: ParmVarDecl {{.*}} DDY '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count>' <Dependent>
@@ -319,17 +357,17 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDX' 'vector<float, [[DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDY' 'vector<float, [[DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDX' '[[GRADIENT_TYPE]]'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDY' '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<float, [[DIM]]>, vector<float, [[DIM]]>, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], [[GRADIENT_TYPE]], [[GRADIENT_TYPE]], [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDX 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDY 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDX '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDY '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count>' <Dependent>
@@ -346,18 +384,18 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDX' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDY' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDX' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDY' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<float, [[DIM]]>, vector<float, [[DIM]]>, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} SampleGrad 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], [[GRADIENT_TYPE]], [[GRADIENT_TYPE]], [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDX 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} DDY 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDX '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} DDY '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
@@ -375,16 +413,16 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDX' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'DDY' 'vector<float, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDX' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'DDY' '[[GRADIENT_TYPE]]'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleLevel 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleLevel 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} LOD 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -400,15 +438,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'LOD' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleLevel 'vector<element_type, element_count> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleLevel 'vector<element_type, element_count> (hlsl::SamplerState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} LOD 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, element_count>' <Dependent>
@@ -425,14 +463,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'LOD' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // SAMPLECMP-NEXT: CompoundStmt
 // SAMPLECMP-NEXT: ReturnStmt
@@ -448,15 +486,15 @@
 // SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-SAME: ' lvalue .__handle
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // SAMPLECMP-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: CompoundStmt
 // SAMPLECMP-OFFSET-NEXT: ReturnStmt
 // SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -473,16 +511,16 @@
 // SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]], float)'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
 // SAMPLECMP-OFFSET-NEXT: CompoundStmt
 // SAMPLECMP-OFFSET-NEXT: ReturnStmt
@@ -500,15 +538,15 @@
 // SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
 // SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // SAMPLECMP-NEXT: CompoundStmt
 // SAMPLECMP-NEXT: ReturnStmt
@@ -524,15 +562,15 @@
 // SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-SAME: ' lvalue .__handle
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // SAMPLECMP-NEXT: AlwaysInlineAttr
 
-// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: CompoundStmt
 // SAMPLECMP-OFFSET-NEXT: ReturnStmt
 // SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -549,14 +587,14 @@
 // SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetail 'float (hlsl::SamplerState, vector<float, [[DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetail 'float (hlsl::SamplerState, [[GRADIENT_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -571,12 +609,12 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetailUnclamped 'float (hlsl::SamplerState, vector<float, [[DIM]]>)'
+// CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetailUnclamped 'float (hlsl::SamplerState, [[GRADIENT_TYPE]])'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
 // CHECK-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -591,7 +629,7 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[DIM]]>'
+// CHECK-NEXT: DeclRefExpr {{.*}} '[[GRADIENT_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[GRADIENT_TYPE]]'
 // CHECK-NEXT: AlwaysInlineAttr
 
 // GETDIM-XY: CXXMethodDecl {{.*}} GetDimensions 'void (out unsigned int, out unsigned int)'
@@ -676,9 +714,9 @@
 // GETDIM-XY-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'height' 'float &__restrict'
 // GETDIM-XY-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'numberOfLevels' 'float &__restrict'
 
-// GATHER: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -688,14 +726,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -705,14 +743,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -722,14 +760,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -739,14 +777,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -756,14 +794,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -773,14 +811,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -790,14 +828,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -807,14 +845,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
 // GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -824,14 +862,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
@@ -841,14 +879,14 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -859,16 +897,16 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
@@ -878,15 +916,15 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -897,14 +935,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -915,14 +953,14 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
 // GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // GATHER-NEXT: CompoundStmt
 // GATHER-NEXT: ReturnStmt
@@ -933,16 +971,16 @@
 // GATHER-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
 // GATHER-NEXT: AlwaysInlineAttr
 
-// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: CompoundStmt
 // GATHER-OFFSET-NEXT: ReturnStmt
 // GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
@@ -952,10 +990,10 @@
 // GATHER-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
 // GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
 // GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
 // GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
-// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
 // GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
 TEXTURE<float4> t;
diff --git a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
index a7815f2f130f6..69a1363f56dc4 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
@@ -1,70 +1,144 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
-// RUN:   -DTEXTURE=Texture2D %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D --check-prefixes=CHECK,DXIL \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
+// RUN:   -DTEXTURE=Texture1D %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1D --check-prefixes=CHECK,DXIL -DDXIL_TY=1 -DRW=0 \
+// RUN:   -DDIM=1 -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=Texture3D %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,DXIL \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
+// RUN:   -DTEXTURE=Texture1DArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,DXIL -DDXIL_TY=6 \
+// RUN:   -DRW=0 -DDIM=1 -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
+// RUN:   -DTEXTURE=Texture2D %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D --check-prefixes=CHECK,DXIL -DDXIL_TY=2 -DRW=0 \
+// RUN:   -DDIM=2 -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCube %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube --check-prefixes=CHECK,DXIL \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN:   -DTEXTURE=TextureCube %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCube --check-prefixes=CHECK,DXIL -DDXIL_TY=5 -DRW=0 \
+// RUN:   -DDIM=3 -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCubeArray %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray \
-// RUN:   --check-prefixes=CHECK,DXIL -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN:   -DTEXTURE=TextureCubeArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,DXIL -DDXIL_TY=9 \
+// RUN:   -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
-// RUN:   -DTEXTURE=Texture2D %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
+// RUN:   -DTEXTURE=Texture1D %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1D --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=Texture3D %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
+// RUN:   -DTEXTURE=Texture1DArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
+// RUN:   -DTEXTURE=Texture2D %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCube %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DTEXTURE=TextureCube %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCube --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCubeArray %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 \
-// RUN:   -DSPV_DIM=3 -DDIM=3
+// RUN:   -DTEXTURE=TextureCubeArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
-// RUN:   -DTEXTURE=Texture2DArray %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray --check-prefixes=CHECK,DXIL \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2
+// RUN:   -DTEXTURE=Texture2DArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray --check-prefixes=CHECK,DXIL -DDXIL_TY=7 \
+// RUN:   -DRW=0 -DDIM=2 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
-// RUN:   -DTEXTURE=Texture2DArray %s \
+// RUN:   -DTEXTURE=Texture2DArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=Texture3D %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,DXIL \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 \
+// RUN:   -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>"
+
+// Texture3D
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=Texture3D %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,SPIRV \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
 //   LOD_TYPE           CalculateLevelOfDetail location type
 //   TEXTURE            resource type name
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
@@ -77,41 +151,41 @@
 TEXTURE t;
 SamplerState s;
 
-// CHECK: define hidden {{.*}} float @test_lod(float vector[[[DIM]]])(<[[DIM]] x float> {{.*}} %[[LOC:.*]])
-// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetail(hlsl::SamplerState, float vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[DIM]] x float> {{.*}} %{{.*}})
+// CHECK: define hidden {{.*}} float @test_lod([[GRAD_CXX]])([[GRAD_LLVM]] {{.*}} %[[LOC:.*]])
+// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetail(hlsl::SamplerState, [[GRAD_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}})
 // CHECK: ret float %[[CALL]]
 
 float test_lod(LOD_TYPE loc : LOC) : SV_Target {
   return t.CalculateLevelOfDetail(s, loc);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetail(hlsl::SamplerState, float vector[[[DIM]]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[DIM]] x float> {{.*}} %[[COORD:[^)]+]])
+// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetail(hlsl::SamplerState, [[GRAD_CXX]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[COORD:[^)]+]])
 // CHECK: %[[THIS_VAL:.*]] = load ptr, ptr %[[THIS]]
 // CHECK: %[[HANDLE_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL]], i32 0, i32 0
 // CHECK: %[[HANDLE:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP]]
 // CHECK: %[[SAMPLER_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK: %[[SAMPLER_H:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP]]
-// CHECK: %[[COORD_VAL:.*]] = load <[[DIM]] x float>, ptr %[[COORD]]
-// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.calculate.lod.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], <[[DIM]] x float> %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
-// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.calculate.lod.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], <[[DIM]] x float> %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
+// CHECK: %[[COORD_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[COORD]]
+// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.calculate.lod.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], [[GRAD_LLVM]] %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
+// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.calculate.lod.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], [[GRAD_LLVM]] %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
 // CHECK: ret float %[[RES]]
 
-// CHECK: define hidden {{.*}} float @test_lod_unclamped(float vector[[[DIM]]])(<[[DIM]] x float> noundef nofpclass(nan inf) %[[LOC:.*]])
-// CHECK: %[[LOC_VAL:.*]] = load <[[DIM]] x float>, ptr {{.*}}
-// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetailUnclamped(hlsl::SamplerState, float vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[DIM]] x float> {{.*}} %[[LOC_VAL]])
+// CHECK: define hidden {{.*}} float @test_lod_unclamped([[GRAD_CXX]])([[GRAD_LLVM]] noundef nofpclass(nan inf) %[[LOC:.*]])
+// CHECK: %[[LOC_VAL:.*]] = load [[GRAD_LLVM]], ptr {{.*}}
+// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetailUnclamped(hlsl::SamplerState, [[GRAD_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[GRAD_LLVM]] {{.*}} %[[LOC_VAL]])
 // CHECK: ret float %[[CALL]]
 
 float test_lod_unclamped(LOD_TYPE loc : LOC) : SV_Target {
   return t.CalculateLevelOfDetailUnclamped(s, loc);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetailUnclamped(hlsl::SamplerState, float vector[[[DIM]]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[DIM]] x float> {{.*}} %[[COORD:[^)]+]])
+// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::CalculateLevelOfDetailUnclamped(hlsl::SamplerState, [[GRAD_CXX]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[COORD:[^)]+]])
 // CHECK: %[[THIS_VAL:.*]] = load ptr, ptr %[[THIS]]
 // CHECK: %[[HANDLE_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL]], i32 0, i32 0
 // CHECK: %[[HANDLE:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP]]
 // CHECK: %[[SAMPLER_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK: %[[SAMPLER_H:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP]]
-// CHECK: %[[COORD_VAL:.*]] = load <[[DIM]] x float>, ptr %[[COORD]]
-// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.calculate.lod.unclamped.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], <[[DIM]] x float> %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
-// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.calculate.lod.unclamped.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], <[[DIM]] x float> %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
+// CHECK: %[[COORD_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[COORD]]
+// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.calculate.lod.unclamped.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], [[GRAD_LLVM]] %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
+// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.calculate.lod.unclamped.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], [[GRAD_LLVM]] %[[COORD_VAL]]) [ "convergencectrl"(token %0) ]
 // CHECK: ret float %[[RES]]
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
index 0c80f408afc3e..929cefa8f018e 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
@@ -1,104 +1,228 @@
+// Texture1D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1D \
+// RUN:   -DLOAD_ARG="int2(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,SCALAR-COORD,WIDE-LOC,DXIL,DXIL-SRV \
+// RUN:   -DTEXTURE=Texture1D -D#LOAD_DIM=2 -DCOORD_DIM=1 -DDXIL_TY=1 -DRW=0 \
+// RUN:   -DENTRY_DIM=1 -DDIM=1 -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
+// RUN:   -DENTRY_CXX=int -DLOAD_LLVM="<2 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[2]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1D \
+// RUN:   -DLOAD_ARG="int2(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,SCALAR-COORD,WIDE-LOC,SPIRV,SPIRV-SRV \
+// RUN:   -DTEXTURE=Texture1D -D#LOAD_DIM=2 -DCOORD_DIM=1 -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 \
+// RUN:   -DFORMAT24=0 -DFORMAT25=0 -DSPV_DIM=0 -DENTRY_DIM=1 -DDIM=1 \
+// RUN:   -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX=int \
+// RUN:   -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
+
+// Texture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1DArray \
+// RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,DXIL,DXIL-SRV \
+// RUN:   -DTEXTURE=Texture1DArray -D#LOAD_DIM=3 -DCOORD_DIM=2 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DDXIL_TY=6 -DRW=0 -DENTRY_DIM=2 \
+// RUN:   -DDIM=1 -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[3]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1DArray \
+// RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,SPIRV,SPIRV-SRV \
+// RUN:   -DTEXTURE=Texture1DArray -D#LOAD_DIM=3 -DCOORD_DIM=2 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DARRAYED=1 -DSAMPLED=1 -DFORMAT1=0 \
+// RUN:   -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 -DFORMAT25=0 \
+// RUN:   -DSPV_DIM=0 -DENTRY_DIM=2 -DDIM=1 -DCOORD_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 \
+// RUN:   -DOFFSET_CONST=1 -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
 // Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 1)" -DTEXTURE=Texture2D \
-// RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,DXIL,DXIL-SRV \
+// RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,DXIL,DXIL-SRV \
 // RUN:   -DTEXTURE=Texture2D -D#LOAD_DIM=3 -DCOORD_DIM=2 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DDXIL_TY=2 -DRW=0 -DENTRY_DIM=2 -DDIM=2
+// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DDXIL_TY=2 -DRW=0 -DENTRY_DIM=2 \
+// RUN:   -DDIM=2 -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 1)" -DTEXTURE=Texture2D \
-// RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,SPIRV,SPIRV-SRV \
+// RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,SPIRV,SPIRV-SRV \
 // RUN:   -DTEXTURE=Texture2D -D#LOAD_DIM=3 -DCOORD_DIM=2 \
 // RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DARRAYED=0 -DSAMPLED=1 -DFORMAT1=0 \
 // RUN:   -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 -DFORMAT25=0 \
-// RUN:   -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2
+// RUN:   -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[3]"
 
 // Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 1)" -DTEXTURE=Texture2DArray \
-// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,DXIL,DXIL-SRV \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,DXIL,DXIL-SRV \
 // RUN:   -DTEXTURE=Texture2DArray -D#LOAD_DIM=4 -DCOORD_DIM=3 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=7 -DRW=0 -DENTRY_DIM=2 \
-// RUN:   -DDIM=2
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
-// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,DXIL,DXIL-SRV \
-// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=4 -DRW=0 \
-// RUN:   -DENTRY_DIM=2 -DDIM=3
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=7 -DRW=0 \
+// RUN:   -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<4 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[4]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 1)" -DTEXTURE=Texture2DArray \
-// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,SPIRV,SPIRV-SRV \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,SPIRV,SPIRV-SRV \
 // RUN:   -DTEXTURE=Texture2DArray -D#LOAD_DIM=4 -DCOORD_DIM=3 \
 // RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=1 -DSAMPLED=1 \
 // RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
-// RUN:   -DFORMAT25=0 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
-// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,SPIRV,SPIRV-SRV \
-// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=0 -DSAMPLED=1 \
-// RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
-// RUN:   -DFORMAT25=0 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3
+// RUN:   -DFORMAT25=0 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 \
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<4 x i32>" -DLOAD_CXX="int vector[4]"
 
+// RWTexture1D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
+// RUN:   -DTEXTURE=RWTexture1D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,DXIL,DXIL-UAV \
+// RUN:   -DTEXTURE=RWTexture1D -D#LOAD_DIM=1 -DCOORD_DIM=1 -DDXIL_TY=1 -DRW=1 \
+// RUN:   -DENTRY_DIM=1 -DDIM=1 -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
+// RUN:   -DENTRY_CXX=int -DLOAD_LLVM=i32 -DLOAD_CXX=int
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
+// RUN:   -DTEXTURE=RWTexture1D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,SPIRV,SPIRV-UAV \
+// RUN:   -DTEXTURE=RWTexture1D -D#LOAD_DIM=1 -DCOORD_DIM=1 -DARRAYED=0 \
+// RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=0 -DENTRY_DIM=1 -DDIM=1 \
+// RUN:   -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX=int -DLOAD_LLVM=i32 \
+// RUN:   -DLOAD_CXX=int
 // RWTexture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,DXIL,DXIL-UAV \
+// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,DXIL,DXIL-UAV \
 // RUN:   -DTEXTURE=RWTexture2D -D#LOAD_DIM=2 -DCOORD_DIM=2 -DDXIL_TY=2 -DRW=1 \
-// RUN:   -DENTRY_DIM=2 -DDIM=2
+// RUN:   -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<2 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,SPIRV,SPIRV-UAV \
+// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,SPIRV,SPIRV-UAV \
 // RUN:   -DTEXTURE=RWTexture2D -D#LOAD_DIM=2 -DCOORD_DIM=2 -DARRAYED=0 \
 // RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
-// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 \
+// RUN:   -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
 
+// RWTexture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
+// RUN:   -DTEXTURE=RWTexture1DArray -DLOAD_ARG="int2(loc, 0)" -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
+// RUN:   -DTEXTURE=RWTexture1DArray -D#LOAD_DIM=2 -DCOORD_DIM=2 -DDXIL_TY=6 \
+// RUN:   -DRW=1 -DENTRY_DIM=1 -DDIM=1 -DCOORD_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 \
+// RUN:   -DOFFSET_CONST=1 -DENTRY_CXX=int -DLOAD_LLVM="<2 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[2]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
+// RUN:   -DTEXTURE=RWTexture1DArray -DLOAD_ARG="int2(loc, 0)" -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
+// RUN:   -DTEXTURE=RWTexture1DArray -D#LOAD_DIM=2 -DCOORD_DIM=2 -DARRAYED=1 \
+// RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=0 -DENTRY_DIM=1 -DDIM=1 \
+// RUN:   -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX=int \
+// RUN:   -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
 // RWTexture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture2DArray -DLOAD_ARG="int3(loc, 0)" -o - %s \
+// RUN:   -DTEXTURE=RWTexture2DArray -DLOAD_ARG="int3(loc, 0)" -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
+// RUN:   -DTEXTURE=RWTexture2DArray -D#LOAD_DIM=3 -DCOORD_DIM=3 -DDXIL_TY=7 \
+// RUN:   -DRW=1 -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[3]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DTEXTURE=RWTexture2DArray -DLOAD_ARG="int3(loc, 0)" -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
+// RUN:   -DTEXTURE=RWTexture2DArray -D#LOAD_DIM=3 -DCOORD_DIM=3 -DARRAYED=1 \
+// RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 \
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
-// RUN:   -DTEXTURE=RWTexture2DArray -D#LOAD_DIM=3 -DCOORD_DIM=3 \
-// RUN:   -DDXIL_TY=7 -DRW=1 -DENTRY_DIM=2 -DDIM=2
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,DXIL,DXIL-SRV \
+// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=4 -DRW=0 \
+// RUN:   -DENTRY_DIM=2 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[4]" -DLOAD_LLVM="<4 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,SPIRV,SPIRV-SRV \
+// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=0 -DSAMPLED=1 \
+// RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
+// RUN:   -DFORMAT25=0 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[4]" -DLOAD_LLVM="<4 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// RWTexture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
 // RUN:   -DTEXTURE=RWTexture3D -D#LOAD_DIM=3 -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=1 \
-// RUN:   -DENTRY_DIM=2 -DDIM=3
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture2DArray -DLOAD_ARG="int3(loc, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
-// RUN:   -DTEXTURE=RWTexture2DArray -D#LOAD_DIM=3 -DCOORD_DIM=3 \
-// RUN:   -DARRAYED=1 -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 \
-// RUN:   -DFORMAT21=21 -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DENTRY_DIM=2 \
-// RUN:   -DDIM=2
+// RUN:   -DENTRY_DIM=2 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[3]" -DLOAD_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// RWTexture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s \
@@ -106,7 +230,8 @@
 // RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
 // RUN:   -DTEXTURE=RWTexture3D -D#LOAD_DIM=3 -DCOORD_DIM=3 -DARRAYED=0 \
 // RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
-// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[3]" -DLOAD_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -119,9 +244,17 @@
 //   LOAD_ARG           the Load location, built from the entry point's `loc`
 //   LOAD_DIM           Load location components; a FileCheck numeric variable,
 //                      so the last component's index is [[#LOAD_DIM-1]]
+//   LOAD_LLVM          Load location type in the IR
+//   LOAD_CXX           Load location type in the C++ signature
 //   COORD_DIM          sample location components (DIM plus the array slice)
 //   COORD_MASK         shufflevector mask extracting the coordinate from a
-//                      location; only needed where LOAD_DIM > COORD_DIM
+//                      location; only needed where the coordinate is a vector
+//   COORD_LLVM         coordinate type in the IR
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_CXX         offset type in the C++ signature
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
+//   OFFSET_CONST       OFFSET_ARG as it appears in the IR
+//   ENTRY_CXX          the entry point's coordinate type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   ENTRY_DIM          the entry point's own coordinate components
@@ -144,41 +277,45 @@
 //                      point's coordinate, so LOAD_ARG appends the array slice
 //                      and/or the mip level to `loc`
 //   EXACT-LOC          types whose Load location is exactly `loc`
+//   VEC-COORD          types whose coordinate is a vector, split out of the
+//                      location with a shufflevector
+//   SCALAR-COORD       1D types, whose coordinate is a single element
 
 TEXTURE<float4> t;
 
-// CHECK: define hidden {{.*}} <4 x float> @test_load(int vector[[[ENTRY_DIM]]])
-// WIDE-LOC: %[[COORD:.*]] = insertelement <[[#LOAD_DIM]] x i32> {{.*}}, i32 0, i32 [[#LOAD_DIM-1]]
-// WIDE-LOC: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t, <[[#LOAD_DIM]] x i32> noundef %[[COORD]])
-// EXACT-LOC: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: define hidden {{.*}} <4 x float> @test_load([[ENTRY_CXX]])
+// WIDE-LOC: %[[COORD:.*]] = insertelement [[LOAD_LLVM]] {{.*}}, i32 0, i32 [[#LOAD_DIM-1]]
+// WIDE-LOC: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load([[LOAD_CXX]])(ptr {{.*}} @t, [[LOAD_LLVM]] noundef %[[COORD]])
+// EXACT-LOC: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load([[LOAD_CXX]])(ptr {{.*}} @t, [[LOAD_LLVM]] noundef %{{.*}})
 // CHECK: ret <4 x float> %[[CALL]]
 
 float4 test_load(ENTRY_TYPE loc : LOC) : SV_Target {
   return t.Load(LOAD_ARG);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
+// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
 // CHECK: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK: %[[LOAD_ADDR:.*]] = alloca <[[#LOAD_DIM]] x i32>
+// CHECK: %[[LOAD_ADDR:.*]] = alloca [[LOAD_LLVM]]
 // CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK: store <[[#LOAD_DIM]] x i32> %[[LOAD]], ptr %[[LOAD_ADDR]]
+// CHECK: store [[LOAD_LLVM]] %[[LOAD]], ptr %[[LOAD_ADDR]]
 // CHECK: %[[THIS_VAL:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK: %[[HANDLE_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL]], i32 0, i32 0
 // CHECK: %[[HANDLE:.*]] = load target("{{(dx.Texture|spirv.Image)}}", {{.*}}), ptr %[[HANDLE_GEP]]
-// CHECK: %[[LOAD_VAL:.*]] = load <[[#LOAD_DIM]] x i32>, ptr %[[LOAD_ADDR]]
+// CHECK: %[[LOAD_VAL:.*]] = load [[LOAD_LLVM]], ptr %[[LOAD_ADDR]]
 // UAV-NOT: shufflevector
 // UAV-NOT: extractelement
-// SRV: %[[COORD:.*]] = shufflevector <[[#LOAD_DIM]] x i32> %[[LOAD_VAL]], <[[#LOAD_DIM]] x i32> poison, <[[COORD_DIM]] x i32> [[COORD_MASK]]
-// SRV: %[[LOD:.*]] = extractelement <[[#LOAD_DIM]] x i32> %[[LOAD_VAL]], i64 [[COORD_DIM]]
-// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[COORD]], i32 %[[LOD]], <[[DIM]] x i32> zeroinitializer)
-// DXIL-UAV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[LOAD_VAL]], i32 poison, <[[DIM]] x i32> zeroinitializer)
-// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.load.level.v4f32.tspirv.Image_f32_{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT1]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[COORD]], i32 %[[LOD]], <[[DIM]] x i32> zeroinitializer)
-// SPIRV-UAV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.load.level.v4f32.tspirv.Image_f32_{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT1]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[LOAD_VAL]], i32 poison, <[[DIM]] x i32> zeroinitializer)
+// VEC-COORD: %[[COORD:.*]] = shufflevector [[LOAD_LLVM]] %[[LOAD_VAL]], [[LOAD_LLVM]] poison, [[COORD_LLVM]] [[COORD_MASK]]
+// SCALAR-COORD: %[[COORD:.*]] = extractelement [[LOAD_LLVM]] %[[LOAD_VAL]], i64 0
+// SRV: %[[LOD:.*]] = extractelement [[LOAD_LLVM]] %[[LOAD_VAL]], i64 [[COORD_DIM]]
+// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], [[COORD_LLVM]] %[[COORD]], i32 %[[LOD]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// DXIL-UAV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], [[COORD_LLVM]] %[[LOAD_VAL]], i32 poison, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.load.level.v4f32.tspirv.Image_f32_{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT1]]) %[[HANDLE]], [[COORD_LLVM]] %[[COORD]], i32 %[[LOD]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV-UAV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.load.level.v4f32.tspirv.Image_f32_{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT1]]) %[[HANDLE]], [[COORD_LLVM]] %[[LOAD_VAL]], i32 poison, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <4 x float> %[[RES]]
 
-// SRV: define hidden {{.*}} <4 x float> @test_load_offset(int vector[[[ENTRY_DIM]]])
-// SRV: %[[COORD:.*]] = insertelement <[[#LOAD_DIM]] x i32> {{.*}}, i32 0, i32 [[#LOAD_DIM-1]]
-// SRV: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t, <[[#LOAD_DIM]] x i32> noundef %[[COORD]], <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} <4 x float> @test_load_offset([[ENTRY_CXX]])
+// SRV: %[[COORD:.*]] = insertelement [[LOAD_LLVM]] {{.*}}, i32 0, i32 [[#LOAD_DIM-1]]
+// SRV: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t, [[LOAD_LLVM]] noundef %[[COORD]], [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret <4 x float> %[[CALL]]
 
 #ifdef HAS_OFFSET
@@ -187,22 +324,23 @@ float4 test_load_offset(ENTRY_TYPE loc : LOC) : SV_Target {
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
+// SRV: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
 // SRV: %[[THIS_ADDR:.*]] = alloca ptr
-// SRV: %[[LOAD_ADDR:.*]] = alloca <[[#LOAD_DIM]] x i32>
-// SRV: %[[OFFSET_ADDR:.*]] = alloca <[[DIM]] x i32>
+// SRV: %[[LOAD_ADDR:.*]] = alloca [[LOAD_LLVM]]
+// SRV: %[[OFFSET_ADDR:.*]] = alloca [[OFFSET_LLVM]]
 // SRV: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// SRV: store <[[#LOAD_DIM]] x i32> %[[LOAD]], ptr %[[LOAD_ADDR]]
-// SRV: store <[[DIM]] x i32> %[[OFFSET]], ptr %[[OFFSET_ADDR]]
+// SRV: store [[LOAD_LLVM]] %[[LOAD]], ptr %[[LOAD_ADDR]]
+// SRV: store [[OFFSET_LLVM]] %[[OFFSET]], ptr %[[OFFSET_ADDR]]
 // SRV: %[[THIS_VAL:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // SRV: %[[HANDLE_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL]], i32 0, i32 0
 // SRV: %[[HANDLE:.*]] = load target("{{(dx.Texture|spirv.Image)}}", {{.*}}), ptr %[[HANDLE_GEP]]
-// SRV: %[[LOAD_VAL:.*]] = load <[[#LOAD_DIM]] x i32>, ptr %[[LOAD_ADDR]]
-// SRV: %[[COORD:.*]] = shufflevector <[[#LOAD_DIM]] x i32> %[[LOAD_VAL]], <[[#LOAD_DIM]] x i32> poison, <[[COORD_DIM]] x i32> [[COORD_MASK]]
-// SRV: %[[LOD:.*]] = extractelement <[[#LOAD_DIM]] x i32> %[[LOAD_VAL]], i64 [[COORD_DIM]]
-// SRV: %[[OFFSET_VAL:.*]] = load <[[DIM]] x i32>, ptr %[[OFFSET_ADDR]]
-// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_{{.*}}("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[COORD]], i32 %[[LOD]], <[[DIM]] x i32> %[[OFFSET_VAL]])
-// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.load.level.v4f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT1]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[COORD]], i32 %[[LOD]], <[[DIM]] x i32> %[[OFFSET_VAL]])
+// SRV: %[[LOAD_VAL:.*]] = load [[LOAD_LLVM]], ptr %[[LOAD_ADDR]]
+// VEC-COORD: %[[COORD:.*]] = shufflevector [[LOAD_LLVM]] %[[LOAD_VAL]], [[LOAD_LLVM]] poison, [[COORD_LLVM]] [[COORD_MASK]]
+// SCALAR-COORD: %[[COORD:.*]] = extractelement [[LOAD_LLVM]] %[[LOAD_VAL]], i64 0
+// SRV: %[[LOD:.*]] = extractelement [[LOAD_LLVM]] %[[LOAD_VAL]], i64 [[COORD_DIM]]
+// SRV: %[[OFFSET_VAL:.*]] = load [[OFFSET_LLVM]], ptr %[[OFFSET_ADDR]]
+// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_{{.*}}("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], [[COORD_LLVM]] %[[COORD]], i32 %[[LOD]], [[OFFSET_LLVM]] %[[OFFSET_VAL]])
+// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.load.level.v4f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT1]]) %[[HANDLE]], [[COORD_LLVM]] %[[COORD]], i32 %[[LOD]], [[OFFSET_LLVM]] %[[OFFSET_VAL]])
 // SRV: ret <4 x float> %[[RES]]
 
 
@@ -211,193 +349,193 @@ float4 test_load_offset(ENTRY_TYPE loc : LOC) : SV_Target {
 
 TEXTURE<float> t_float;
 
-// CHECK: define hidden {{.*}} float @test_load_float(int vector[[[ENTRY_DIM]]])
-// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.load.level.f32.tdx.Texture_f32_{{.*}}("dx.Texture", float, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.load.level.f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT3]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: define hidden {{.*}} float @test_load_float([[ENTRY_CXX]])
+// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.load.level.f32.tdx.Texture_f32_{{.*}}("dx.Texture", float, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.load.level.f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT3]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret float %[[RES]]
 float test_load_float(ENTRY_TYPE loc : LOC) {
   return t_float.Load(LOAD_ARG);
 }
 
 #ifdef HAS_OFFSET
-// SRV: define hidden {{.*}} float @test_load_offset_float(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_float, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} float @test_load_offset_float([[ENTRY_CXX]])
+// SRV: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t_float, [[LOAD_LLVM]] noundef %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret float %[[CALL]]
 float test_load_offset_float(ENTRY_TYPE loc : LOC) {
   return t_float.Load(LOAD_ARG, OFFSET_ARG);
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.load.level.f32.tdx.Texture_f32_{{.*}}("dx.Texture", float, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.load.level.f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT3]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.load.level.f32.tdx.Texture_f32_{{.*}}("dx.Texture", float, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.load.level.f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT3]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
 // SRV: ret float %[[RES]]
 
 TEXTURE<float2> t_float2;
 
-// CHECK: define hidden {{.*}} <2 x float> @test_load_float2(int vector[[[ENTRY_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_float2, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: define hidden {{.*}} <2 x float> @test_load_float2([[ENTRY_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load([[LOAD_CXX]])(ptr {{.*}} @t_float2, [[LOAD_LLVM]] noundef %{{.*}})
 // CHECK: ret <2 x float> %[[CALL]]
 float2 test_load_float2(ENTRY_TYPE loc : LOC) {
   return t_float2.Load(LOAD_ARG);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.dx.resource.load.level.v2f32.tdx.Texture_v2f32_{{.*}}("dx.Texture", <2 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.spv.resource.load.level.v2f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT6]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: define linkonce_odr hidden {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.dx.resource.load.level.v2f32.tdx.Texture_v2f32_{{.*}}("dx.Texture", <2 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.spv.resource.load.level.v2f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT6]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <2 x float> %[[RES]]
 
 #ifdef HAS_OFFSET
-// SRV: define hidden {{.*}} <2 x float> @test_load_offset_float2(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_float2, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} <2 x float> @test_load_offset_float2([[ENTRY_CXX]])
+// SRV: %[[CALL:.*]] = call {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t_float2, [[LOAD_LLVM]] noundef %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret <2 x float> %[[CALL]]
 float2 test_load_offset_float2(ENTRY_TYPE loc : LOC) {
   return t_float2.Load(LOAD_ARG, OFFSET_ARG);
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.dx.resource.load.level.v2f32.tdx.Texture_v2f32_{{.*}}("dx.Texture", <2 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.spv.resource.load.level.v2f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT6]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: define linkonce_odr hidden {{.*}} <2 x float> @hlsl::[[TEXTURE]]<float vector[2]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.dx.resource.load.level.v2f32.tdx.Texture_v2f32_{{.*}}("dx.Texture", <2 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <2 x float> @llvm.spv.resource.load.level.v2f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT6]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
 // SRV: ret <2 x float> %[[RES]]
 
 TEXTURE<float3> t_float3;
 
-// CHECK: define hidden {{.*}} <3 x float> @test_load_float3(int vector[[[ENTRY_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_float3, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: define hidden {{.*}} <3 x float> @test_load_float3([[ENTRY_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load([[LOAD_CXX]])(ptr {{.*}} @t_float3, [[LOAD_LLVM]] noundef %{{.*}})
 // CHECK: ret <3 x float> %[[CALL]]
 float3 test_load_float3(ENTRY_TYPE loc : LOC) {
   return t_float3.Load(LOAD_ARG);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.dx.resource.load.level.v3f32.tdx.Texture_v3f32_{{.*}}("dx.Texture", <3 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.spv.resource.load.level.v3f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: define linkonce_odr hidden {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.dx.resource.load.level.v3f32.tdx.Texture_v3f32_{{.*}}("dx.Texture", <3 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.spv.resource.load.level.v3f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <3 x float> %[[RES]]
 
 #ifdef HAS_OFFSET
-// SRV: define hidden {{.*}} <3 x float> @test_load_offset_float3(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_float3, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} <3 x float> @test_load_offset_float3([[ENTRY_CXX]])
+// SRV: %[[CALL:.*]] = call {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t_float3, [[LOAD_LLVM]] noundef %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret <3 x float> %[[CALL]]
 float3 test_load_offset_float3(ENTRY_TYPE loc : LOC) {
   return t_float3.Load(LOAD_ARG, OFFSET_ARG);
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.dx.resource.load.level.v3f32.tdx.Texture_v3f32_{{.*}}("dx.Texture", <3 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.spv.resource.load.level.v3f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: define linkonce_odr hidden {{.*}} <3 x float> @hlsl::[[TEXTURE]]<float vector[3]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.dx.resource.load.level.v3f32.tdx.Texture_v3f32_{{.*}}("dx.Texture", <3 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.spv.resource.load.level.v3f32.tspirv.Image_f32_{{.*}}("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
 // SRV: ret <3 x float> %[[RES]]
 
 TEXTURE<int> t_int;
 
-// CHECK: define hidden {{.*}} i32 @test_load_int(int vector[[[ENTRY_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_int, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: define hidden {{.*}} i32 @test_load_int([[ENTRY_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load([[LOAD_CXX]])(ptr {{.*}} @t_int, [[LOAD_LLVM]] noundef %{{.*}})
 // CHECK: ret i32 %[[CALL]]
 int test_load_int(ENTRY_TYPE loc : LOC) {
   return t_int.Load(LOAD_ARG);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call i32 @llvm.dx.resource.load.level.i32.tdx.Texture_i32_{{.*}}("dx.Texture", i32, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call i32 @llvm.spv.resource.load.level.i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT24]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: define linkonce_odr hidden {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call i32 @llvm.dx.resource.load.level.i32.tdx.Texture_i32_{{.*}}("dx.Texture", i32, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: %[[RES:.*]] = call i32 @llvm.spv.resource.load.level.i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT24]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret i32 %[[RES]]
 
 #ifdef HAS_OFFSET
-// SRV: define hidden {{.*}} i32 @test_load_offset_int(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_int, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} i32 @test_load_offset_int([[ENTRY_CXX]])
+// SRV: %[[CALL:.*]] = call {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t_int, [[LOAD_LLVM]] noundef %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret i32 %[[CALL]]
 int test_load_offset_int(ENTRY_TYPE loc : LOC) {
   return t_int.Load(LOAD_ARG, OFFSET_ARG);
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call i32 @llvm.dx.resource.load.level.i32.tdx.Texture_i32_{{.*}}("dx.Texture", i32, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call i32 @llvm.spv.resource.load.level.i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT24]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: define linkonce_odr hidden {{.*}} i32 @hlsl::[[TEXTURE]]<int>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call i32 @llvm.dx.resource.load.level.i32.tdx.Texture_i32_{{.*}}("dx.Texture", i32, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call i32 @llvm.spv.resource.load.level.i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT24]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
 // SRV: ret i32 %[[RES]]
 
 TEXTURE<int2> t_int2;
 
-// CHECK: define hidden {{.*}} <2 x i32> @test_load_int2(int vector[[[ENTRY_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_int2, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: define hidden {{.*}} <2 x i32> @test_load_int2([[ENTRY_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load([[LOAD_CXX]])(ptr {{.*}} @t_int2, [[LOAD_LLVM]] noundef %{{.*}})
 // CHECK: ret <2 x i32> %[[CALL]]
 int2 test_load_int2(ENTRY_TYPE loc : LOC) {
   return t_int2.Load(LOAD_ARG);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call <2 x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <2 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call <2 x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: define linkonce_odr hidden {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call <2 x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <2 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: %[[RES:.*]] = call <2 x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <2 x i32> %[[RES]]
 
 #ifdef HAS_OFFSET
-// SRV: define hidden {{.*}} <2 x i32> @test_load_offset_int2(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_int2, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} <2 x i32> @test_load_offset_int2([[ENTRY_CXX]])
+// SRV: %[[CALL:.*]] = call {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t_int2, [[LOAD_LLVM]] noundef %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret <2 x i32> %[[CALL]]
 int2 test_load_offset_int2(ENTRY_TYPE loc : LOC) {
   return t_int2.Load(LOAD_ARG, OFFSET_ARG);
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call <2 x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <2 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call <2 x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: define linkonce_odr hidden {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call <2 x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <2 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call <2 x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
 // SRV: ret <2 x i32> %[[RES]]
 
 TEXTURE<int3> t_int3;
 
-// CHECK: define hidden {{.*}} <3 x i32> @test_load_int3(int vector[[[ENTRY_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_int3, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: define hidden {{.*}} <3 x i32> @test_load_int3([[ENTRY_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load([[LOAD_CXX]])(ptr {{.*}} @t_int3, [[LOAD_LLVM]] noundef %{{.*}})
 // CHECK: ret <3 x i32> %[[CALL]]
 int3 test_load_int3(ENTRY_TYPE loc : LOC) {
   return t_int3.Load(LOAD_ARG);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call <3 x i32> @llvm.dx.resource.load.level.v3i32.tdx.Texture_v3i32_{{.*}}("dx.Texture", <3 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call <3 x i32> @llvm.spv.resource.load.level.v3i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: define linkonce_odr hidden {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call <3 x i32> @llvm.dx.resource.load.level.v3i32.tdx.Texture_v3i32_{{.*}}("dx.Texture", <3 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: %[[RES:.*]] = call <3 x i32> @llvm.spv.resource.load.level.v3i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <3 x i32> %[[RES]]
 
 #ifdef HAS_OFFSET
-// SRV: define hidden {{.*}} <3 x i32> @test_load_offset_int3(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_int3, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} <3 x i32> @test_load_offset_int3([[ENTRY_CXX]])
+// SRV: %[[CALL:.*]] = call {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t_int3, [[LOAD_LLVM]] noundef %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret <3 x i32> %[[CALL]]
 int3 test_load_offset_int3(ENTRY_TYPE loc : LOC) {
   return t_int3.Load(LOAD_ARG, OFFSET_ARG);
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call <3 x i32> @llvm.dx.resource.load.level.v3i32.tdx.Texture_v3i32_{{.*}}("dx.Texture", <3 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call <3 x i32> @llvm.spv.resource.load.level.v3i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: define linkonce_odr hidden {{.*}} <3 x i32> @hlsl::[[TEXTURE]]<int vector[3]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call <3 x i32> @llvm.dx.resource.load.level.v3i32.tdx.Texture_v3i32_{{.*}}("dx.Texture", <3 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call <3 x i32> @llvm.spv.resource.load.level.v3i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
 // SRV: ret <3 x i32> %[[RES]]
 
 TEXTURE<int4> t_int4;
 
-// CHECK: define hidden {{.*}} <4 x i32> @test_load_int4(int vector[[[ENTRY_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_int4, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: define hidden {{.*}} <4 x i32> @test_load_int4([[ENTRY_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load([[LOAD_CXX]])(ptr {{.*}} @t_int4, [[LOAD_LLVM]] noundef %{{.*}})
 // CHECK: ret <4 x i32> %[[CALL]]
 int4 test_load_int4(ENTRY_TYPE loc : LOC) {
   return t_int4.Load(LOAD_ARG);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call <4 x i32> @llvm.dx.resource.load.level.v4i32.tdx.Texture_v4i32_{{.*}}("dx.Texture", <4 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call <4 x i32> @llvm.spv.resource.load.level.v4i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT21]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: define linkonce_odr hidden {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load([[LOAD_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call <4 x i32> @llvm.dx.resource.load.level.v4i32.tdx.Texture_v4i32_{{.*}}("dx.Texture", <4 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: %[[RES:.*]] = call <4 x i32> @llvm.spv.resource.load.level.v4i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT21]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 {{[^,]*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <4 x i32> %[[RES]]
 
 #ifdef HAS_OFFSET
-// SRV: define hidden {{.*}} <4 x i32> @test_load_offset_int4(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_int4, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: define hidden {{.*}} <4 x i32> @test_load_offset_int4([[ENTRY_CXX]])
+// SRV: %[[CALL:.*]] = call {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t_int4, [[LOAD_LLVM]] noundef %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // SRV: ret <4 x i32> %[[CALL]]
 int4 test_load_offset_int4(ENTRY_TYPE loc : LOC) {
   return t_int4.Load(LOAD_ARG, OFFSET_ARG);
 }
 #endif
 
-// SRV: define linkonce_odr hidden {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call <4 x i32> @llvm.dx.resource.load.level.v4i32.tdx.Texture_v4i32_{{.*}}("dx.Texture", <4 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call <4 x i32> @llvm.spv.resource.load.level.v4i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT21]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: define linkonce_odr hidden {{.*}} <4 x i32> @hlsl::[[TEXTURE]]<int vector[4]>::Load([[LOAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:.*]], [[LOAD_LLVM]] {{.*}} %[[LOAD:.*]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call <4 x i32> @llvm.dx.resource.load.level.v4i32.tdx.Texture_v4i32_{{.*}}("dx.Texture", <4 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call <4 x i32> @llvm.spv.resource.load.level.v4i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT21]]) %{{.*}}, [[COORD_LLVM]] %{{.*}}, i32 %{{.*}}, [[OFFSET_LLVM]] %{{.*}})
 // SRV: ret <4 x i32> %[[RES]]
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
index 7f258ec5b0c5f..70b1939116bf5 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
@@ -1,36 +1,71 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,COORD2 -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_DIM=2 -DLOAD_DIM=3 -DDXIL_TY=2 -DDIM=2
+// RUN:   -DTEXTURE=Texture1D -DCOORD_TYPE=float -DINDEX_TYPE=int -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,SCALAR-COORD \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 -DLOAD_DIM=2 -DDXIL_TY=1 -DDIM=1 \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX=int -DOFFSET_LLVM=i32 -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,COORD3 -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=7 -DDIM=2
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DINDEX_TYPE=int2 -o - \
+// RUN:   %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,COORD2,VEC-COORD -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_DIM=2 -DLOAD_DIM=3 -DDXIL_TY=6 -DDIM=1 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX="int vector[2]" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 -DINDEX_TYPE=int2 -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,COORD2,VEC-COORD \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 -DLOAD_DIM=3 -DDXIL_TY=2 -DDIM=2 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX="int vector[2]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -DINDEX_TYPE=int3 -o - \
+// RUN:   %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,COORD3,VEC-COORD -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=7 -DDIM=2 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
 // RUN:   -DTEXTURE=Texture3D -DCOORD_DIM=3 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s --check-prefixes=CHECK,COORD3 -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=4 -DDIM=3
+// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=4 -DDIM=3 \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DINDEX_CXX="int vector[3]" -DINDEX_LLVM="<3 x i32>" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
 //   TEXTURE            resource type name
+//   COORD_TYPE         sample location type
+//   INDEX_TYPE         mips slice index type
 //   COORD_DIM          sample location components (DIM plus the array slice)
+//   COORD_LLVM         sample location type in the IR
+//   COORD_CXX          sample location type in the C++ signature
+//   INDEX_LLVM         mips slice index type in the IR
+//   INDEX_CXX          mips slice index type in the C++ signature
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   LOAD_DIM           Load location components (COORD_DIM plus the mip level)
 //   DXIL_TY            dx.Texture resource-kind operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
 //                      location)
 //
 // Check prefixes:
-//   COORD2             the coordinate has two components
-//   COORD3             the coordinate has three components (an
-//                      array slice or a third resource dimension)
+//   COORD2             the location is built from two coordinate components
+//   COORD3             the location is built from three coordinate components
+//   VEC-COORD          the coordinate is a vector, so the location is built
+//                      element by element and the coordinate is shuffled back
+//                      out of it
+//   SCALAR-COORD       1D types, whose coordinate is a single value
 
 TEXTURE<float4> t;
 
@@ -47,20 +82,20 @@ TEXTURE<float4> t;
 // CHECK: %[[MIPS_HANDLE_GEP:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_type", ptr %[[MIPS_GEP]], i32 0, i32 0
 // CHECK: store target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) %[[HANDLE]], ptr %[[MIPS_HANDLE_GEP]]
 
-// CHECK: define internal {{.*}} <4 x float> @test_mips(float vector[[[COORD_DIM]]])(<[[COORD_DIM]] x float> {{.*}} %loc)
+// CHECK: define internal {{.*}} <4 x float> @test_mips([[COORD_CXX]])([[COORD_LLVM]] {{.*}} %loc)
 // CHECK: entry:
-// CHECK: %[[LOC_ADDR:.*]] = alloca <[[COORD_DIM]] x float>
+// CHECK: %[[LOC_ADDR:.*]] = alloca [[COORD_LLVM]]
 // CHECK: %[[REF_TMP:.*]] = alloca %"struct.hlsl::[[TEXTURE]]<>::mips_slice_type"
-// CHECK: store <[[COORD_DIM]] x float> %loc, ptr %[[LOC_ADDR]]
+// CHECK: store [[COORD_LLVM]] %loc, ptr %[[LOC_ADDR]]
 // CHECK: call void @hlsl::[[TEXTURE]]<float vector[4]>::mips_type::operator[](int) const(ptr {{.*}} %[[REF_TMP]], ptr {{.*}} getelementptr {{.*}} (i8, ptr @t, i32 4), i32 noundef 0)
-// CHECK: %[[V0:.*]] = load <[[COORD_DIM]] x float>, ptr %[[LOC_ADDR]]
-// CHECK: %[[CONV:.*]] = fptosi <[[COORD_DIM]] x float> %[[V0]] to <[[COORD_DIM]] x i32>
-// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::operator[](int vector[[[COORD_DIM]]]) const(ptr {{.*}} %[[REF_TMP]], <[[COORD_DIM]] x i32> {{.*}} %[[CONV]])
+// CHECK: %[[V0:.*]] = load [[COORD_LLVM]], ptr %[[LOC_ADDR]]
+// CHECK: %[[CONV:.*]] = fptosi [[COORD_LLVM]] %[[V0]] to [[INDEX_LLVM]]
+// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::operator[]([[INDEX_CXX]]) const(ptr {{.*}} %[[REF_TMP]], [[INDEX_LLVM]] {{.*}} %[[CONV]])
 // CHECK: ret <4 x float> %[[CALL]]
 
 [shader("pixel")]
-float4 test_mips(vector<float, COORD_DIM> loc : LOC) : SV_Target {
-  return t.mips[0][(vector<int, COORD_DIM>)loc];
+float4 test_mips(COORD_TYPE loc : LOC) : SV_Target {
+  return t.mips[0][(INDEX_TYPE)loc];
 }
 
 // CHECK: define linkonce_odr hidden void @hlsl::[[TEXTURE]]<float vector[4]>::mips_type::operator[](int) const(ptr  {{.*}} %agg.result, ptr {{.*}} %this, i32 {{.*}} %Level)
@@ -83,30 +118,36 @@ float4 test_mips(vector<float, COORD_DIM> loc : LOC) : SV_Target {
 // CHECK: store i32 %[[L_VAL]], ptr %[[LEVEL_GEP]]
 // CHECK: call void @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::mips_slice_type(hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type const&)(ptr noundef nonnull align 4 dereferenceable(8) %agg.result, ptr noundef nonnull align 4 dereferenceable(8) %[[SLICE]])
 
-// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::operator[](int vector[[[COORD_DIM]]]) const(ptr {{.*}} %[[THIS:.*]], <[[COORD_DIM]] x i32> noundef %[[COORD:.*]])
+// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::operator[]([[INDEX_CXX]]) const(ptr {{.*}} %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[COORD:.*]])
 // CHECK: entry:
-// CHECK: %[[COORD_ADDR:.*]] = alloca <[[COORD_DIM]] x i32>
-// CHECK: %[[VEC_TMP:.*]] = alloca <[[COORD_DIM]] x i32>
-// CHECK: store <[[COORD_DIM]] x i32> %[[COORD]], ptr %[[COORD_ADDR]]
+// CHECK: %[[COORD_ADDR:.*]] = alloca [[INDEX_LLVM]]
+// VEC-COORD: %[[VEC_TMP:.*]] = alloca [[INDEX_LLVM]]
+// CHECK: store [[INDEX_LLVM]] %[[COORD]], ptr %[[COORD_ADDR]]
 // CHECK: %[[THIS1:.*]] = load ptr, ptr %{{.*}}
-// CHECK: %[[COORD_PARAM:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[COORD_ADDR]]
-// CHECK: store <[[COORD_DIM]] x i32> %[[COORD_PARAM]], ptr %[[VEC_TMP]]
+// VEC-COORD: %[[COORD_PARAM:.*]] = load [[INDEX_LLVM]], ptr %[[COORD_ADDR]]
+// VEC-COORD: store [[INDEX_LLVM]] %[[COORD_PARAM]], ptr %[[VEC_TMP]]
 // CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_slice_type", ptr %[[THIS1]], i32 0, i32 0
 // CHECK: %[[HANDLE:.*]] = load target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
-// CHECK: %[[COORD_VAL:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[VEC_TMP]]
-// CHECK: %[[VECEXT:.*]] = extractelement <[[COORD_DIM]] x i32> %[[COORD_VAL]], i32 0
-// CHECK: %[[VECINIT:.*]] = insertelement <[[LOAD_DIM]] x i32> poison, i32 %[[VECEXT]], i32 0
-// CHECK: %[[COORD_VAL2:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[VEC_TMP]]
-// CHECK: %[[VECEXT2:.*]] = extractelement <[[COORD_DIM]] x i32> %[[COORD_VAL2]], i32 1
-// CHECK: %[[VECINIT3:.*]] = insertelement <[[LOAD_DIM]] x i32> %[[VECINIT]], i32 %[[VECEXT2]], i32 1
+// A 1D coordinate is a single value, so it goes straight into the location.
+// SCALAR-COORD: %[[COORD_VAL:.*]] = load i32, ptr %[[COORD_ADDR]]
+// SCALAR-COORD: %[[VECINIT3:.*]] = insertelement <[[LOAD_DIM]] x i32> poison, i32 %[[COORD_VAL]], i32 0
+
+// VEC-COORD: %[[COORD_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[VEC_TMP]]
+// VEC-COORD: %[[VECEXT:.*]] = extractelement [[INDEX_LLVM]] %[[COORD_VAL]], i32 0
+// VEC-COORD: %[[VECINIT:.*]] = insertelement <[[LOAD_DIM]] x i32> poison, i32 %[[VECEXT]], i32 0
+// VEC-COORD: %[[COORD_VAL2:.*]] = load [[INDEX_LLVM]], ptr %[[VEC_TMP]]
+// VEC-COORD: %[[VECEXT2:.*]] = extractelement [[INDEX_LLVM]] %[[COORD_VAL2]], i32 1
+// VEC-COORD: %[[VECINIT3:.*]] = insertelement <[[LOAD_DIM]] x i32> %[[VECINIT]], i32 %[[VECEXT2]], i32 1
 // COORD3: %[[COORD_VAL3:.*]] = load <3 x i32>, ptr %[[VEC_TMP]]
 // COORD3: %[[VECEXT3:.*]] = extractelement <3 x i32> %[[COORD_VAL3]], i32 2
 // COORD3: %[[VECINIT3B:.*]] = insertelement <4 x i32> %[[VECINIT3]], i32 %[[VECEXT3]], i32 2
 // CHECK: %[[LEVEL_PTR:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_slice_type", ptr %[[THIS1]], i32 0, i32 1
 // CHECK: %[[LEVEL_VAL:.*]] = load i32, ptr %[[LEVEL_PTR]]
+// SCALAR-COORD: %[[VECINITL:.*]] = insertelement <2 x i32> %[[VECINIT3]], i32 %[[LEVEL_VAL]], i32 1
 // COORD2: %[[VECINITL:.*]] = insertelement <3 x i32> %[[VECINIT3]], i32 %[[LEVEL_VAL]], i32 2
 // COORD3: %[[VECINITL:.*]] = insertelement <4 x i32> %[[VECINIT3B]], i32 %[[LEVEL_VAL]], i32 3
-// CHECK: %[[COORD_X:.*]] = shufflevector <[[LOAD_DIM]] x i32> %[[VECINITL]], <[[LOAD_DIM]] x i32> poison, <[[COORD_DIM]] x i32> {{.*}}
+// SCALAR-COORD: %[[COORD_X:.*]] = extractelement <[[LOAD_DIM]] x i32> %[[VECINITL]], i64 0
+// VEC-COORD: %[[COORD_X:.*]] = shufflevector <[[LOAD_DIM]] x i32> %[[VECINITL]], <[[LOAD_DIM]] x i32> poison, [[INDEX_LLVM]] {{.*}}
 // CHECK: %[[LOD:.*]] = extractelement <[[LOAD_DIM]] x i32> %[[VECINITL]], i64 [[COORD_DIM]]
-// CHECK: %[[RES:.*]] = call {{.*}} <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_0_0_0_[[DXIL_TY]]t.v[[COORD_DIM]]i32.i32.v[[DIM]]i32(target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[COORD_X]], i32 %[[LOD]], <[[DIM]] x i32> zeroinitializer)
+// CHECK: %[[RES:.*]] = call {{.*}} <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_0_0_0_[[DXIL_TY]]t{{.*}}(target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[COORD_X]], i32 %[[LOD]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <4 x float> %[[RES]]
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
index 01107d08f72fb..59e448efd1f68 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
@@ -1,82 +1,163 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
+// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
+// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
 // RUN:   -DCOORD_TYPE=float3 %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
 // RUN:   -DCOORD_TYPE=float3 %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -88,6 +169,8 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_DIM          sample location components (DIM plus the array slice)
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
@@ -119,31 +202,31 @@
 TEXTURE<float4> t;
 SamplerState s;
 
-// CHECK: define hidden {{.*}} <4 x float> @main(float vector[[[COORD_DIM]]])(<[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[LOC:.*]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}})
+// CHECK: define hidden {{.*}} <4 x float> @main([[COORD_CXX]])([[COORD_LLVM]] noundef nofpclass(nan inf) %[[LOC:.*]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}})
 // CHECK: ret <4 x float> %[[CALL]]
 
 float4 main(COORD_TYPE loc : LOC) : SV_Target {
   return t.Sample(s, loc);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[COORD_DIM]] x float> {{.*}} %[[COORD:[^)]+]])
+// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[COORD_LLVM]] {{.*}} %[[COORD:[^)]+]])
 // CHECK: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK: %[[COORD_ADDR:.*]] = alloca <[[COORD_DIM]] x float>
+// CHECK: %[[COORD_ADDR:.*]] = alloca [[COORD_LLVM]]
 // CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK: store <[[COORD_DIM]] x float> %[[COORD]], ptr %[[COORD_ADDR]]
+// CHECK: store [[COORD_LLVM]] %[[COORD]], ptr %[[COORD_ADDR]]
 // CHECK: %[[THIS_VAL:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK: %[[HANDLE_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL]], i32 0, i32 0
 // CHECK: %[[HANDLE:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP]]
 // CHECK: %[[SAMPLER_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK: %[[SAMPLER_H:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP]]
-// CHECK: %[[COORD_VAL:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR]]
-// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x i32> zeroinitializer) [ "convergencectrl"(token %0) ]
-// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x i32> zeroinitializer) [ "convergencectrl"(token %0) ]
+// CHECK: %[[COORD_VAL:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR]]
+// DXIL: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], [[COORD_LLVM]] %[[COORD_VAL]], [[OFFSET_LLVM]] [[OFFSET_ZERO]]) [ "convergencectrl"(token %0) ]
+// SPIRV: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], [[COORD_LLVM]] %[[COORD_VAL]], [[OFFSET_LLVM]] [[OFFSET_ZERO]]) [ "convergencectrl"(token %0) ]
 // CHECK: ret <4 x float> %[[RES]]
 
-// CHECK-OFFSET: define hidden {{.*}} <4 x float> @test_offset(float vector[[[COORD_DIM]]])(<[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[LOC:.*]])
-// CHECK-OFFSET: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x i32> {{.*}} [[OFFSET_CONST]])
+// CHECK-OFFSET: define hidden {{.*}} <4 x float> @test_offset([[COORD_CXX]])([[COORD_LLVM]] noundef nofpclass(nan inf) %[[LOC:.*]])
+// CHECK-OFFSET: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, [[OFFSET_LLVM]] {{.*}} [[OFFSET_CONST]])
 // CHECK-OFFSET: ret <4 x float> %[[CALL]]
 
 
@@ -153,30 +236,30 @@ float4 test_offset(COORD_TYPE loc : LOC) : SV_Target {
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[COORD_DIM]] x float> {{.*}} %[[COORD:[^,]+]], <[[DIM]] x i32> {{.*}} %[[OFFSET:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[COORD_LLVM]] {{.*}} %[[COORD:[^,]+]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:[^)]+]])
 // CHECK-OFFSET: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca <[[COORD_DIM]] x float>
-// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca <[[DIM]] x i32>
+// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca [[COORD_LLVM]]
+// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca [[OFFSET_LLVM]]
 // CHECK-OFFSET: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK-OFFSET: store <[[COORD_DIM]] x float> %[[COORD]], ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x i32> %[[OFFSET]], ptr %[[OFFSET_ADDR]]
+// CHECK-OFFSET: store [[COORD_LLVM]] %[[COORD]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: store [[OFFSET_LLVM]] %[[OFFSET]], ptr %[[OFFSET_ADDR]]
 // CHECK-OFFSET: %[[THIS_VAL:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK-OFFSET: %[[HANDLE_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP]]
 // CHECK-OFFSET: %[[SAMPLER_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP]]
-// CHECK-OFFSET: %[[COORD_VAL:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load <[[DIM]] x i32>, ptr %[[OFFSET_ADDR]]
-// DXIL-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]]) [ "convergencectrl"(token %0) ]
-// SPIRV-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]]) [ "convergencectrl"(token %0) ]
+// CHECK-OFFSET: %[[COORD_VAL:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load [[OFFSET_LLVM]], ptr %[[OFFSET_ADDR]]
+// DXIL-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], [[COORD_LLVM]] %[[COORD_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]]) [ "convergencectrl"(token %0) ]
+// SPIRV-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], [[COORD_LLVM]] %[[COORD_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]]) [ "convergencectrl"(token %0) ]
 // CHECK-OFFSET: ret <4 x float> %[[RES]]
 
-// CHECK-OFFSET: define hidden {{.*}} <4 x float> @test_clamp(float vector[[[COORD_DIM]]])(<[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[LOC:.*]])
-// CHECK-OFFSET: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]], int vector[[[DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}}, <[[DIM]] x i32> {{.*}} [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
+// CHECK-OFFSET: define hidden {{.*}} <4 x float> @test_clamp([[COORD_CXX]])([[COORD_LLVM]] noundef nofpclass(nan inf) %[[LOC:.*]])
+// CHECK-OFFSET: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]], [[OFFSET_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}}, [[OFFSET_LLVM]] {{.*}} [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
 // CHECK-OFFSET: ret <4 x float> %[[CALL]]
 
 // CHECK-NOOFFSET: @test_clamp(
-// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}}, float {{.*}} 1.000000e+00)
+// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}}, float {{.*}} 1.000000e+00)
 // CHECK-NOOFFSET: ret <4 x float> %[[CALL_NC]]
 
 #ifdef HAS_OFFSET
@@ -191,33 +274,34 @@ float4 test_clamp(COORD_TYPE loc : LOC) : SV_Target {
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]], int vector[[[DIM]]], float)(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[COORD_DIM]] x float> {{.*}} %[[COORD:[^,]+]], <[[DIM]] x i32> {{.*}} %[[OFFSET:[^,]+]], float {{.*}} %[[CLAMP:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]], [[OFFSET_CXX]], float)(ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[COORD_LLVM]] {{.*}} %[[COORD:[^,]+]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:[^,]+]], float {{.*}} %[[CLAMP:[^)]+]])
 // CHECK-OFFSET: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca <[[COORD_DIM]] x float>
-// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca <[[DIM]] x i32>
+// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca [[COORD_LLVM]]
+// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca [[OFFSET_LLVM]]
 // CHECK-OFFSET: %[[CLAMP_ADDR:.*]] = alloca float
 // CHECK-OFFSET: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK-OFFSET: store <[[COORD_DIM]] x float> %[[COORD]], ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x i32> %[[OFFSET]], ptr %[[OFFSET_ADDR]]
+// CHECK-OFFSET: store [[COORD_LLVM]] %[[COORD]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: store [[OFFSET_LLVM]] %[[OFFSET]], ptr %[[OFFSET_ADDR]]
 // CHECK-OFFSET: store float %[[CLAMP]], ptr %[[CLAMP_ADDR]]
 // CHECK-OFFSET: %[[THIS_VAL:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK-OFFSET: %[[HANDLE_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP]]
 // CHECK-OFFSET: %[[SAMPLER_GEP:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP]]
-// CHECK-OFFSET: %[[COORD_VAL:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load <[[DIM]] x i32>, ptr %[[OFFSET_ADDR]]
+// CHECK-OFFSET: %[[COORD_VAL:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load [[OFFSET_LLVM]], ptr %[[OFFSET_ADDR]]
 // CHECK-OFFSET: %[[CLAMP_VAL:.*]] = load float, ptr %[[CLAMP_ADDR]]
-// DXIL-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]], float %[[CLAMP_VAL]]) [ "convergencectrl"(token %0) ]
-// SPIRV-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]], float %[[CLAMP_VAL]]) [ "convergencectrl"(token %0) ]
+// DXIL-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE]], target("dx.Sampler", 0) %[[SAMPLER_H]], [[COORD_LLVM]] %[[COORD_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]], float %[[CLAMP_VAL]]) [ "convergencectrl"(token %0) ]
+// SPIRV-OFFSET: %[[RES:.*]] = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE]], target("spirv.Sampler") %[[SAMPLER_H]], [[COORD_LLVM]] %[[COORD_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]], float %[[CLAMP_VAL]]) [ "convergencectrl"(token %0) ]
 // CHECK-OFFSET: ret <4 x float> %[[RES]]
 
-// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, float vector[[[COORD_DIM]]], float)(
+// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::Sample(hlsl::SamplerState, [[COORD_CXX]], float)(
 // CHECK-NOOFFSET: %[[THIS_VAL_NC:.*]] = load ptr, ptr %{{.*}}
 // CHECK-NOOFFSET: %[[HANDLE_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL_NC]], i32 0, i32 0
 // CHECK-NOOFFSET: %[[HANDLE_NC:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP_NC]]
 // CHECK-NOOFFSET: %[[SAMPLER_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %{{.*}}, i32 0, i32 0
 // CHECK-NOOFFSET: %[[SAMPLER_H_NC:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP_NC]]
+// CHECK-NOOFFSET: %[[COORD_VAL_NC:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-NOOFFSET: %[[CLAMP_VAL_NC:.*]] = load float, ptr %{{.*}}
-// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
-// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
+// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.sample.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
+// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.sample.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
index 1de79c9db3b58..6889b4e9eb694 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
@@ -1,82 +1,163 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
+// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
+// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
 // RUN:   -DCOORD_TYPE=float3 %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
 // RUN:   -DCOORD_TYPE=float3 %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -88,6 +169,8 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_DIM          sample location components (DIM plus the array slice)
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
@@ -119,26 +202,27 @@
 TEXTURE<float4> t;
 SamplerState s;
 
-// CHECK: @test_bias(float vector[[[COORD_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
+// CHECK: @test_bias([[COORD_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
 // CHECK: ret <4 x float> %[[CALL]]
 
 float4 test_bias(COORD_TYPE loc : LOC) : SV_Target {
   return t.SampleBias(s, loc, 0.0f);
 }
 
-// CHECK: define linkonce_odr {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float)(
+// CHECK: define linkonce_odr {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float)(
 // CHECK: %[[THIS_VAL1:.*]] = load ptr, ptr %{{.*}}
 // CHECK: %[[HANDLE_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL1]], i32 0, i32 0
 // CHECK: %[[HANDLE1:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP1]]
 // CHECK: %[[SAMPLER_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %{{.*}}, i32 0, i32 0
 // CHECK: %[[SAMPLER_H1:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP1]]
+// CHECK: %[[COORD_VAL1:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK: %[[BIAS_VAL1:.*]] = load float, ptr %{{.*}}
-// DXIL: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplebias.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %{{.*}}, float %[[BIAS_VAL1]], <[[DIM]] x i32> zeroinitializer) [ "convergencectrl"(token %0) ]
-// SPIRV: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplebias.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %{{.*}}, float %[[BIAS_VAL1]], <[[DIM]] x i32> zeroinitializer) [ "convergencectrl"(token %0) ]
+// DXIL: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplebias.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[BIAS_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]]) [ "convergencectrl"(token %0) ]
+// SPIRV: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplebias.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[BIAS_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]]) [ "convergencectrl"(token %0) ]
 
-// CHECK-OFFSET: @test_offset(float vector[[[COORD_DIM]]])
-// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, <[[DIM]] x i32> noundef [[OFFSET_CONST]])
+// CHECK-OFFSET: @test_offset([[COORD_CXX]])
+// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float, [[OFFSET_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // CHECK-OFFSET: ret <4 x float> %[[CALL_OFFSET]]
 
 
@@ -148,22 +232,23 @@ float4 test_offset(COORD_TYPE loc : LOC) : SV_Target {
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float, [[OFFSET_CXX]])(
 // CHECK-OFFSET: %[[THIS_VAL2:.*]] = load ptr, ptr %{{.*}}
 // CHECK-OFFSET: %[[HANDLE_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL2]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE2:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP2]]
 // CHECK-OFFSET: %[[SAMPLER_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %{{.*}}, i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H2:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP2]]
+// CHECK-OFFSET: %[[COORD_VAL2:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-OFFSET: %[[BIAS_VAL2:.*]] = load float, ptr %{{.*}}
 // DXIL-OFFSET: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplebias.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]])
 // SPIRV-OFFSET: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplebias.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]])
 
-// CHECK-OFFSET: @test_clamp(float vector[[[COORD_DIM]]])
-// CHECK-OFFSET: %[[CALL_CLAMP:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, <[[DIM]] x i32> noundef [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
+// CHECK-OFFSET: @test_clamp([[COORD_CXX]])
+// CHECK-OFFSET: %[[CALL_CLAMP:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float, [[OFFSET_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
 // CHECK-OFFSET: ret <4 x float> %[[CALL_CLAMP]]
 
 // CHECK-NOOFFSET: @test_clamp(
-// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, float {{.*}} 1.000000e+00)
+// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float, float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, float {{.*}} 1.000000e+00)
 // CHECK-NOOFFSET: ret <4 x float> %[[CALL_NC]]
 
 #ifdef HAS_OFFSET
@@ -178,24 +263,26 @@ float4 test_clamp(COORD_TYPE loc : LOC) : SV_Target {
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]], float)(
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float, [[OFFSET_CXX]], float)(
 // CHECK-OFFSET: %[[THIS_VAL3:.*]] = load ptr, ptr %{{.*}}
 // CHECK-OFFSET: %[[HANDLE_GEP3:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL3]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE3:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP3]]
 // CHECK-OFFSET: %[[SAMPLER_GEP3:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %{{.*}}, i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H3:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP3]]
+// CHECK-OFFSET: %[[COORD_VAL3:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-OFFSET: %[[BIAS_VAL3:.*]] = load float, ptr %{{.*}}
 // CHECK-OFFSET: %[[CLAMP_VAL3:.*]] = load float, ptr %{{.*}}
-// DXIL-OFFSET: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplebias.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE3]], target("dx.Sampler", 0) %[[SAMPLER_H3]], <[[COORD_DIM]] x float> %{{.*}}, float %[[BIAS_VAL3]], <[[DIM]] x i32> %{{.*}}, float %[[CLAMP_VAL3]]) [ "convergencectrl"(token %0) ]
-// SPIRV-OFFSET: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplebias.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE3]], target("spirv.Sampler") %[[SAMPLER_H3]], <[[COORD_DIM]] x float> %{{.*}}, float %[[BIAS_VAL3]], <[[DIM]] x i32> %{{.*}}, float %[[CLAMP_VAL3]]) [ "convergencectrl"(token %0) ]
+// DXIL-OFFSET: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplebias.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE3]], target("dx.Sampler", 0) %[[SAMPLER_H3]], [[COORD_LLVM]] %{{.*}}, float %[[BIAS_VAL3]], [[OFFSET_LLVM]] %{{.*}}, float %[[CLAMP_VAL3]]) [ "convergencectrl"(token %0) ]
+// SPIRV-OFFSET: %{{.*}} = call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplebias.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE3]], target("spirv.Sampler") %[[SAMPLER_H3]], [[COORD_LLVM]] %{{.*}}, float %[[BIAS_VAL3]], [[OFFSET_LLVM]] %{{.*}}, float %[[CLAMP_VAL3]]) [ "convergencectrl"(token %0) ]
 
-// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, float)(
+// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleBias(hlsl::SamplerState, [[COORD_CXX]], float, float)(
 // CHECK-NOOFFSET: %[[THIS_VAL_NC:.*]] = load ptr, ptr %{{.*}}
 // CHECK-NOOFFSET: %[[HANDLE_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL_NC]], i32 0, i32 0
 // CHECK-NOOFFSET: %[[HANDLE_NC:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP_NC]]
 // CHECK-NOOFFSET: %[[SAMPLER_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %{{.*}}, i32 0, i32 0
 // CHECK-NOOFFSET: %[[SAMPLER_H_NC:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP_NC]]
+// CHECK-NOOFFSET: %[[COORD_VAL_NC:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-NOOFFSET: %[[BIAS_VAL_NC:.*]] = load float, ptr %{{.*}}
 // CHECK-NOOFFSET: %[[CLAMP_VAL_NC:.*]] = load float, ptr %{{.*}}
-// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplebias.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, float %[[BIAS_VAL_NC]], <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
-// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplebias.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, float %[[BIAS_VAL_NC]], <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
+// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplebias.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, float %[[BIAS_VAL_NC]], [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
+// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplebias.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, float %[[BIAS_VAL_NC]], [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
index babfb6086385a..f4daf941f63f8 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
@@ -1,65 +1,140 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
+// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
+// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
 // RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
 // RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -71,6 +146,8 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_DIM          sample location components (DIM plus the array slice)
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
@@ -102,28 +179,28 @@
 TEXTURE<float4> t;
 SamplerComparisonState s;
 
-// CHECK: @test_cmp(float vector[[[COORD_DIM]]], float)
-// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
+// CHECK: @test_cmp([[COORD_CXX]], float)
+// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
 // CHECK: ret float %[[CALL]]
 
 float test_cmp(COORD_TYPE loc : LOC, float cmp : CMP) : SV_Target {
   return t.SampleCmp(s, loc, 0.0f);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float)(
-// CHECK-SAME: ptr noundef nonnull {{.*}} %[[THIS1:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER1:[^,]+]], <[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[COORD1:[^,]+]], float noundef nofpclass(nan inf) %[[CMP1:[^)]+]])
+// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float)(
+// CHECK-SAME: ptr noundef nonnull {{.*}} %[[THIS1:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER1:[^,]+]], [[COORD_LLVM]] noundef nofpclass(nan inf) %[[COORD1:[^,]+]], float noundef nofpclass(nan inf) %[[CMP1:[^)]+]])
 // CHECK: %[[THIS_VAL1:.*]] = load ptr, ptr %{{.*}}
 // CHECK: %[[HANDLE_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL1]], i32 0, i32 0
 // CHECK: %[[HANDLE1:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP1]]
 // CHECK: %[[SAMPLER_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerComparisonState", ptr %[[SAMPLER1]], i32 0, i32 0
 // CHECK: %[[SAMPLER_H1:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP1]]
-// CHECK: %[[COORD_VAL1:.*]] = load <[[COORD_DIM]] x float>, ptr %{{.*}}
+// CHECK: %[[COORD_VAL1:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK: %[[CMP_VAL1:.*]] = load float, ptr %{{.*}}
-// DXIL: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL1]], float %[[CMP_VAL1]], <[[DIM]] x i32> zeroinitializer)
-// SPIRV: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL1]], float %[[CMP_VAL1]], <[[DIM]] x i32> zeroinitializer)
+// DXIL: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[CMP_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[CMP_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 
-// CHECK-OFFSET: @test_offset(float vector[[[COORD_DIM]]], float)
-// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, <[[DIM]] x i32> noundef [[OFFSET_CONST]])
+// CHECK-OFFSET: @test_offset([[COORD_CXX]], float)
+// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float, [[OFFSET_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // CHECK-OFFSET: ret float %[[CALL_OFFSET]]
 
 
@@ -133,25 +210,25 @@ float test_offset(COORD_TYPE loc : LOC, float cmp : CMP) : SV_Target {
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(
-// CHECK-OFFSET-SAME: ptr noundef nonnull {{.*}} %[[THIS2:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER2:[^,]+]], <[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[COORD2:[^,]+]], float noundef nofpclass(nan inf) %[[CMP2:[^,]+]], <[[DIM]] x i32> noundef %[[OFFSET2:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float, [[OFFSET_CXX]])(
+// CHECK-OFFSET-SAME: ptr noundef nonnull {{.*}} %[[THIS2:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER2:[^,]+]], [[COORD_LLVM]] noundef nofpclass(nan inf) %[[COORD2:[^,]+]], float noundef nofpclass(nan inf) %[[CMP2:[^,]+]], [[OFFSET_LLVM]] noundef %[[OFFSET2:[^)]+]])
 // CHECK-OFFSET: %[[THIS_VAL2:.*]] = load ptr, ptr %{{.*}}
 // CHECK-OFFSET: %[[HANDLE_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL2]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE2:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP2]]
 // CHECK-OFFSET: %[[SAMPLER_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerComparisonState", ptr %[[SAMPLER2]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H2:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP2]]
-// CHECK-OFFSET: %[[COORD_VAL2:.*]] = load <[[COORD_DIM]] x float>, ptr %{{.*}}
+// CHECK-OFFSET: %[[COORD_VAL2:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-OFFSET: %[[CMP_VAL2:.*]] = load float, ptr %{{.*}}
-// CHECK-OFFSET: %[[OFFSET_VAL2:.*]] = load <[[DIM]] x i32>, ptr %{{.*}}
-// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL2]], float %[[CMP_VAL2]], <[[DIM]] x i32> %[[OFFSET_VAL2]])
-// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL2]], float %[[CMP_VAL2]], <[[DIM]] x i32> %[[OFFSET_VAL2]])
+// CHECK-OFFSET: %[[OFFSET_VAL2:.*]] = load [[OFFSET_LLVM]], ptr %{{.*}}
+// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL2]], float %[[CMP_VAL2]], [[OFFSET_LLVM]] %[[OFFSET_VAL2]])
+// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL2]], float %[[CMP_VAL2]], [[OFFSET_LLVM]] %[[OFFSET_VAL2]])
 
-// CHECK-OFFSET: @test_clamp(float vector[[[COORD_DIM]]], float)
-// CHECK-OFFSET: %[[CALL_CLAMP:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, <[[DIM]] x i32> noundef [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
+// CHECK-OFFSET: @test_clamp([[COORD_CXX]], float)
+// CHECK-OFFSET: %[[CALL_CLAMP:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float, [[OFFSET_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
 // CHECK-OFFSET: ret float %[[CALL_CLAMP]]
 
 // CHECK-NOOFFSET: @test_clamp(
-// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, float {{.*}} 1.000000e+00)
+// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float, float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, float {{.*}} 1.000000e+00)
 // CHECK-NOOFFSET: ret float %[[CALL_NC]]
 
 #ifdef HAS_OFFSET
@@ -166,27 +243,28 @@ float test_clamp(COORD_TYPE loc : LOC, float cmp : CMP) : SV_Target {
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]], float)(
-// CHECK-OFFSET-SAME: ptr noundef nonnull {{.*}} %[[THIS3:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER3:[^,]+]], <[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[COORD3:[^,]+]], float noundef nofpclass(nan inf) %[[CMP3:[^,]+]], <[[DIM]] x i32> noundef %[[OFFSET3:[^,]+]], float noundef nofpclass(nan inf) %[[CLAMP3:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float, [[OFFSET_CXX]], float)(
+// CHECK-OFFSET-SAME: ptr noundef nonnull {{.*}} %[[THIS3:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER3:[^,]+]], [[COORD_LLVM]] noundef nofpclass(nan inf) %[[COORD3:[^,]+]], float noundef nofpclass(nan inf) %[[CMP3:[^,]+]], [[OFFSET_LLVM]] noundef %[[OFFSET3:[^,]+]], float noundef nofpclass(nan inf) %[[CLAMP3:[^)]+]])
 // CHECK-OFFSET: %[[THIS_VAL3:.*]] = load ptr, ptr %{{.*}}
 // CHECK-OFFSET: %[[HANDLE_GEP3:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL3]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE3:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP3]]
 // CHECK-OFFSET: %[[SAMPLER_GEP3:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerComparisonState", ptr %[[SAMPLER3]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H3:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP3]]
-// CHECK-OFFSET: %[[COORD_VAL3:.*]] = load <[[COORD_DIM]] x float>, ptr %{{.*}}
+// CHECK-OFFSET: %[[COORD_VAL3:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-OFFSET: %[[CMP_VAL3:.*]] = load float, ptr %{{.*}}
-// CHECK-OFFSET: %[[OFFSET_VAL3:.*]] = load <[[DIM]] x i32>, ptr %{{.*}}
+// CHECK-OFFSET: %[[OFFSET_VAL3:.*]] = load [[OFFSET_LLVM]], ptr %{{.*}}
 // CHECK-OFFSET: %[[CLAMP_VAL3:.*]] = load float, ptr %{{.*}}
-// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.clamp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE3]], target("dx.Sampler", 0) %[[SAMPLER_H3]], <[[COORD_DIM]] x float> %[[COORD_VAL3]], float %[[CMP_VAL3]], <[[DIM]] x i32> %[[OFFSET_VAL3]], float %[[CLAMP_VAL3]])
-// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.clamp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE3]], target("spirv.Sampler") %[[SAMPLER_H3]], <[[COORD_DIM]] x float> %[[COORD_VAL3]], float %[[CMP_VAL3]], <[[DIM]] x i32> %[[OFFSET_VAL3]], float %[[CLAMP_VAL3]])
+// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.clamp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE3]], target("dx.Sampler", 0) %[[SAMPLER_H3]], [[COORD_LLVM]] %[[COORD_VAL3]], float %[[CMP_VAL3]], [[OFFSET_LLVM]] %[[OFFSET_VAL3]], float %[[CLAMP_VAL3]])
+// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.clamp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE3]], target("spirv.Sampler") %[[SAMPLER_H3]], [[COORD_LLVM]] %[[COORD_VAL3]], float %[[CMP_VAL3]], [[OFFSET_LLVM]] %[[OFFSET_VAL3]], float %[[CLAMP_VAL3]])
 
-// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, float)(
+// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmp(hlsl::SamplerComparisonState, [[COORD_CXX]], float, float)(
 // CHECK-NOOFFSET: %[[THIS_VAL_NC:.*]] = load ptr, ptr %{{.*}}
 // CHECK-NOOFFSET: %[[HANDLE_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL_NC]], i32 0, i32 0
 // CHECK-NOOFFSET: %[[HANDLE_NC:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP_NC]]
 // CHECK-NOOFFSET: %[[SAMPLER_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerComparisonState", ptr %{{.*}}, i32 0, i32 0
 // CHECK-NOOFFSET: %[[SAMPLER_H_NC:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP_NC]]
+// CHECK-NOOFFSET: %[[COORD_VAL_NC:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-NOOFFSET: %[[CMP_VAL_NC:.*]] = load float, ptr %{{.*}}
 // CHECK-NOOFFSET: %[[CLAMP_VAL_NC:.*]] = load float, ptr %{{.*}}
-// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.clamp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, float %[[CMP_VAL_NC]], <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
-// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.clamp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, float %[[CMP_VAL_NC]], <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
+// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmp.clamp.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, float %[[CMP_VAL_NC]], [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
+// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmp.clamp.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, float %[[CMP_VAL_NC]], [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
index c2593ac370cbc..0b02ccefc8227 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
@@ -1,63 +1,137 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=1 \
+// RUN:   -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=6 \
+// RUN:   -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=2 \
-// RUN:   -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL -DDXIL_TY=5 -DRW=0 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   --check-prefixes=CHECK,DXIL -DDXIL_TY=9 -DRW=0 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=1 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=0 \
 // RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 \
-// RUN:   -DSPV_DIM=3 -DDIM=3
+// RUN:   -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 \
-// RUN:   -DSPV_DIM=3 -DDIM=3
+// RUN:   -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=7 \
-// RUN:   -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=1 \
 // RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -69,6 +143,8 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_DIM          sample location components (DIM plus the array slice)
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
@@ -86,28 +162,28 @@
 TEXTURE<float4> t;
 SamplerComparisonState s;
 
-// CHECK: @test_cmp_level_zero(float vector[[[COORD_DIM]]], float)
-// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
+// CHECK: @test_cmp_level_zero([[COORD_CXX]], float)
+// CHECK: %[[CALL:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, [[COORD_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
 // CHECK: ret float %[[CALL]]
 
 float test_cmp_level_zero(COORD_TYPE loc : LOC, float cmp : CMP) : SV_Target {
   return t.SampleCmpLevelZero(s, loc, 0.0f);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float)(
-// CHECK-SAME: ptr noundef nonnull {{.*}} %[[THIS1:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER1:[^,]+]], <[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[COORD1:[^,]+]], float noundef nofpclass(nan inf) %[[CMP1:[^)]+]])
+// CHECK: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, [[COORD_CXX]], float)(
+// CHECK-SAME: ptr noundef nonnull {{.*}} %[[THIS1:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER1:[^,]+]], [[COORD_LLVM]] noundef nofpclass(nan inf) %[[COORD1:[^,]+]], float noundef nofpclass(nan inf) %[[CMP1:[^)]+]])
 // CHECK: %[[THIS_VAL1:.*]] = load ptr, ptr %{{.*}}
 // CHECK: %[[HANDLE_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL1]], i32 0, i32 0
 // CHECK: %[[HANDLE1:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP1]]
 // CHECK: %[[SAMPLER_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerComparisonState", ptr %[[SAMPLER1]], i32 0, i32 0
 // CHECK: %[[SAMPLER_H1:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP1]]
-// CHECK: %[[COORD_VAL1:.*]] = load <[[COORD_DIM]] x float>, ptr %{{.*}}
+// CHECK: %[[COORD_VAL1:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK: %[[CMP_VAL1:.*]] = load float, ptr %{{.*}}
-// DXIL: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmplevelzero.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL1]], float %[[CMP_VAL1]], <[[DIM]] x i32> zeroinitializer)
-// SPIRV: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmplevelzero.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL1]], float %[[CMP_VAL1]], <[[DIM]] x i32> zeroinitializer)
+// DXIL: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmplevelzero.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[CMP_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmplevelzero.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[CMP_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 
-// CHECK-OFFSET: @test_cmp_level_zero_offset(float vector[[[COORD_DIM]]], float)
-// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, <[[DIM]] x i32> noundef [[OFFSET_CONST]])
+// CHECK-OFFSET: @test_cmp_level_zero_offset([[COORD_CXX]], float)
+// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, [[COORD_CXX]], float, [[OFFSET_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerComparisonState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // CHECK-OFFSET: ret float %[[CALL_OFFSET]]
 
 #ifdef HAS_OFFSET
@@ -116,15 +192,15 @@ float test_cmp_level_zero_offset(COORD_TYPE loc : LOC, float cmp : CMP) : SV_Tar
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(
-// CHECK-OFFSET-SAME: ptr noundef nonnull {{.*}} %[[THIS2:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER2:[^,]+]], <[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[COORD2:[^,]+]], float noundef nofpclass(nan inf) %[[CMP2:[^,]+]], <[[DIM]] x i32> noundef %[[OFFSET2:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} float @hlsl::[[TEXTURE]]<float vector[4]>::SampleCmpLevelZero(hlsl::SamplerComparisonState, [[COORD_CXX]], float, [[OFFSET_CXX]])(
+// CHECK-OFFSET-SAME: ptr noundef nonnull {{.*}} %[[THIS2:[^,]+]], ptr noundef byval(%"class.hlsl::SamplerComparisonState") {{.*}} %[[SAMPLER2:[^,]+]], [[COORD_LLVM]] noundef nofpclass(nan inf) %[[COORD2:[^,]+]], float noundef nofpclass(nan inf) %[[CMP2:[^,]+]], [[OFFSET_LLVM]] noundef %[[OFFSET2:[^)]+]])
 // CHECK-OFFSET: %[[THIS_VAL2:.*]] = load ptr, ptr %{{.*}}
 // CHECK-OFFSET: %[[HANDLE_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL2]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE2:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP2]]
 // CHECK-OFFSET: %[[SAMPLER_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerComparisonState", ptr %[[SAMPLER2]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H2:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP2]]
-// CHECK-OFFSET: %[[COORD_VAL2:.*]] = load <[[COORD_DIM]] x float>, ptr %{{.*}}
+// CHECK-OFFSET: %[[COORD_VAL2:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-OFFSET: %[[CMP_VAL2:.*]] = load float, ptr %{{.*}}
-// CHECK-OFFSET: %[[OFFSET_VAL2:.*]] = load <[[DIM]] x i32>, ptr %{{.*}}
-// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmplevelzero.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL2]], float %[[CMP_VAL2]], <[[DIM]] x i32> %[[OFFSET_VAL2]])
-// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmplevelzero.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL2]], float %[[CMP_VAL2]], <[[DIM]] x i32> %[[OFFSET_VAL2]])
+// CHECK-OFFSET: %[[OFFSET_VAL2:.*]] = load [[OFFSET_LLVM]], ptr %{{.*}}
+// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.dx.resource.samplecmplevelzero.f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL2]], float %[[CMP_VAL2]], [[OFFSET_LLVM]] %[[OFFSET_VAL2]])
+// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn float @llvm.spv.resource.samplecmplevelzero.f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL2]], float %[[CMP_VAL2]], [[OFFSET_LLVM]] %[[OFFSET_VAL2]])
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
index 5a1e8a640c321..82d01e36f40b1 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
@@ -1,82 +1,169 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_TYPE=float %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   | llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_TYPE=float %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
+// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
+// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   | llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
 // RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -90,6 +177,8 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_DIM          sample location components (DIM plus the array slice)
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
@@ -121,37 +210,37 @@
 TEXTURE<float4> t;
 SamplerState s;
 
-// CHECK: @test_grad(float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}})
+// CHECK: @test_grad([[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}})
 // CHECK: ret <4 x float> %[[CALL]]
 
 float4 test_grad(COORD_TYPE loc : LOC, GRAD_TYPE ddx : DDX, GRAD_TYPE ddy : DDY) : SV_Target {
   return t.SampleGrad(s, loc, ddx, ddy);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]])(
-// CHECK-SAME: ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[COORD_DIM]] x float> {{.*}} %[[COORD:[^,]+]], <[[DIM]] x float> {{.*}} %[[DDX:[^,]+]], <[[DIM]] x float> {{.*}} %[[DDY:[^)]+]])
+// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]])(
+// CHECK-SAME: ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[COORD_LLVM]] {{.*}} %[[COORD:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[DDX:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[DDY:[^)]+]])
 // CHECK: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK: %[[COORD_ADDR:.*]] = alloca <[[COORD_DIM]] x float>
-// CHECK: %[[DDX_ADDR:.*]] = alloca <[[DIM]] x float>
-// CHECK: %[[DDY_ADDR:.*]] = alloca <[[DIM]] x float>
+// CHECK: %[[COORD_ADDR:.*]] = alloca [[COORD_LLVM]]
+// CHECK: %[[DDX_ADDR:.*]] = alloca [[GRAD_LLVM]]
+// CHECK: %[[DDY_ADDR:.*]] = alloca [[GRAD_LLVM]]
 // CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK: store <[[COORD_DIM]] x float> %[[COORD]], ptr %[[COORD_ADDR]]
-// CHECK: store <[[DIM]] x float> %[[DDX]], ptr %[[DDX_ADDR]]
-// CHECK: store <[[DIM]] x float> %[[DDY]], ptr %[[DDY_ADDR]]
+// CHECK: store [[COORD_LLVM]] %[[COORD]], ptr %[[COORD_ADDR]]
+// CHECK: store [[GRAD_LLVM]] %[[DDX]], ptr %[[DDX_ADDR]]
+// CHECK: store [[GRAD_LLVM]] %[[DDY]], ptr %[[DDY_ADDR]]
 // CHECK: %[[THIS_VAL1:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK: %[[HANDLE_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL1]], i32 0, i32 0
 // CHECK: %[[HANDLE1:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP1]]
 // CHECK: %[[SAMPLER_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK: %[[SAMPLER_H1:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP1]]
-// CHECK: %[[COORD_VAL:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR]]
-// CHECK: %[[DDX_VAL:.*]] = load <[[DIM]] x float>, ptr %[[DDX_ADDR]]
-// CHECK: %[[DDY_VAL:.*]] = load <[[DIM]] x float>, ptr %[[DDY_ADDR]]
-// DXIL: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x float> %[[DDX_VAL]], <[[DIM]] x float> %[[DDY_VAL]], <[[DIM]] x i32> zeroinitializer)
-// SPIRV: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x float> %[[DDX_VAL]], <[[DIM]] x float> %[[DDY_VAL]], <[[DIM]] x i32> zeroinitializer)
-
-// CHECK-OFFSET: @test_offset(float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]])
-// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x i32> noundef [[OFFSET_CONST]])
+// CHECK: %[[COORD_VAL:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR]]
+// CHECK: %[[DDX_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[DDX_ADDR]]
+// CHECK: %[[DDY_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[DDY_ADDR]]
+// DXIL: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL]], [[GRAD_LLVM]] %[[DDX_VAL]], [[GRAD_LLVM]] %[[DDY_VAL]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL]], [[GRAD_LLVM]] %[[DDX_VAL]], [[GRAD_LLVM]] %[[DDY_VAL]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+
+// CHECK-OFFSET: @test_offset([[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]])
+// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]], [[OFFSET_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // CHECK-OFFSET: ret <4 x float> %[[CALL_OFFSET]]
 
 
@@ -161,36 +250,36 @@ float4 test_offset(COORD_TYPE loc : LOC, GRAD_TYPE ddx : DDX, GRAD_TYPE ddy : DD
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]], int vector[[[DIM]]])(
-// CHECK-OFFSET-SAME: ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[COORD_DIM]] x float> {{.*}} %[[COORD:[^,]+]], <[[DIM]] x float> {{.*}} %[[DDX:[^,]+]], <[[DIM]] x float> {{.*}} %[[DDY:[^,]+]], <[[DIM]] x i32> {{.*}} %[[OFFSET:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]], [[OFFSET_CXX]])(
+// CHECK-OFFSET-SAME: ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[COORD_LLVM]] {{.*}} %[[COORD:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[DDX:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[DDY:[^,]+]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:[^)]+]])
 // CHECK-OFFSET: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca <[[COORD_DIM]] x float>
-// CHECK-OFFSET: %[[DDX_ADDR:.*]] = alloca <[[DIM]] x float>
-// CHECK-OFFSET: %[[DDY_ADDR:.*]] = alloca <[[DIM]] x float>
-// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca <[[DIM]] x i32>
+// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca [[COORD_LLVM]]
+// CHECK-OFFSET: %[[DDX_ADDR:.*]] = alloca [[GRAD_LLVM]]
+// CHECK-OFFSET: %[[DDY_ADDR:.*]] = alloca [[GRAD_LLVM]]
+// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca [[OFFSET_LLVM]]
 // CHECK-OFFSET: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK-OFFSET: store <[[COORD_DIM]] x float> %[[COORD]], ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x float> %[[DDX]], ptr %[[DDX_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x float> %[[DDY]], ptr %[[DDY_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x i32> %[[OFFSET]], ptr %[[OFFSET_ADDR]]
+// CHECK-OFFSET: store [[COORD_LLVM]] %[[COORD]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: store [[GRAD_LLVM]] %[[DDX]], ptr %[[DDX_ADDR]]
+// CHECK-OFFSET: store [[GRAD_LLVM]] %[[DDY]], ptr %[[DDY_ADDR]]
+// CHECK-OFFSET: store [[OFFSET_LLVM]] %[[OFFSET]], ptr %[[OFFSET_ADDR]]
 // CHECK-OFFSET: %[[THIS_VAL2:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK-OFFSET: %[[HANDLE_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL2]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE2:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP2]]
 // CHECK-OFFSET: %[[SAMPLER_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H2:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP2]]
-// CHECK-OFFSET: %[[COORD_VAL:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: %[[DDX_VAL:.*]] = load <[[DIM]] x float>, ptr %[[DDX_ADDR]]
-// CHECK-OFFSET: %[[DDY_VAL:.*]] = load <[[DIM]] x float>, ptr %[[DDY_ADDR]]
-// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load <[[DIM]] x i32>, ptr %[[OFFSET_ADDR]]
-// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x float> %[[DDX_VAL]], <[[DIM]] x float> %[[DDY_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]])
-// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x float> %[[DDX_VAL]], <[[DIM]] x float> %[[DDY_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]])
-
-// CHECK-OFFSET: @test_clamp(float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]])
-// CHECK-OFFSET: %[[CALL_CLAMP:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]], int vector[[[DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x i32> noundef [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
+// CHECK-OFFSET: %[[COORD_VAL:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: %[[DDX_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[DDX_ADDR]]
+// CHECK-OFFSET: %[[DDY_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[DDY_ADDR]]
+// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load [[OFFSET_LLVM]], ptr %[[OFFSET_ADDR]]
+// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL]], [[GRAD_LLVM]] %[[DDX_VAL]], [[GRAD_LLVM]] %[[DDY_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]])
+// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL]], [[GRAD_LLVM]] %[[DDX_VAL]], [[GRAD_LLVM]] %[[DDY_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]])
+
+// CHECK-OFFSET: @test_clamp([[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]])
+// CHECK-OFFSET: %[[CALL_CLAMP:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]], [[OFFSET_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}}, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]], float {{.*}} 1.000000e+00)
 // CHECK-OFFSET: ret <4 x float> %[[CALL_CLAMP]]
 
 // CHECK-NOOFFSET: @test_clamp(
-// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}}, <[[DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 1.000000e+00)
+// CHECK-NOOFFSET: %[[CALL_NC:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}}, [[GRAD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 1.000000e+00)
 // CHECK-NOOFFSET: ret <4 x float> %[[CALL_NC]]
 
 #ifdef HAS_OFFSET
@@ -205,39 +294,40 @@ float4 test_clamp(COORD_TYPE loc : LOC, GRAD_TYPE ddx : DDX, GRAD_TYPE ddy : DDY
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]], int vector[[[DIM]]], float)(
-// CHECK-OFFSET-SAME: ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], <[[COORD_DIM]] x float> {{.*}} %[[COORD:[^,]+]], <[[DIM]] x float> {{.*}} %[[DDX:[^,]+]], <[[DIM]] x float> {{.*}} %[[DDY:[^,]+]], <[[DIM]] x i32> {{.*}} %[[OFFSET:[^,]+]], float {{.*}} %[[CLAMP:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]], [[OFFSET_CXX]], float)(
+// CHECK-OFFSET-SAME: ptr {{.*}} %[[THIS:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER:[^,]+]], [[COORD_LLVM]] {{.*}} %[[COORD:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[DDX:[^,]+]], [[GRAD_LLVM]] {{.*}} %[[DDY:[^,]+]], [[OFFSET_LLVM]] {{.*}} %[[OFFSET:[^,]+]], float {{.*}} %[[CLAMP:[^)]+]])
 // CHECK-OFFSET: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca <[[COORD_DIM]] x float>
-// CHECK-OFFSET: %[[DDX_ADDR:.*]] = alloca <[[DIM]] x float>
-// CHECK-OFFSET: %[[DDY_ADDR:.*]] = alloca <[[DIM]] x float>
-// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca <[[DIM]] x i32>
+// CHECK-OFFSET: %[[COORD_ADDR:.*]] = alloca [[COORD_LLVM]]
+// CHECK-OFFSET: %[[DDX_ADDR:.*]] = alloca [[GRAD_LLVM]]
+// CHECK-OFFSET: %[[DDY_ADDR:.*]] = alloca [[GRAD_LLVM]]
+// CHECK-OFFSET: %[[OFFSET_ADDR:.*]] = alloca [[OFFSET_LLVM]]
 // CHECK-OFFSET: %[[CLAMP_ADDR:.*]] = alloca float
 // CHECK-OFFSET: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK-OFFSET: store <[[COORD_DIM]] x float> %[[COORD]], ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x float> %[[DDX]], ptr %[[DDX_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x float> %[[DDY]], ptr %[[DDY_ADDR]]
-// CHECK-OFFSET: store <[[DIM]] x i32> %[[OFFSET]], ptr %[[OFFSET_ADDR]]
+// CHECK-OFFSET: store [[COORD_LLVM]] %[[COORD]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: store [[GRAD_LLVM]] %[[DDX]], ptr %[[DDX_ADDR]]
+// CHECK-OFFSET: store [[GRAD_LLVM]] %[[DDY]], ptr %[[DDY_ADDR]]
+// CHECK-OFFSET: store [[OFFSET_LLVM]] %[[OFFSET]], ptr %[[OFFSET_ADDR]]
 // CHECK-OFFSET: store float %[[CLAMP]], ptr %[[CLAMP_ADDR]]
 // CHECK-OFFSET: %[[THIS_VAL3:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK-OFFSET: %[[HANDLE_GEP3:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL3]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE3:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP3]]
 // CHECK-OFFSET: %[[SAMPLER_GEP3:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H3:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP3]]
-// CHECK-OFFSET: %[[COORD_VAL:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR]]
-// CHECK-OFFSET: %[[DDX_VAL:.*]] = load <[[DIM]] x float>, ptr %[[DDX_ADDR]]
-// CHECK-OFFSET: %[[DDY_VAL:.*]] = load <[[DIM]] x float>, ptr %[[DDY_ADDR]]
-// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load <[[DIM]] x i32>, ptr %[[OFFSET_ADDR]]
+// CHECK-OFFSET: %[[COORD_VAL:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR]]
+// CHECK-OFFSET: %[[DDX_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[DDX_ADDR]]
+// CHECK-OFFSET: %[[DDY_VAL:.*]] = load [[GRAD_LLVM]], ptr %[[DDY_ADDR]]
+// CHECK-OFFSET: %[[OFFSET_VAL:.*]] = load [[OFFSET_LLVM]], ptr %[[OFFSET_ADDR]]
 // CHECK-OFFSET: %[[CLAMP_VAL:.*]] = load float, ptr %[[CLAMP_ADDR]]
-// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE3]], target("dx.Sampler", 0) %[[SAMPLER_H3]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x float> %[[DDX_VAL]], <[[DIM]] x float> %[[DDY_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]], float %[[CLAMP_VAL]])
-// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE3]], target("spirv.Sampler") %[[SAMPLER_H3]], <[[COORD_DIM]] x float> %[[COORD_VAL]], <[[DIM]] x float> %[[DDX_VAL]], <[[DIM]] x float> %[[DDY_VAL]], <[[DIM]] x i32> %[[OFFSET_VAL]], float %[[CLAMP_VAL]])
+// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE3]], target("dx.Sampler", 0) %[[SAMPLER_H3]], [[COORD_LLVM]] %[[COORD_VAL]], [[GRAD_LLVM]] %[[DDX_VAL]], [[GRAD_LLVM]] %[[DDY_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]], float %[[CLAMP_VAL]])
+// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE3]], target("spirv.Sampler") %[[SAMPLER_H3]], [[COORD_LLVM]] %[[COORD_VAL]], [[GRAD_LLVM]] %[[DDX_VAL]], [[GRAD_LLVM]] %[[DDY_VAL]], [[OFFSET_LLVM]] %[[OFFSET_VAL]], float %[[CLAMP_VAL]])
 
-// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, float vector[[[COORD_DIM]]], float vector[[[DIM]]], float vector[[[DIM]]], float)(
+// CHECK-NOOFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleGrad(hlsl::SamplerState, [[COORD_CXX]], [[GRAD_CXX]], [[GRAD_CXX]], float)(
 // CHECK-NOOFFSET: %[[THIS_VAL_NC:.*]] = load ptr, ptr %{{.*}}
 // CHECK-NOOFFSET: %[[HANDLE_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL_NC]], i32 0, i32 0
 // CHECK-NOOFFSET: %[[HANDLE_NC:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP_NC]]
 // CHECK-NOOFFSET: %[[SAMPLER_GEP_NC:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %{{.*}}, i32 0, i32 0
 // CHECK-NOOFFSET: %[[SAMPLER_H_NC:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP_NC]]
+// CHECK-NOOFFSET: %[[COORD_VAL_NC:.*]] = load [[COORD_LLVM]], ptr %{{.*}}
 // CHECK-NOOFFSET: %[[CLAMP_VAL_NC:.*]] = load float, ptr %{{.*}}
-// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, <[[DIM]] x float> %{{.*}}, <[[DIM]] x float> %{{.*}}, <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
-// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], <[[COORD_DIM]] x float> %{{.*}}, <[[DIM]] x float> %{{.*}}, <[[DIM]] x float> %{{.*}}, <[[DIM]] x i32> zeroinitializer, float %[[CLAMP_VAL_NC]])
+// DXIL-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplegrad.clamp.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE_NC]], target("dx.Sampler", 0) %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, [[GRAD_LLVM]] %{{.*}}, [[GRAD_LLVM]] %{{.*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
+// SPIRV-NOOFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplegrad.clamp.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE_NC]], target("spirv.Sampler") %[[SAMPLER_H_NC]], [[COORD_LLVM]] %{{.*}}, [[GRAD_LLVM]] %{{.*}}, [[GRAD_LLVM]] %{{.*}}, [[OFFSET_LLVM]] [[OFFSET_ZERO]], float %[[CLAMP_VAL_NC]])
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
index 7a0dc8c723c02..9bb4d20dd3799 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
@@ -1,80 +1,161 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=5 -DRW=0 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=9 -DRW=0 -DDIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
+// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
+// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
+// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=0 -DSAMPLED=1 \
-// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=1 -DSAMPLED=1 \
-// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
 // RUN:   -DCOORD_TYPE=float3 %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
 // RUN:   -DCOORD_TYPE=float3 %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -86,6 +167,8 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_DIM          sample location components (DIM plus the array slice)
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   DIM                number of resource dimensions (offset, ddx/ddy, LOD
@@ -115,34 +198,34 @@
 TEXTURE<float4> t;
 SamplerState s;
 
-// CHECK: @test_level(float vector[[[COORD_DIM]]], float)
-// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, float vector[[[COORD_DIM]]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
+// CHECK: @test_level([[COORD_CXX]], float)
+// CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, [[COORD_CXX]], float)(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00)
 // CHECK: ret <4 x float> %[[CALL]]
 
 float4 test_level(COORD_TYPE loc : LOC, float lod : LOD) : SV_Target {
   return t.SampleLevel(s, loc, 0.0f);
 }
 
-// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, float vector[[[COORD_DIM]]], float)(
-// CHECK-SAME: ptr {{.*}} %[[THIS1:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER1:[^,]+]], <[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[COORD1:[^,]+]], float noundef nofpclass(nan inf) %[[LOD1:[^)]+]])
+// CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, [[COORD_CXX]], float)(
+// CHECK-SAME: ptr {{.*}} %[[THIS1:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER1:[^,]+]], [[COORD_LLVM]] noundef nofpclass(nan inf) %[[COORD1:[^,]+]], float noundef nofpclass(nan inf) %[[LOD1:[^)]+]])
 // CHECK: %[[THIS_ADDR1:.*]] = alloca ptr
-// CHECK: %[[COORD_ADDR1:.*]] = alloca <[[COORD_DIM]] x float>
+// CHECK: %[[COORD_ADDR1:.*]] = alloca [[COORD_LLVM]]
 // CHECK: %[[LOD_ADDR1:.*]] = alloca float
 // CHECK: store ptr %[[THIS1]], ptr %[[THIS_ADDR1]]
-// CHECK: store <[[COORD_DIM]] x float> %[[COORD1]], ptr %[[COORD_ADDR1]]
+// CHECK: store [[COORD_LLVM]] %[[COORD1]], ptr %[[COORD_ADDR1]]
 // CHECK: store float %[[LOD1]], ptr %[[LOD_ADDR1]]
 // CHECK: %[[THIS_VAL1:.*]] = load ptr, ptr %[[THIS_ADDR1]]
 // CHECK: %[[HANDLE_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL1]], i32 0, i32 0
 // CHECK: %[[HANDLE1:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP1]]
 // CHECK: %[[SAMPLER_GEP1:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER1]], i32 0, i32 0
 // CHECK: %[[SAMPLER_H1:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP1]]
-// CHECK: %[[COORD_VAL1:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR1]]
+// CHECK: %[[COORD_VAL1:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR1]]
 // CHECK: %[[LOD_VAL1:.*]] = load float, ptr %[[LOD_ADDR1]]
-// DXIL: call reassoc nnan ninf nsz arcp afn                         <4 x float> @llvm.dx.resource.samplelevel.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL1]], float %[[LOD_VAL1]], <[[DIM]] x i32> zeroinitializer)
-// SPIRV: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplelevel.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], <[[COORD_DIM]] x float> %[[COORD_VAL1]], float %[[LOD_VAL1]], <[[DIM]] x i32> zeroinitializer)
+// DXIL: call reassoc nnan ninf nsz arcp afn                         <4 x float> @llvm.dx.resource.samplelevel.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE1]], target("dx.Sampler", 0) %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[LOD_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// SPIRV: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplelevel.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE1]], target("spirv.Sampler") %[[SAMPLER_H1]], [[COORD_LLVM]] %[[COORD_VAL1]], float %[[LOD_VAL1]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 
-// CHECK-OFFSET: @test_offset(float vector[[[COORD_DIM]]], float)
-// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, <[[COORD_DIM]] x float> {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, <[[DIM]] x i32> noundef [[OFFSET_CONST]])
+// CHECK-OFFSET: @test_offset([[COORD_CXX]], float)
+// CHECK-OFFSET: %[[CALL_OFFSET:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, [[COORD_CXX]], float, [[OFFSET_CXX]])(ptr {{.*}} @t, ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}}, [[COORD_LLVM]] {{.*}} %{{.*}}, float {{.*}} 0.000000e+00, [[OFFSET_LLVM]] noundef [[OFFSET_CONST]])
 // CHECK-OFFSET: ret <4 x float> %[[CALL_OFFSET]]
 
 #ifdef HAS_OFFSET
@@ -151,23 +234,23 @@ float4 test_offset(COORD_TYPE loc : LOC, float lod : LOD) : SV_Target {
 }
 #endif
 
-// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, float vector[[[COORD_DIM]]], float, int vector[[[DIM]]])(
-// CHECK-OFFSET-SAME: ptr {{.*}} %[[THIS2:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER2:[^,]+]], <[[COORD_DIM]] x float> noundef nofpclass(nan inf) %[[COORD2:[^,]+]], float noundef nofpclass(nan inf) %[[LOD2:[^,]+]], <[[DIM]] x i32> noundef %[[OFFSET2:[^)]+]])
+// CHECK-OFFSET: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::SampleLevel(hlsl::SamplerState, [[COORD_CXX]], float, [[OFFSET_CXX]])(
+// CHECK-OFFSET-SAME: ptr {{.*}} %[[THIS2:[^,]+]], ptr {{.*}} byval(%"class.hlsl::SamplerState") {{.*}} %[[SAMPLER2:[^,]+]], [[COORD_LLVM]] noundef nofpclass(nan inf) %[[COORD2:[^,]+]], float noundef nofpclass(nan inf) %[[LOD2:[^,]+]], [[OFFSET_LLVM]] noundef %[[OFFSET2:[^)]+]])
 // CHECK-OFFSET: %[[THIS_ADDR2:.*]] = alloca ptr
-// CHECK-OFFSET: %[[COORD_ADDR2:.*]] = alloca <[[COORD_DIM]] x float>
+// CHECK-OFFSET: %[[COORD_ADDR2:.*]] = alloca [[COORD_LLVM]]
 // CHECK-OFFSET: %[[LOD_ADDR2:.*]] = alloca float
-// CHECK-OFFSET: %[[OFFSET_ADDR2:.*]] = alloca <[[DIM]] x i32>
+// CHECK-OFFSET: %[[OFFSET_ADDR2:.*]] = alloca [[OFFSET_LLVM]]
 // CHECK-OFFSET: store ptr %[[THIS2]], ptr %[[THIS_ADDR2]]
-// CHECK-OFFSET: store <[[COORD_DIM]] x float> %[[COORD2]], ptr %[[COORD_ADDR2]]
+// CHECK-OFFSET: store [[COORD_LLVM]] %[[COORD2]], ptr %[[COORD_ADDR2]]
 // CHECK-OFFSET: store float %[[LOD2]], ptr %[[LOD_ADDR2]]
-// CHECK-OFFSET: store <[[DIM]] x i32> %[[OFFSET2]], ptr %[[OFFSET_ADDR2]]
+// CHECK-OFFSET: store [[OFFSET_LLVM]] %[[OFFSET2]], ptr %[[OFFSET_ADDR2]]
 // CHECK-OFFSET: %[[THIS_VAL2:.*]] = load ptr, ptr %[[THIS_ADDR2]]
 // CHECK-OFFSET: %[[HANDLE_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::[[TEXTURE]]", ptr %[[THIS_VAL2]], i32 0, i32 0
 // CHECK-OFFSET: %[[HANDLE2:.*]] = load target{{.*}}, ptr %[[HANDLE_GEP2]]
 // CHECK-OFFSET: %[[SAMPLER_GEP2:.*]] = getelementptr inbounds nuw %"class.hlsl::SamplerState", ptr %[[SAMPLER2]], i32 0, i32 0
 // CHECK-OFFSET: %[[SAMPLER_H2:.*]] = load target{{.*}}, ptr %[[SAMPLER_GEP2]]
-// CHECK-OFFSET: %[[COORD_VAL2:.*]] = load <[[COORD_DIM]] x float>, ptr %[[COORD_ADDR2]]
+// CHECK-OFFSET: %[[COORD_VAL2:.*]] = load [[COORD_LLVM]], ptr %[[COORD_ADDR2]]
 // CHECK-OFFSET: %[[LOD_VAL2:.*]] = load float, ptr %[[LOD_ADDR2]]
-// CHECK-OFFSET: %[[OFFSET_VAL2:.*]] = load <[[DIM]] x i32>, ptr %[[OFFSET_ADDR2]]
-// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplelevel.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL2]], float %[[LOD_VAL2]], <[[DIM]] x i32> %[[OFFSET_VAL2]])
-// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplelevel.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], <[[COORD_DIM]] x float> %[[COORD_VAL2]], float %[[LOD_VAL2]], <[[DIM]] x i32> %[[OFFSET_VAL2]])
+// CHECK-OFFSET: %[[OFFSET_VAL2:.*]] = load [[OFFSET_LLVM]], ptr %[[OFFSET_ADDR2]]
+// DXIL-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.dx.resource.samplelevel.v4f32.{{.*}}(target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) %[[HANDLE2]], target("dx.Sampler", 0) %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL2]], float %[[LOD_VAL2]], [[OFFSET_LLVM]] %[[OFFSET_VAL2]])
+// SPIRV-OFFSET: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.spv.resource.samplelevel.v4f32.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[IMG_FMT]]) %[[HANDLE2]], target("spirv.Sampler") %[[SAMPLER_H2]], [[COORD_LLVM]] %[[COORD_VAL2]], float %[[LOD_VAL2]], [[OFFSET_LLVM]] %[[OFFSET_VAL2]])
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
index b098682e09e64..53eba7cdf9641 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
@@ -1,115 +1,252 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
-// RUN:   -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DRW=0
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_DIM=1 --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 -DRW=0 -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
-// RUN:   -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 -DRW=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 --check-prefixes=CHECK,DXIL \
+// RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=6 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
-// RUN:   -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
-// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=1
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_DIM=2 --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
-// RUN:   -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
-// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=2
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_DIM=1 --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 \
+// RUN:   -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=0 \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 --check-prefixes=CHECK,SPIRV \
+// RUN:   -DARRAYED=1 -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=0 -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_DIM=2 --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 \
+// RUN:   -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=1 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_TYPE=uint3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 -DRW=0
+// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 --check-prefixes=CHECK,DXIL \
+// RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_TYPE=uint3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=1 -DMS=0 -DSAMPLED=1 \
-// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=1
+// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 --check-prefixes=CHECK,SPIRV \
+// RUN:   -DARRAYED=1 -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=1 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DMS \
-// RUN:   -DCOORD_TYPE=uint2 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DMS -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.MSTexture -DDXIL_TY=3 -DRW=0
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DMS -DCOORD_DIM=2 --check-prefixes=CHECK,DXIL \
+// RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.MSTexture -DDXIL_TY=3 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DMS \
-// RUN:   -DCOORD_TYPE=uint2 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DMS -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=1 -DSAMPLED=1 \
-// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=1
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DMS -DCOORD_DIM=2 --check-prefixes=CHECK,SPIRV \
+// RUN:   -DARRAYED=0 -DMS=1 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=1 -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
-// RUN:   -DCOORD_TYPE=uint2 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture2D -DCOORD_DIM=2 \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
-// RUN:   -DCOORD_TYPE=uint3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1D \
+// RUN:   -DCOORD_TYPE=uint -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
-// RUN:   -DCOORD_TYPE=uint2 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture2D -DCOORD_DIM=2 \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=0 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=1
+// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=1 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
-// RUN:   -DCOORD_TYPE=uint3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1D \
+// RUN:   -DCOORD_TYPE=uint -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture1D -DCOORD_DIM=1 \
 // RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=0 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=2
+// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=0 \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
+// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1DArray \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=6 -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
+// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=1 -DMS=0 \
+// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=1 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1DArray \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture1DArray -DCOORD_DIM=2 \
+// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=1 -DMS=0 \
+// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=0 \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
+// RUN:   -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 -DRW=0 \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
+
+// Texture3D
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
+// RUN:   -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
+// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=2 \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
+
+// RWTexture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
 // RUN:   -DCOORD_TYPE=uint3 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
+// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
 // RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
+
+// RWTexture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
 // RUN:   -DCOORD_TYPE=uint3 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=1 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=1
+// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=0 -DMS=0 \
+// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=2 \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -125,6 +262,8 @@
 //   ROV_OR_COUNT       the overloaded second dx handle operand: IsROV for
 //                      dx.Texture, the sample count for dx.MSTexture
 //   DXIL_HANDLE        DXIL resource handle type (dx.Texture or dx.MSTexture)
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   ARRAYED            spirv.Image Arrayed operand
@@ -170,85 +309,85 @@ void main(COORD_TYPE DTid : SV_DispatchThreadID) {
 #endif
 }
 
-// CHECK: define hidden {{.*}}void @main(unsigned int vector[[[COORD_DIM]]])(<[[COORD_DIM]] x i32> noundef %[[DTID:.*]])
-// CHECK: %[[DTID_ADDR:.*]] = alloca <[[COORD_DIM]] x i32>
+// CHECK: define hidden {{.*}}void @main([[INDEX_CXX_U]])([[INDEX_LLVM]] noundef %[[DTID:.*]])
+// CHECK: %[[DTID_ADDR:.*]] = alloca [[INDEX_LLVM]]
 // CHECK: %[[VAL:.*]] = alloca <4 x float>
 // CHECK: %[[VAL2:.*]] = alloca float
 // CHECK: %[[VAL3:.*]] = alloca <3 x i32>
-// CHECK: store <[[COORD_DIM]] x i32> %[[DTID]], ptr %[[DTID_ADDR]]
-// CHECK: %[[DTID_VAL:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[DTID_ADDR]]
-// CHECK: %[[CALL1:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex, <[[COORD_DIM]] x i32> noundef %[[DTID_VAL]])
+// CHECK: store [[INDEX_LLVM]] %[[DTID]], ptr %[[DTID_ADDR]]
+// CHECK: %[[DTID_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
+// CHECK: %[[CALL1:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex, [[INDEX_LLVM]] noundef %[[DTID_VAL]])
 // CHECK: %[[LOAD_VAL:.*]] = load <4 x float>, ptr{{.*}} %[[CALL1]]
 // CHECK: store <4 x float> %[[LOAD_VAL]], ptr %[[VAL]]
-// CHECK: %[[DTID_VAL2:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[DTID_ADDR]]
-// CHECK: %[[CALL2:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex2, <[[COORD_DIM]] x i32> noundef %[[DTID_VAL2]])
+// CHECK: %[[DTID_VAL2:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
+// CHECK: %[[CALL2:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex2, [[INDEX_LLVM]] noundef %[[DTID_VAL2]])
 // CHECK: %[[LOAD_VAL2:.*]] = load float, ptr{{.*}} %[[CALL2]]
 // CHECK: store float %[[LOAD_VAL2]], ptr %[[VAL2]]
-// CHECK: %[[DTID_VAL3:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[DTID_ADDR]]
-// CHECK: %[[CALL3:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex3, <[[COORD_DIM]] x i32> noundef %[[DTID_VAL3]])
+// CHECK: %[[DTID_VAL3:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
+// CHECK: %[[CALL3:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex3, [[INDEX_LLVM]] noundef %[[DTID_VAL3]])
 // CHECK: %[[LOAD_VAL3:.*]] = load <3 x i32>, ptr{{.*}} %[[CALL3]]
 // CHECK: store <3 x i32> %[[LOAD_VAL3]], ptr %[[VAL3]]
 
 // Store a whole texel.
-// CHECK-STORE: %[[DTID_VAL:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[DTID_ADDR]]
-// CHECK-STORE: %[[CALL1:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr {{.*}} @Tex, <[[COORD_DIM]] x i32> noundef %[[DTID_VAL]])
+// CHECK-STORE: %[[DTID_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
+// CHECK-STORE: %[[CALL1:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex, [[INDEX_LLVM]] noundef %[[DTID_VAL]])
 // CHECK-STORE: store <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>, ptr{{.*}} %[[CALL1]]
 
 // Store a single component: a GEP off the texel pointer, which the DXIL
 // backend later expands into a read-modify-write of the whole texel.
-// CHECK-STORE: %[[DTID_VAL2:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[DTID_ADDR]]
-// CHECK-STORE: %[[CALL2:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr {{.*}} @Tex, <[[COORD_DIM]] x i32> noundef %[[DTID_VAL2]])
+// CHECK-STORE: %[[DTID_VAL2:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
+// CHECK-STORE: %[[CALL2:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex, [[INDEX_LLVM]] noundef %[[DTID_VAL2]])
 // CHECK-STORE: %[[ELEM:.*]] = getelementptr <4 x float>, ptr{{.*}} %[[CALL2]], i32 0, i32 1
 // CHECK-STORE: store float 5.000000e+00, ptr{{.*}} %[[ELEM]]
 
 // Store to a scalar texture.
-// CHECK-STORE: %[[DTID_VAL3:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[DTID_ADDR]]
-// CHECK-STORE: %[[CALL3:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr {{.*}} @Tex2, <[[COORD_DIM]] x i32> noundef %[[DTID_VAL3]])
+// CHECK-STORE: %[[DTID_VAL3:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
+// CHECK-STORE: %[[CALL3:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex2, [[INDEX_LLVM]] noundef %[[DTID_VAL3]])
 // CHECK-STORE: store float 6.000000e+00, ptr{{.*}} %[[CALL3]]
 
 // Store to an integer texture.
-// CHECK-STORE: %[[DTID_VAL4:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[DTID_ADDR]]
-// CHECK-STORE: %[[CALL4:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr {{.*}} @Tex3, <[[COORD_DIM]] x i32> noundef %[[DTID_VAL4]])
+// CHECK-STORE: %[[DTID_VAL4:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
+// CHECK-STORE: %[[CALL4:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex3, [[INDEX_LLVM]] noundef %[[DTID_VAL4]])
 // CHECK-STORE: store <3 x i32> <i32 7, i32 8, i32 9>, ptr{{.*}} %[[CALL4]]
 
-// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], <[[COORD_DIM]] x i32> noundef %[[INDEX:.*]])
+// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[INDEX:.*]])
 // CHECK: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK: %[[INDEX_ADDR:.*]] = alloca <[[COORD_DIM]] x i32>
+// CHECK: %[[INDEX_ADDR:.*]] = alloca [[INDEX_LLVM]]
 // CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK: store <[[COORD_DIM]] x i32> %[[INDEX]], ptr %[[INDEX_ADDR]]
+// CHECK: store [[INDEX_LLVM]] %[[INDEX]], ptr %[[INDEX_ADDR]]
 // CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]]", ptr %[[THIS1]], i32 0, i32 0
 // DXIL: %[[HANDLE:.*]] = load target("[[DXIL_HANDLE]]", <4 x float>, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
 // SPIRV: %[[HANDLE:.*]] = load target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT4]]), ptr %[[HANDLE_PTR]]
-// CHECK: %[[INDEX_VAL:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[INDEX_ADDR]]
-// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", <4 x float>, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[INDEX_VAL]])
-// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT4]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[INDEX_VAL]])
+// CHECK: %[[INDEX_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[INDEX_ADDR]]
+// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", <4 x float>, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
+// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT4]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
 // CHECK: ret ptr {{.*}}%[[PTR]]
 
-// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], <[[COORD_DIM]] x i32> noundef %[[INDEX:.*]])
+// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[INDEX:.*]])
 // CHECK: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK: %[[INDEX_ADDR:.*]] = alloca <[[COORD_DIM]] x i32>
+// CHECK: %[[INDEX_ADDR:.*]] = alloca [[INDEX_LLVM]]
 // CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK: store <[[COORD_DIM]] x i32> %[[INDEX]], ptr %[[INDEX_ADDR]]
+// CHECK: store [[INDEX_LLVM]] %[[INDEX]], ptr %[[INDEX_ADDR]]
 // CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]].0", ptr %[[THIS1]], i32 0, i32 0
 // DXIL: %[[HANDLE:.*]] = load target("[[DXIL_HANDLE]]", float, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
 // SPIRV: %[[HANDLE:.*]] = load target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT]]), ptr %[[HANDLE_PTR]]
-// CHECK: %[[INDEX_VAL:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[INDEX_ADDR]]
-// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", float, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[INDEX_VAL]])
-// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[INDEX_VAL]])
+// CHECK: %[[INDEX_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[INDEX_ADDR]]
+// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", float, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
+// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
 // CHECK: ret ptr {{.*}}%[[PTR]]
 
-// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[](unsigned int vector[[[COORD_DIM]]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], <[[COORD_DIM]] x i32> noundef %[[INDEX:.*]])
+// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[INDEX:.*]])
 // CHECK: %[[THIS_ADDR:.*]] = alloca ptr
-// CHECK: %[[INDEX_ADDR:.*]] = alloca <[[COORD_DIM]] x i32>
+// CHECK: %[[INDEX_ADDR:.*]] = alloca [[INDEX_LLVM]]
 // CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
-// CHECK: store <[[COORD_DIM]] x i32> %[[INDEX]], ptr %[[INDEX_ADDR]]
+// CHECK: store [[INDEX_LLVM]] %[[INDEX]], ptr %[[INDEX_ADDR]]
 // CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]]
 // CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]].1", ptr %[[THIS1]], i32 0, i32 0
 // DXIL: %[[HANDLE:.*]] = load target("[[DXIL_HANDLE]]", <3 x i32>, [[RW]], [[ROV_OR_COUNT]], 1, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
 // SPIRV: %[[HANDLE:.*]] = load target("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_INT3]]), ptr %[[HANDLE_PTR]]
-// CHECK: %[[INDEX_VAL:.*]] = load <[[COORD_DIM]] x i32>, ptr %[[INDEX_ADDR]]
-// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", <3 x i32>, [[RW]], [[ROV_OR_COUNT]], 1, [[DXIL_TY]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[INDEX_VAL]])
-// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_INT3]]) %[[HANDLE]], <[[COORD_DIM]] x i32> %[[INDEX_VAL]])
+// CHECK: %[[INDEX_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[INDEX_ADDR]]
+// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", <3 x i32>, [[RW]], [[ROV_OR_COUNT]], 1, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
+// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_INT3]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
 // CHECK: ret ptr {{.*}}%[[PTR]]
diff --git a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
index 41c71a7bf4d9a..e2a43bcdc0a1a 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
@@ -1,33 +1,76 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=Texture2D -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DDXIL_TY=2 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+// RUN:   -finclude-default-header -DTEXTURE=Texture1D -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1D -DDXIL_TY=1 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=Texture3D -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DDXIL_TY=4 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+// RUN:   -finclude-default-header -DTEXTURE=Texture1DArray -o - %s | \
+// RUN:   FileCheck %s -DTEXTURE=Texture1DArray -DDXIL_TY=6 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
+// RUN:   -finclude-default-header -DTEXTURE=Texture2D -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D -DDXIL_TY=2 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
+// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=TextureCube -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DDXIL_TY=5 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL
+// RUN:   -finclude-default-header -DTEXTURE=TextureCube -o - %s | FileCheck \
+// RUN:   %s -DTEXTURE=TextureCube -DDXIL_TY=5 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=TextureCubeArray -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DDXIL_TY=9 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL
+// RUN:   -finclude-default-header -DTEXTURE=TextureCubeArray -o - %s | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DDXIL_TY=9 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
+// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=Texture2DArray -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DDXIL_TY=7 -DRW=0 \
+// RUN:   -finclude-default-header -DTEXTURE=Texture2DArray -o - %s | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2DArray -DDXIL_TY=7 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
+// RUN:   -finclude-default-header -DTEXTURE=Texture3D -o - %s \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DDXIL_TY=4 -DRW=0 \
 // RUN:   --check-prefixes=CHECK,CHECK-TEXEL
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
 //   TEXTURE            resource type name
+//   GRAD_CXX           ddx/ddy type in the C++ signature
+//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //
diff --git a/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
index dbaab1b9f8e64..8ce078b40b390 100644
--- a/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
@@ -1,4 +1,10 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,dim1 \
+// RUN:   -DTEXTURE=Texture1D -DLOD_TYPE=float %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,dim1 \
+// RUN:   -DTEXTURE=Texture1DArray -DLOD_TYPE=float %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
 // RUN:   -finclude-default-header -fsyntax-only -verify=expected,dim2 \
 // RUN:   -DTEXTURE=Texture2D -DLOD_TYPE=float2 %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
@@ -25,6 +31,7 @@
 //                      vector
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
+//   dim1               diagnostics naming a scalar offset or location
 
 TEXTURE<float4> tex;
 SamplerState samp;
@@ -51,10 +58,12 @@ void main() {
   // expected-note@* {{'CalculateLevelOfDetailUnclamped' declared here}}
   tex.CalculateLevelOfDetailUnclamped(samp, loc, 0);
 
+  // dim1-error at +3 {{cannot initialize a parameter of type 'float' with an lvalue of type 'const char[8]'}}
   // dim2-error at +2 {{cannot initialize a parameter of type 'vector<float, 2>' (vector of 2 'float' values) with an lvalue of type 'const char[8]'}}
   // dim3-error at +1 {{cannot initialize a parameter of type 'vector<float, 3>' (vector of 3 'float' values) with an lvalue of type 'const char[8]'}}
   tex.CalculateLevelOfDetail(samp, "invalid");
 
+  // dim1-error at +3 {{cannot initialize a parameter of type 'float' with an lvalue of type 'const char[8]'}}
   // dim2-error at +2 {{cannot initialize a parameter of type 'vector<float, 2>' (vector of 2 'float' values) with an lvalue of type 'const char[8]'}}
   // dim3-error at +1 {{cannot initialize a parameter of type 'vector<float, 3>' (vector of 3 'float' values) with an lvalue of type 'const char[8]'}}
   tex.CalculateLevelOfDetailUnclamped(samp, "invalid");
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
index f7ebbafc19df0..7a9f2bf34dca4 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
@@ -1,4 +1,12 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_TYPE=float %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
 // RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int2 -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl
index 30705360319a2..e97db852e8df1 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl
@@ -1,4 +1,12 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1D -DCOORD_TYPE=float \
+// RUN:   %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 2)" -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s
@@ -30,6 +38,7 @@
 //   dim2               diagnostics naming a 2-component offset or location
 //                      vector
 //   nooffset           diagnostics for types that have no offset overloads
+//   dim1               diagnostics naming a scalar offset or location
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
@@ -80,7 +89,8 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleCmp(s2, loc, cmp);
 
 #ifdef HAS_OFFSET
-  // expected-error at +4 {{no matching member function for call to 'SampleCmp'}}
+  // expected-error at +5 {{no matching member function for call to 'SampleCmp'}}
+  // dim1-note@*:* {{candidate function not viable: no known conversion from 'SamplerComparisonState' to 'int' for 4th argument}}
   // dim2-note@*:* {{candidate function not viable: no known conversion from 'SamplerComparisonState' to 'vector<int, 2>' (vector of 2 'int' values) for 4th argument}}
   // expected-note@*:* {{candidate function not viable: requires 3 arguments, but 4 were provided}}
   // expected-note@*:* {{candidate function not viable: requires 5 arguments, but 4 were provided}}
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl
index c3d7b41fba2ea..e30c2d47560d3 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl
@@ -1,4 +1,12 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1D -DCOORD_TYPE=float \
+// RUN:   %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 2)" -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s
@@ -30,6 +38,7 @@
 //   dim2               diagnostics naming a 2-component offset or location
 //                      vector
 //   nooffset           diagnostics for types that have no offset overloads
+//   dim1               diagnostics naming a scalar offset or location
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
@@ -79,7 +88,8 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleCmpLevelZero(s2, loc, cmp);
 
 #ifdef HAS_OFFSET
-  // expected-error at +3 {{no matching member function for call to 'SampleCmpLevelZero'}}
+  // expected-error at +4 {{no matching member function for call to 'SampleCmpLevelZero'}}
+  // dim1-note@*:* {{candidate function not viable: no known conversion from 'SamplerComparisonState' to 'int' for 4th argument}}
   // dim2-note@*:* {{candidate function not viable: no known conversion from 'SamplerComparisonState' to 'vector<int, 2>' (vector of 2 'int' values) for 4th argument}}
   // expected-note@*:* {{candidate function not viable: requires 3 arguments, but 4 were provided}}
   t.SampleCmpLevelZero(s, loc, cmp, s);
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
index 649fbb3d27897..f9a01ffaf5049 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
@@ -1,4 +1,12 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_TYPE=float -DGRAD_TYPE=float %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
 // RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int2 -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 %s
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
index 594e101740f67..151035639f7c9 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
@@ -1,4 +1,12 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_TYPE=float %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
 // RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int2 -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s
diff --git a/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl b/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl
index 8ea48f8dc2872..579f9c045b929 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl
@@ -1,4 +1,12 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1D -DCOORD_TYPE=float \
+// RUN:   %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim1 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -fsyntax-only -finclude-default-header -verify=expected,offset,dim2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 2)" -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s
@@ -31,9 +39,10 @@
 //
 // Check prefixes:
 //   offset             diagnostics for types that have offset overloads
+//   nooffset           diagnostics for types that have no offset overloads
+//   dim1               diagnostics naming a scalar offset or location
 //   dim2               diagnostics naming a 2-component offset or location
 //                      vector
-//   nooffset           diagnostics for types that have no offset overloads
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
@@ -70,7 +79,8 @@ void main(COORD_TYPE loc) {
 
   t.Sample(s, loc, OFFSET_ARG, 1.0);
 
-  // expected-error at +5 {{no matching member function for call to 'Sample'}}
+  // expected-error at +6 {{no matching member function for call to 'Sample'}}
+  // dim1-note@*:* {{candidate function not viable: no known conversion from 'SamplerState' to 'int' for 3rd argument}}
   // dim2-note@*:* {{candidate function not viable: no known conversion from 'SamplerState' to 'vector<int, 2>' (vector of 2 'int' values) for 3rd argument}}
   // dim3-note@*:* {{candidate function not viable: no known conversion from 'SamplerState' to 'vector<int, 3>' (vector of 3 'int' values) for 3rd argument}}
   // expected-note@*:* {{candidate function not viable: requires 2 arguments, but 3 were provided}}
diff --git a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
index e1e55497af1fa..ab666a914d899 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
@@ -1,43 +1,73 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=Texture2D -DINDEX_TYPE=uint2 \
 // RUN:   -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
-// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify -o - %s
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=Texture1D -DINDEX_TYPE=uint \
+// RUN:   -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 -DWIDE_INDEX_ARG="int2(1, 2)" \
+// RUN:   -verify=expected,scalaridx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=Texture2DArray -DINDEX_TYPE=uint3 \
 // RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
 // RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
-// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify -o - %s
+// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=Texture3D -DINDEX_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
-// RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
-// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify -o - %s
+// RUN:   -finclude-default-header -DTEXTURE=Texture1DArray -DINDEX_TYPE=uint2 \
+// RUN:   -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
-// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify -o - %s
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture1D -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 \
+// RUN:   -DWIDE_INDEX_ARG="int2(1, 2)" -verify=expected,scalaridx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2DArray -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
 // RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
-// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" -verify \
-// RUN:   -o - %s
+// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
+// RUN:   -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DHAS_STORE \
-// RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
-// RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
-// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" -verify \
-// RUN:   -o - %s
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture1DArray -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
-// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify -o - %s
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture1D -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 \
+// RUN:   -DWIDE_INDEX_ARG="int2(1, 2)" -verify=expected,scalaridx -o - %s
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2DArray -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
 // RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
+// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
+// RUN:   -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture1DArray -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=Texture3D -DINDEX_TYPE=uint3 \
+// RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
+// RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
+// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify -o - %s
+
+// RWTexture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
+// RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
 // RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" -verify \
 // RUN:   -o - %s
+
+// RWTexture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
@@ -61,6 +91,10 @@
 //
 // The diagnostics use `-re` directives so that neither the type name nor the
 // index width has to be spelled out per texture type.
+//
+// Verify prefixes:
+//   vecidx             the index is a coordinate vector
+//   scalaridx          1D textures, whose index is a scalar
 
 TEXTURE<float4> Tex;
 TEXTURE<float> Tex2;
@@ -74,20 +108,25 @@ void main() {
   // Reading through the subscript works for every texture type.
   float4 val1 = Tex[valid_index];
 
-  // The index has to be convertible to the coordinate vector.
+  // The index has to be convertible to the coordinate.
   S s = { 1 };
-  // expected-error-re at +2 {{no viable overloaded operator[] for type '{{.*}}Texture{{.*}}<float4>'}}
-  // expected-note-re@*:* {{candidate function not viable: no known conversion from 'S' to 'vector<unsigned int, {{[0-9]}}>'}}
+  // expected-error-re at +3 {{no viable overloaded operator[] for type '{{.*}}Texture{{.*}}<float4>'}}
+  // vecidx-note-re@*:* {{candidate function not viable: no known conversion from 'S' to 'vector<unsigned int, {{[0-9]}}>'}}
+  // scalaridx-note@*:* {{candidate function not viable: no known conversion from 'S' to 'unsigned int'}}
   float4 val2 = Tex[s];
 
-  // A scalar index is splatted, which changes signedness.
+  // A signed scalar index is splatted into the coordinate vector, or used
+  // directly on a 1D texture; either way the signedness changes.
   int i = 1;
-  float4 val3 = Tex[i]; // expected-warning-re {{implicit conversion changes signedness: 'int' to 'vector<unsigned int, {{[0-9]}}>' (vector of {{[0-9]}} 'unsigned int' values)}}
+  // vecidx-warning-re at +2 {{implicit conversion changes signedness: 'int' to 'vector<unsigned int, {{[0-9]}}>' (vector of {{[0-9]}} 'unsigned int' values)}}
+  // scalaridx-warning at +1 {{implicit conversion changes signedness: 'int' to 'unsigned int'}}
+  float4 val3 = Tex[i];
 
   // An index with one component too many is truncated.
   WIDE_INDEX_TYPE big = WIDE_INDEX_ARG;
-  // expected-warning-re at +2 {{implicit conversion truncates vector: 'int{{[0-9]}}' (aka 'vector<int, {{[0-9]}}>') to 'vector<unsigned int, {{[0-9]}}>' (vector of {{[0-9]}} 'unsigned int' values)}}
-  // expected-warning-re at +1 {{implicit conversion changes signedness: 'int{{[0-9]}}' (aka 'vector<int, {{[0-9]}}>') to 'vector<unsigned int, {{[0-9]}}>' (vector of {{[0-9]}} 'unsigned int' values)}}
+  // vecidx-warning-re at +3 {{implicit conversion truncates vector: 'int{{[0-9]}}' (aka 'vector<int, {{[0-9]}}>') to 'vector<unsigned int, {{[0-9]}}>' (vector of {{[0-9]}} 'unsigned int' values)}}
+  // vecidx-warning-re at +2 {{implicit conversion changes signedness: 'int{{[0-9]}}' (aka 'vector<int, {{[0-9]}}>') to 'vector<unsigned int, {{[0-9]}}>' (vector of {{[0-9]}} 'unsigned int' values)}}
+  // scalaridx-warning-re at +1 {{implicit conversion turns vector to scalar: 'int{{[0-9]}}' (aka 'vector<int, {{[0-9]}}>') to 'unsigned int'}}
   float4 val4 = Tex[big];
 
 #ifdef NARROW_INDEX_TYPE
diff --git a/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl b/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
index fc4a6555759ca..557a5a648475f 100644
--- a/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
@@ -12,6 +12,14 @@
 // expected-no-diagnostics
 
 #ifdef SCALAR_FIRST
+Texture1D<float> Tex1D;
+Texture1D<float2> Tex1DVec;
+RWTexture1D<float> RWTex1D;
+RWTexture1D<float2> RWTex1DVec;
+Texture1DArray<float> Tex1DArray;
+Texture1DArray<float2> Tex1DArrayVec;
+RWTexture1DArray<float> RWTex1DArray;
+RWTexture1DArray<float2> RWTex1DArrayVec;
 Texture2D<float> Tex2D;
 Texture2D<float2> Tex2DVec;
 RWTexture2D<float> RWTex2D;
@@ -29,6 +37,14 @@ Texture3D<float2> Tex3DVec;
 RWTexture3D<float> RWTex3D;
 RWTexture3D<float2> RWTex3DVec;
 #else
+Texture1D<float2> Tex1DVec;
+Texture1D<float> Tex1D;
+RWTexture1D<float2> RWTex1DVec;
+RWTexture1D<float> RWTex1D;
+Texture1DArray<float2> Tex1DArrayVec;
+Texture1DArray<float> Tex1DArray;
+RWTexture1DArray<float2> RWTex1DArrayVec;
+RWTexture1DArray<float> RWTex1DArray;
 Texture2D<float2> Tex2DVec;
 Texture2D<float> Tex2D;
 RWTexture2D<float2> RWTex2DVec;
@@ -51,7 +67,17 @@ SamplerState Samp;
 
 // Use members of both the primary template and the partial specialization to
 // make sure both patterns really have been completed.
-export void useTextures(float2 UV, float3 UVW, float4 UVWA) {
+export void useTextures(float U, float2 UV, float3 UVW, float4 UVWA) {
+  float S1 = Tex1D.Sample(Samp, U);
+  float2 V1 = Tex1DVec.Sample(Samp, U);
+  RWTex1D[0] = S1;
+  RWTex1DVec[0] = V1;
+
+  float S1A = Tex1DArray.Sample(Samp, UV);
+  float2 V1A = Tex1DArrayVec.Sample(Samp, UV);
+  RWTex1DArray[uint2(0, 0)] = S1A;
+  RWTex1DArrayVec[uint2(0, 0)] = V1A;
+
   float S = Tex2D.Sample(Samp, UV);
   float2 V = Tex2DVec.Sample(Samp, UV);
   RWTex2D[uint2(0, 0)] = S;
diff --git a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
index e89d9b9331f65..d4783aec5616c 100644
--- a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
@@ -3,26 +3,42 @@
 // RUN:   -DTEXTURE=Texture2D -DINDEX_TYPE=int2 -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture3D -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
+// RUN:   -DTEXTURE=Texture1D -DINDEX_TYPE=int -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=Texture2DArray -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture1DArray -DINDEX_TYPE=int2 -DHAS_MIPS -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=RWTexture2D -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=RWTexture3D -verify %s
+// RUN:   -DTEXTURE=RWTexture1D -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=RWTexture2DArray -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=RWTexture1DArray -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=TextureCube -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=TextureCubeArray -verify %s
 
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture3D -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
+
+// RWTexture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=RWTexture3D -verify %s
+
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
diff --git a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
index 518079a22cea4..4f202e9698efc 100644
--- a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
@@ -1,27 +1,45 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DHAS_SAMPLE -DHAS_LOD \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_TYPE=float -DGRAD_TYPE=float \
+// RUN:   -DOFFSET_TYPE=int -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DHAS_SAMPLE -DHAS_LOD \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DGRAD_TYPE=float \
+// RUN:   -DOFFSET_TYPE=int -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2D \
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture3D \
-// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 -DOFFSET_TYPE=int3 -verify %s
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture1D \
+// RUN:   -DCOORD_TYPE=float -DGRAD_TYPE=float -DOFFSET_TYPE=int -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2DArray \
 // RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_SAMPLE_CMP -DHAS_GATHER -DHAS_LOD \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture1DArray \
+// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float -DOFFSET_TYPE=int -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_GATHER -DHAS_LOD \
 // RUN:   -DLOAD_ARG="int4(0, 0, 0, 0)" -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 -verify \
 // RUN:   %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_TEXEL -DHAS_SAMPLE -DHAS_LOD \
-// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 \
-// RUN:   -DGRAD_TYPE=float3 -verify %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_SAMPLE_CMP -DHAS_GATHER -DHAS_LOD \
+// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_GATHER -DHAS_LOD \
 // RUN:   -DLOAD_ARG="int4(0, 0, 0, 0)" -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -DOFFSET_TYPE=int3 \
 // RUN:   -verify %s
 
+// RWTexture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture3D \
+// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 -DOFFSET_TYPE=int3 -verify %s
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DHAS_SAMPLE -DHAS_LOD \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 \
+// RUN:   -DGRAD_TYPE=float3 -verify %s
+
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
@@ -35,12 +53,11 @@
 //                      dimension
 //   OFFSET_TYPE        offset type, one component per resource dimension
 //   HAS_SAMPLE         defined for types that have the Sample* methods
-//   HAS_SAMPLE_CMP     defined for types that have the comparison sampling
-//                      methods
 //   HAS_GATHER         defined for types that have the Gather* methods
 //   HAS_LOD            defined for types that have CalculateLevelOfDetail*
 //
-// Writable (UAV) textures have no sampling, gathering or LOD methods.
+// Writable (UAV) textures have no sampling, gathering or LOD methods, and
+// 1D textures have no gathering methods.
 
 TEXTURE<float4> Tex;
 SamplerState Samp;
@@ -59,9 +76,6 @@ void main(COORD_TYPE uv) {
   Tex.SampleBias(Samp, uv, 0.0f);
   // expected-error-re at +1 {{no member named 'SampleGrad' in 'hlsl::{{.*}}Texture}}
   Tex.SampleGrad(Samp, uv, (GRAD_TYPE)0, (GRAD_TYPE)0);
-#endif
-
-#ifndef HAS_SAMPLE_CMP
   // expected-error-re at +1 {{no member named 'SampleCmp' in 'hlsl::{{.*}}Texture}}
   Tex.SampleCmp(SampCmp, uv, compare);
   // expected-error-re at +1 {{no member named 'SampleCmpLevelZero' in 'hlsl::{{.*}}Texture}}

>From 2f20ecf84c32dae1e966cc298ed752c6b08a8246 Mon Sep 17 00:00:00 2001
From: Deric Cheung <cheung.deric at gmail.com>
Date: Wed, 9 Sep 2026 15:59:51 -0700
Subject: [PATCH 2/6] Assert that result ty vec and the Elts size are the same

---
 clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
index 1e1cb97b0d132..e49b1cba7b1dd 100644
--- a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
+++ b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
@@ -718,6 +718,8 @@ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::concat(V Vec, S Scalar,
     Elts.push_back(VecExpr);
   }
   Elts.push_back(ScalarExpr);
+  assert(ResultTy->castAs<VectorType>()->getNumElements() == Elts.size() &&
+         "The result type must have one element per concatenated value.");
 
   auto *InitList = new (AST) InitListExpr(
       AST, SourceLocation(), Elts, SourceLocation(), /*isExplicit=*/false);

>From 54607254946069666b26f58f12a1e059cc5eeceb Mon Sep 17 00:00:00 2001
From: Deric Cheung <cheung.deric at gmail.com>
Date: Wed, 9 Sep 2026 16:00:10 -0700
Subject: [PATCH 3/6] Reorganize RUN lines in tests. Remove unused macros

---
 clang/test/AST/HLSL/Textures-AST.hlsl         |  71 +++--
 clang/test/AST/HLSL/Textures-scalar-AST.hlsl  |  28 +-
 .../test/AST/HLSL/Textures-shorthand-AST.hlsl |  25 +-
 clang/test/AST/HLSL/Textures-vector-AST.hlsl  |  28 +-
 .../Textures-CalculateLevelOfDetail.hlsl      | 147 ++++------
 .../resources/Textures-Gather.hlsl            |  59 ++--
 .../CodeGenHLSL/resources/Textures-Load.hlsl  | 153 +++++------
 .../CodeGenHLSL/resources/Textures-Mips.hlsl  |  96 +++++--
 .../resources/Textures-Sample.hlsl            | 210 +++++++--------
 .../resources/Textures-SampleBias.hlsl        | 210 +++++++--------
 .../resources/Textures-SampleCmp.hlsl         | 185 ++++++-------
 .../Textures-SampleCmpLevelZero.hlsl          | 184 ++++++-------
 .../resources/Textures-SampleGrad.hlsl        | 196 +++++++-------
 .../resources/Textures-SampleLevel.hlsl       | 206 +++++++-------
 .../resources/Textures-Subscript.hlsl         | 252 +++++++-----------
 .../Textures-default-explicit-binding.hlsl    |  67 +++--
 .../resources/Textures-default.hlsl           | 136 ++++++----
 .../Textures-shorthand-contexts.hlsl          |  21 +-
 .../Textures-CalculateLevelOfDetail.hlsl      |   2 +-
 .../Resources/Textures-SampleBias.hlsl        |   3 +-
 .../Resources/Textures-SampleCmp.hlsl         |   4 +-
 .../Textures-SampleCmpLevelZero.hlsl          |   4 +-
 .../Resources/Textures-SampleGrad.hlsl        |   3 +-
 .../Resources/Textures-SampleLevel.hlsl       |   3 +-
 .../Resources/Textures-Subscript.hlsl         |  48 ++--
 .../Resources/Textures-mips-errors.hlsl       |  18 +-
 .../Textures-unsupported-methods-errors.hlsl  |  24 +-
 27 files changed, 1126 insertions(+), 1257 deletions(-)

diff --git a/clang/test/AST/HLSL/Textures-AST.hlsl b/clang/test/AST/HLSL/Textures-AST.hlsl
index 9196c584d0767..5a456170501cd 100644
--- a/clang/test/AST/HLSL/Textures-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-AST.hlsl
@@ -1,61 +1,75 @@
+// Texture1D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture1D -o - %s | FileCheck \
+// RUN:   %s --check-prefixes=CHECK,SRV -DTEXTURE=Texture1D -DDIM_NAME=1D \
+// RUN:   -DINDEX_TYPE="unsigned int" -DLOCATION_TYPE=int
+
+// Texture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture1DArray -o - %s | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,SRV,SRV-ARRAY \
+// RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DLOCATION_TYPE="vector<int, 2>"
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
 // RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=Texture2D -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SRV,GETDIM,GETDIM-SRV -DTEXTURE=Texture2D \
-// RUN:   -DINDEX_DIM=2 -DDIM_NAME=2D -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DDIM_NAME=2D -DINDEX_TYPE="vector<unsigned int, 2>" \
 // RUN:   -DLOCATION_TYPE="vector<int, 2>"
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture1D -o - %s | FileCheck \
-// RUN:   %s --check-prefixes=CHECK,SRV -DTEXTURE=Texture1D -DINDEX_DIM=1 \
-// RUN:   -DDIM_NAME=1D -DINDEX_TYPE="unsigned int" -DLOCATION_TYPE=int
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
 // RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=Texture2DArray -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SRV,SRV-ARRAY,GETDIM,GETDIM-SRV,GETDIM-SRV-ARRAY \
-// RUN:   -DTEXTURE=Texture2DArray -DINDEX_DIM=3 -DDIM_NAME=2D \
+// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DLOCATION_TYPE="vector<int, 3>"
+
+// RWTexture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture1DArray -o - %s | \
-// RUN:   FileCheck %s --check-prefixes=CHECK,SRV,SRV-ARRAY \
-// RUN:   -DTEXTURE=Texture1DArray -DINDEX_DIM=2 -DDIM_NAME=1D \
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture1D -DRW=1 -o - %s | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,UAV-STORE,UAV-TRUNC \
+// RUN:   -DTEXTURE=RWTexture1D -DDIM_NAME=1D -DINDEX_TYPE="unsigned int" \
+// RUN:   -DLOCATION_TYPE=int -DTRUNC_TYPE="uint':'unsigned int"
+
+// RWTexture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
+// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture1DArray -DRW=1 -o - \
+// RUN:   %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,UAV-ARRAY,UAV-STORE,UAV-TRUNC \
+// RUN:   -DTEXTURE=RWTexture1DArray -DDIM_NAME=1D \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
-// RUN:   -DLOCATION_TYPE="vector<int, 2>"
+// RUN:   -DLOCATION_TYPE="vector<int, 2>" -DTRUNC_TYPE="vector<uint, 2>"
+
+// RWTexture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
 // RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=RWTexture2D -DRW=1 -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,UAV,UAV-STORE,UAV-TRUNC,GETDIM,GETDIM-UAV \
-// RUN:   -DTEXTURE=RWTexture2D -DINDEX_DIM=2 -DDIM_NAME=2D \
+// RUN:   -DTEXTURE=RWTexture2D -DDIM_NAME=2D \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
 // RUN:   -DLOCATION_TYPE="vector<int, 2>" -DTRUNC_TYPE="vector<uint, 2>"
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture1D -DRW=1 -o - %s | \
-// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,UAV-STORE,UAV-TRUNC \
-// RUN:   -DTEXTURE=RWTexture1D -DINDEX_DIM=1 -DDIM_NAME=1D \
-// RUN:   -DINDEX_TYPE="unsigned int" -DLOCATION_TYPE=int \
-// RUN:   -DTRUNC_TYPE="uint':'unsigned int"
+
+// RWTexture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GETDIM \
 // RUN:   -DINDEX_ARG_TYPE=uint3 -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=RWTexture2DArray -DRW=1 -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,UAV,UAV-ARRAY,UAV-STORE,UAV-NOTRUNC,GETDIM,GETDIM-UAV,GETDIM-UAV-ARRAY \
-// RUN:   -DTEXTURE=RWTexture2DArray -DINDEX_DIM=3 -DDIM_NAME=2D \
+// RUN:   -DTEXTURE=RWTexture2DArray -DDIM_NAME=2D \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DLOCATION_TYPE="vector<int, 3>"
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=RWTexture1DArray -DRW=1 -o - \
-// RUN:   %s | FileCheck %s \
-// RUN:   --check-prefixes=CHECK,UAV,UAV-ARRAY,UAV-STORE,UAV-TRUNC \
-// RUN:   -DTEXTURE=RWTexture1DArray -DINDEX_DIM=2 -DDIM_NAME=1D \
-// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
-// RUN:   -DLOCATION_TYPE="vector<int, 2>" -DTRUNC_TYPE="vector<uint, 2>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -63,7 +77,6 @@
 //   INDEX_ARG_TYPE     the declared type of INDEX_ARG
 //   INDEX_ARG          a literal operator[] index
 //   TEXTURE            resource type name
-//   INDEX_DIM          operator[] index components
 //   INDEX_TYPE         operator[] index type
 //   LOCATION_TYPE      Load location type
 //   DIM_NAME           hlsl::dimension spelling
diff --git a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
index da9f410295fe0..69f7c731d0900 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -1,11 +1,12 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1D -DCOORD_TYPE=float \
 // RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc -DOFFSET_ARG="1" -o - %s | \
 // RUN:   FileCheck %s \
 // RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
-// RUN:   -DTEXTURE=Texture1D -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=1 -DLOAD_DIM=2 \
+// RUN:   -DTEXTURE=Texture1D -DDIM_NAME=1D -DLOAD_DIM=2 \
 // RUN:   -DINDEX_TYPE="unsigned int" -DIS_ARRAY="" -DLOCATION_TYPE=float \
 // RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
 
@@ -16,8 +17,8 @@
 // RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | \
 // RUN:   FileCheck %s \
 // RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
-// RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=2 \
-// RUN:   -DLOAD_DIM=3 -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DLOAD_DIM=3 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 2>" \
 // RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
 
@@ -28,7 +29,7 @@
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
-// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DLOAD_DIM=3 \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY="" \
 // RUN:   -DLOCATION_TYPE="vector<float, 2>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
@@ -41,8 +42,8 @@
 // RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck \
 // RUN:   %s \
 // RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
-// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
-// RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DLOAD_DIM=4 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 3>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
 
@@ -52,9 +53,8 @@
 // RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
 // RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s | FileCheck \
 // RUN:   %s --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
-// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY="" \
-// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DDIM_NAME=3D -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DIS_ARRAY="" -DLOCATION_TYPE="vector<float, 3>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // TextureCube
@@ -63,8 +63,7 @@
 // RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
 // RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCube \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 -DIS_ARRAY="" \
-// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DDIM_NAME=Cube -DIS_ARRAY="" -DLOCATION_TYPE="vector<float, 3>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // TextureCubeArray
@@ -73,8 +72,8 @@
 // RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
 // RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCubeArray \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 4>" \
+// RUN:   -DDIM_NAME=Cube -DIS_ARRAY=" [[hlsl::is_array]]" \
+// RUN:   -DLOCATION_TYPE="vector<float, 4>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
@@ -95,9 +94,6 @@
 //   LOD_LOCATION       expression producing a LOD_TYPE location from `loc`
 //   OFFSET_ARG         a literal offset argument
 //   DIM_NAME           hlsl::dimension spelling
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
-//   COORD_DIM          sample location components (DIM plus the array slice)
 //   LOAD_DIM           Load location components (COORD_DIM plus the mip level)
 //   INDEX_TYPE         operator[] index type
 //
diff --git a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
index e359d00c05d29..4250f8d7843d1 100644
--- a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
@@ -1,20 +1,20 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture1D -o \
 // RUN:   - %s | FileCheck %s -DTEXTURE=Texture1D
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=Texture1DArray -o - %s | FileCheck %s \
 // RUN:   -DTEXTURE=Texture1DArray
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D -o \
 // RUN:   - %s | FileCheck %s -DTEXTURE=Texture2D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
-// RUN:   -o - %s | FileCheck %s -DTEXTURE=TextureCube
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=TextureCubeArray -o - %s | FileCheck %s \
-// RUN:   -DTEXTURE=TextureCubeArray
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=Texture2DArray -o - %s | FileCheck %s \
@@ -26,6 +26,17 @@
 // RUN:   -o - %s \
 // RUN:   | FileCheck %s -DTEXTURE=Texture3D
 
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
+// RUN:   -o - %s | FileCheck %s -DTEXTURE=TextureCube
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=TextureCubeArray -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCubeArray
+
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
diff --git a/clang/test/AST/HLSL/Textures-vector-AST.hlsl b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
index 41f707ec8c182..80c75d640f3a6 100644
--- a/clang/test/AST/HLSL/Textures-vector-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
@@ -1,11 +1,12 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1D -DCOORD_TYPE=float \
 // RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc -DOFFSET_ARG="1" -o - %s | \
 // RUN:   FileCheck %s \
 // RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
-// RUN:   -DTEXTURE=Texture1D -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=1 -DLOAD_DIM=2 \
+// RUN:   -DTEXTURE=Texture1D -DDIM_NAME=1D -DLOAD_DIM=2 \
 // RUN:   -DINDEX_TYPE="unsigned int" -DIS_ARRAY="" -DLOCATION_TYPE=float \
 // RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
 
@@ -16,8 +17,8 @@
 // RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | \
 // RUN:   FileCheck %s \
 // RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
-// RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DDIM=1 -DCOORD_DIM=2 \
-// RUN:   -DLOAD_DIM=3 -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DLOAD_DIM=3 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 2>" \
 // RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int
 
@@ -28,7 +29,7 @@
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
-// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DLOAD_DIM=3 \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY="" \
 // RUN:   -DLOCATION_TYPE="vector<float, 2>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
@@ -41,8 +42,8 @@
 // RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck \
 // RUN:   %s \
 // RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
-// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
-// RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DLOAD_DIM=4 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 3>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>"
 
@@ -52,9 +53,8 @@
 // RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
 // RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s | FileCheck \
 // RUN:   %s --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
-// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY="" \
-// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DDIM_NAME=3D -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DIS_ARRAY="" -DLOCATION_TYPE="vector<float, 3>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // TextureCube
@@ -63,8 +63,7 @@
 // RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
 // RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCube \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 -DIS_ARRAY="" \
-// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DDIM_NAME=Cube -DIS_ARRAY="" -DLOCATION_TYPE="vector<float, 3>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // TextureCubeArray
@@ -73,8 +72,8 @@
 // RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
 // RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SAMPLECMP,GATHER -DTEXTURE=TextureCubeArray \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 4>" \
+// RUN:   -DDIM_NAME=Cube -DIS_ARRAY=" [[hlsl::is_array]]" \
+// RUN:   -DLOCATION_TYPE="vector<float, 4>" \
 // RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DOFFSET_TYPE="vector<int, 3>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
@@ -95,9 +94,6 @@
 //   LOD_LOCATION       expression producing a LOD_TYPE location from `loc`
 //   OFFSET_ARG         a literal offset argument
 //   DIM_NAME           hlsl::dimension spelling
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
-//   COORD_DIM          sample location components (DIM plus the array slice)
 //   LOAD_DIM           Load location components (COORD_DIM plus the mip level)
 //   INDEX_TYPE         operator[] index type
 //
diff --git a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
index 69a1363f56dc4..9d784aa953b75 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
@@ -1,118 +1,80 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
 // RUN:   -DTEXTURE=Texture1D %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   -DTEXTURE=Texture1D --check-prefixes=CHECK,DXIL -DDXIL_TY=1 -DRW=0 \
-// RUN:   -DDIM=1 -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
-// RUN:   -DTEXTURE=Texture1DArray %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,DXIL -DDXIL_TY=6 \
-// RUN:   -DRW=0 -DDIM=1 -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
-// RUN:   -DTEXTURE=Texture2D %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D --check-prefixes=CHECK,DXIL -DDXIL_TY=2 -DRW=0 \
-// RUN:   -DDIM=2 -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCube %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=TextureCube --check-prefixes=CHECK,DXIL -DDXIL_TY=5 -DRW=0 \
-// RUN:   -DDIM=3 -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCubeArray %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,DXIL -DDXIL_TY=9 \
-// RUN:   -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
 // RUN:   -DTEXTURE=Texture1D %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   -DTEXTURE=Texture1D --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float
+
+// Texture1DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
+// RUN:   -DTEXTURE=Texture1DArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,DXIL -DDXIL_TY=6 \
+// RUN:   -DRW=0 -DGRAD_LLVM=float -DGRAD_CXX=float
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
 // RUN:   -DTEXTURE=Texture1DArray %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float
+
+// Texture2D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
+// RUN:   -DTEXTURE=Texture2D %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D --check-prefixes=CHECK,DXIL -DDXIL_TY=2 -DRW=0 \
+// RUN:   -DGRAD_LLVM="<2 x float>" -DGRAD_CXX="float vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
 // RUN:   -DTEXTURE=Texture2D %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   -DTEXTURE=Texture2D --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCube %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=TextureCube --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=TextureCubeArray %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
-// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]"
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
 // RUN:   -DTEXTURE=Texture2DArray %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   -DTEXTURE=Texture2DArray --check-prefixes=CHECK,DXIL -DDXIL_TY=7 \
-// RUN:   -DRW=0 -DDIM=2 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DRW=0 -DGRAD_LLVM="<2 x float>" -DGRAD_CXX="float vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float2 \
 // RUN:   -DTEXTURE=Texture2DArray %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   -DTEXTURE=Texture2DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_CXX="float vector[2]"
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=TextureCube %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCube --check-prefixes=CHECK,DXIL -DDXIL_TY=5 -DRW=0 \
+// RUN:   -DGRAD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=TextureCube %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCube --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]"
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=TextureCubeArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,DXIL -DDXIL_TY=9 \
+// RUN:   -DRW=0 -DGRAD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=TextureCubeArray %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]"
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -138,11 +100,8 @@
 //   LOD_TYPE           CalculateLevelOfDetail location type
 //   TEXTURE            resource type name
 //   GRAD_CXX           ddx/ddy type in the C++ signature
-//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
 //   IMG_FMT            spirv.Image Image Format operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl
index 86da05951fb6f..2ddebfaf037dd 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl
@@ -1,3 +1,4 @@
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
@@ -6,18 +7,6 @@
 // RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
 // RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=5 -DRW=0 -DDIM=3
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=9 -DRW=0 -DDIM=3
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
@@ -27,20 +16,8 @@
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
 // RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=0 -DSAMPLED=1 \
-// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=1 -DSAMPLED=1 \
-// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
@@ -59,6 +36,36 @@
 // RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
 
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=5 -DRW=0 -DDIM=3
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=0 -DSAMPLED=1 \
+// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=9 -DRW=0 -DDIM=3
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=1 -DSAMPLED=1 \
+// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3
+
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
index 929cefa8f018e..604c446e124a8 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
@@ -5,9 +5,8 @@
 // RUN:   -DLOAD_ARG="int2(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SRV,SCALAR-COORD,WIDE-LOC,DXIL,DXIL-SRV \
 // RUN:   -DTEXTURE=Texture1D -D#LOAD_DIM=2 -DCOORD_DIM=1 -DDXIL_TY=1 -DRW=0 \
-// RUN:   -DENTRY_DIM=1 -DDIM=1 -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
-// RUN:   -DENTRY_CXX=int -DLOAD_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 \
+// RUN:   -DOFFSET_CONST=1 -DENTRY_CXX=int -DLOAD_LLVM="<2 x i32>" \
 // RUN:   -DLOAD_CXX="int vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
@@ -16,10 +15,9 @@
 // RUN:   --check-prefixes=CHECK,SRV,SCALAR-COORD,WIDE-LOC,SPIRV,SPIRV-SRV \
 // RUN:   -DTEXTURE=Texture1D -D#LOAD_DIM=2 -DCOORD_DIM=1 -DARRAYED=0 \
 // RUN:   -DSAMPLED=1 -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 \
-// RUN:   -DFORMAT24=0 -DFORMAT25=0 -DSPV_DIM=0 -DENTRY_DIM=1 -DDIM=1 \
-// RUN:   -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX=int \
-// RUN:   -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
+// RUN:   -DFORMAT24=0 -DFORMAT25=0 -DSPV_DIM=0 -DCOORD_LLVM=i32 \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
+// RUN:   -DENTRY_CXX=int -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
 
 // Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -28,11 +26,10 @@
 // RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,DXIL,DXIL-SRV \
 // RUN:   -DTEXTURE=Texture1DArray -D#LOAD_DIM=3 -DCOORD_DIM=2 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DDXIL_TY=6 -DRW=0 -DENTRY_DIM=2 \
-// RUN:   -DDIM=1 -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
-// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
-// RUN:   -DLOAD_CXX="int vector[3]"
+// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DDXIL_TY=6 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1DArray \
@@ -41,10 +38,11 @@
 // RUN:   -DTEXTURE=Texture1DArray -D#LOAD_DIM=3 -DCOORD_DIM=2 \
 // RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DARRAYED=1 -DSAMPLED=1 -DFORMAT1=0 \
 // RUN:   -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 -DFORMAT25=0 \
-// RUN:   -DSPV_DIM=0 -DENTRY_DIM=2 -DDIM=1 -DCOORD_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 \
-// RUN:   -DOFFSET_CONST=1 -DENTRY_CXX="int vector[2]" \
-// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
+// RUN:   -DSPV_DIM=0 -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[3]"
+
 // Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
@@ -52,8 +50,8 @@
 // RUN:   -DLOAD_ARG="int3(loc, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,DXIL,DXIL-SRV \
 // RUN:   -DTEXTURE=Texture2D -D#LOAD_DIM=3 -DCOORD_DIM=2 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DDXIL_TY=2 -DRW=0 -DENTRY_DIM=2 \
-// RUN:   -DDIM=2 -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DDXIL_TY=2 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
 // RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
 // RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
@@ -65,11 +63,10 @@
 // RUN:   -DTEXTURE=Texture2D -D#LOAD_DIM=3 -DCOORD_DIM=2 \
 // RUN:   -DCOORD_MASK="<i32 0, i32 1>" -DARRAYED=0 -DSAMPLED=1 -DFORMAT1=0 \
 // RUN:   -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 -DFORMAT25=0 \
-// RUN:   -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
-// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
-// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
-// RUN:   -DLOAD_CXX="int vector[3]"
+// RUN:   -DSPV_DIM=1 -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
 
 // Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -79,11 +76,10 @@
 // RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,DXIL,DXIL-SRV \
 // RUN:   -DTEXTURE=Texture2DArray -D#LOAD_DIM=4 -DCOORD_DIM=3 \
 // RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=7 -DRW=0 \
-// RUN:   -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
-// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
-// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<4 x i32>" \
-// RUN:   -DLOAD_CXX="int vector[4]"
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<4 x i32>" -DLOAD_CXX="int vector[4]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 1)" -DTEXTURE=Texture2DArray \
@@ -92,11 +88,11 @@
 // RUN:   -DTEXTURE=Texture2DArray -D#LOAD_DIM=4 -DCOORD_DIM=3 \
 // RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=1 -DSAMPLED=1 \
 // RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
-// RUN:   -DFORMAT25=0 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 \
-// RUN:   -DCOORD_LLVM="<3 x i32>" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
-// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
-// RUN:   -DLOAD_LLVM="<4 x i32>" -DLOAD_CXX="int vector[4]"
+// RUN:   -DFORMAT25=0 -DSPV_DIM=1 -DCOORD_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<4 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[4]"
 
 // RWTexture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -104,41 +100,17 @@
 // RUN:   -DTEXTURE=RWTexture1D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
 // RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,DXIL,DXIL-UAV \
 // RUN:   -DTEXTURE=RWTexture1D -D#LOAD_DIM=1 -DCOORD_DIM=1 -DDXIL_TY=1 -DRW=1 \
-// RUN:   -DENTRY_DIM=1 -DDIM=1 -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
-// RUN:   -DENTRY_CXX=int -DLOAD_LLVM=i32 -DLOAD_CXX=int
+// RUN:   -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 \
+// RUN:   -DOFFSET_CONST=1 -DENTRY_CXX=int -DLOAD_LLVM=i32 -DLOAD_CXX=int
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
 // RUN:   -DTEXTURE=RWTexture1D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
 // RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,SPIRV,SPIRV-UAV \
 // RUN:   -DTEXTURE=RWTexture1D -D#LOAD_DIM=1 -DCOORD_DIM=1 -DARRAYED=0 \
 // RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
-// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=0 -DENTRY_DIM=1 -DDIM=1 \
-// RUN:   -DCOORD_LLVM=i32 -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX=int -DLOAD_LLVM=i32 \
-// RUN:   -DLOAD_CXX=int
-// RWTexture2D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,DXIL,DXIL-UAV \
-// RUN:   -DTEXTURE=RWTexture2D -D#LOAD_DIM=2 -DCOORD_DIM=2 -DDXIL_TY=2 -DRW=1 \
-// RUN:   -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
-// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
-// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<2 x i32>" \
-// RUN:   -DLOAD_CXX="int vector[2]"
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,SPIRV,SPIRV-UAV \
-// RUN:   -DTEXTURE=RWTexture2D -D#LOAD_DIM=2 -DCOORD_DIM=2 -DARRAYED=0 \
-// RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
-// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 \
-// RUN:   -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
-// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
-// RUN:   -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=0 -DCOORD_LLVM=i32 \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
+// RUN:   -DENTRY_CXX=int -DLOAD_LLVM=i32 -DLOAD_CXX=int
 
 // RWTexture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -147,10 +119,9 @@
 // RUN:   llvm-cxxfilt | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
 // RUN:   -DTEXTURE=RWTexture1DArray -D#LOAD_DIM=2 -DCOORD_DIM=2 -DDXIL_TY=6 \
-// RUN:   -DRW=1 -DENTRY_DIM=1 -DDIM=1 -DCOORD_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 \
-// RUN:   -DOFFSET_CONST=1 -DENTRY_CXX=int -DLOAD_LLVM="<2 x i32>" \
-// RUN:   -DLOAD_CXX="int vector[2]"
+// RUN:   -DRW=1 -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX=int \
+// RUN:   -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
 // RUN:   -DTEXTURE=RWTexture1DArray -DLOAD_ARG="int2(loc, 0)" -o - %s | \
@@ -158,10 +129,32 @@
 // RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
 // RUN:   -DTEXTURE=RWTexture1DArray -D#LOAD_DIM=2 -DCOORD_DIM=2 -DARRAYED=1 \
 // RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
-// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=0 -DENTRY_DIM=1 -DDIM=1 \
-// RUN:   -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0 -DOFFSET_CONST=1 -DENTRY_CXX=int \
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=0 -DCOORD_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0 -DOFFSET_CONST=1 \
+// RUN:   -DENTRY_CXX=int -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
+
+// RWTexture2D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,DXIL,DXIL-UAV \
+// RUN:   -DTEXTURE=RWTexture2D -D#LOAD_DIM=2 -DCOORD_DIM=2 -DDXIL_TY=2 -DRW=1 \
+// RUN:   -DCOORD_LLVM="<2 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
 // RUN:   -DLOAD_LLVM="<2 x i32>" -DLOAD_CXX="int vector[2]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DTEXTURE=RWTexture2D -DLOAD_ARG="loc" -o - %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s --check-prefixes=CHECK,UAV,EXACT-LOC,SPIRV,SPIRV-UAV \
+// RUN:   -DTEXTURE=RWTexture2D -D#LOAD_DIM=2 -DCOORD_DIM=2 -DARRAYED=0 \
+// RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DCOORD_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<2 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[2]"
+
 // RWTexture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
@@ -169,11 +162,10 @@
 // RUN:   llvm-cxxfilt | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
 // RUN:   -DTEXTURE=RWTexture2DArray -D#LOAD_DIM=3 -DCOORD_DIM=3 -DDXIL_TY=7 \
-// RUN:   -DRW=1 -DENTRY_DIM=2 -DDIM=2 -DCOORD_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
-// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
-// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
-// RUN:   -DLOAD_CXX="int vector[3]"
+// RUN:   -DRW=1 -DCOORD_LLVM="<3 x i32>" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DTEXTURE=RWTexture2DArray -DLOAD_ARG="int3(loc, 0)" -o - %s | \
@@ -181,11 +173,11 @@
 // RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
 // RUN:   -DTEXTURE=RWTexture2DArray -D#LOAD_DIM=3 -DCOORD_DIM=3 -DARRAYED=1 \
 // RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
-// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2 \
-// RUN:   -DCOORD_LLVM="<3 x i32>" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer \
-// RUN:   -DOFFSET_CONST="splat (i32 1)" -DENTRY_CXX="int vector[2]" \
-// RUN:   -DLOAD_LLVM="<3 x i32>" -DLOAD_CXX="int vector[3]"
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=1 -DCOORD_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
+// RUN:   -DLOAD_CXX="int vector[3]"
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -257,9 +249,6 @@
 //   ENTRY_CXX          the entry point's coordinate type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   ENTRY_DIM          the entry point's own coordinate components
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
 //   SPV_DIM            spirv.Image Dim operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
index 70b1939116bf5..80b892f2a525b 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
@@ -1,33 +1,89 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
 // RUN:   -DTEXTURE=Texture1D -DCOORD_TYPE=float -DINDEX_TYPE=int -o - %s | \
 // RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,SCALAR-COORD \
-// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 -DLOAD_DIM=2 -DDXIL_TY=1 -DDIM=1 \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 -DLOAD_DIM=2 \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 1)' \
+// RUN:   -DMIPS_OFFSET='i32 4' \
 // RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
 // RUN:   -DINDEX_CXX=int -DOFFSET_LLVM=i32 -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-unknown-vulkan-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_TYPE=float -DINDEX_TYPE=int -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,SCALAR-COORD \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 -DLOAD_DIM=2 \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 0, 2, 0, 0, 1, 0)' \
+// RUN:   -DMIPS_OFFSET='i64 8' \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX=int -DOFFSET_LLVM=i32 -DOFFSET_ZERO=0
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
 // RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DINDEX_TYPE=int2 -o - \
 // RUN:   %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,COORD2,VEC-COORD -DTEXTURE=Texture1DArray \
-// RUN:   -DCOORD_DIM=2 -DLOAD_DIM=3 -DDXIL_TY=6 -DDIM=1 \
+// RUN:   -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 6)' \
+// RUN:   -DMIPS_OFFSET='i32 4' \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX="int vector[2]" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-unknown-vulkan-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DINDEX_TYPE=int2 -o - \
+// RUN:   %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,COORD2,VEC-COORD -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 0, 2, 1, 0, 1, 0)' \
+// RUN:   -DMIPS_OFFSET='i64 8' \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
 // RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX="int vector[2]" \
 // RUN:   -DOFFSET_LLVM=i32 -DOFFSET_ZERO=0
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
 // RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 -DINDEX_TYPE=int2 -o - %s | \
 // RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,COORD2,VEC-COORD \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 -DLOAD_DIM=3 -DDXIL_TY=2 -DDIM=2 \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 2)' \
+// RUN:   -DMIPS_OFFSET='i32 4' \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
 // RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX="int vector[2]" \
 // RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-unknown-vulkan-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 -DINDEX_TYPE=int2 -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,COORD2,VEC-COORD \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 1, 2, 0, 0, 1, 0)' \
+// RUN:   -DMIPS_OFFSET='i64 8' \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX="int vector[2]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
 // RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -DINDEX_TYPE=int3 -o - \
 // RUN:   %s | llvm-cxxfilt | FileCheck %s \
 // RUN:   --check-prefixes=CHECK,COORD3,VEC-COORD -DTEXTURE=Texture2DArray \
-// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=7 -DDIM=2 \
+// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 7)' \
+// RUN:   -DMIPS_OFFSET='i32 4' \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-unknown-vulkan-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -DINDEX_TYPE=int3 -o - \
+// RUN:   %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,COORD3,VEC-COORD -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 1, 2, 1, 0, 1, 0)' \
+// RUN:   -DMIPS_OFFSET='i64 8' \
 // RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
 // RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX="int vector[3]" \
 // RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_ZERO=zeroinitializer
@@ -55,9 +111,9 @@
 //   OFFSET_LLVM        offset type in the IR
 //   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   LOAD_DIM           Load location components (COORD_DIM plus the mip level)
-//   DXIL_TY            dx.Texture resource-kind operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
+//   HANDLE_TY          the resource handle type in the IR
+//   MIPS_OFFSET        the offset of the `mips` field in the texture, as the
+//                      index operand of a getelementptr
 //
 // Check prefixes:
 //   COORD2             the location is built from two coordinate components
@@ -72,22 +128,22 @@ TEXTURE<float4> t;
 // `mips` caches its own copy of the resource handle, so the initializer has to
 // write `__handle` into it as well. Leaving it uninitialized makes
 // `t.mips[N][...]` load from a poison handle.
-// CHECK: define linkonce_odr hidden void @hlsl::[[TEXTURE]]<float vector[4]>::__createFromImplicitBinding(
-// CHECK: %[[NEW_HANDLE:.*]] = call target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) @llvm.dx.resource.handlefromimplicitbinding
+// CHECK: define linkonce_odr hidden {{(spir_func )?}}void @hlsl::[[TEXTURE]]<float vector[4]>::__createFromImplicitBinding(
+// CHECK: %[[NEW_HANDLE:.*]] = call [[HANDLE_TY]] @llvm.{{dx|spv}}.resource.handlefromimplicitbinding
 // CHECK: %[[HANDLE_GEP:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]]", ptr %[[TMP:.*]], i32 0, i32 0
-// CHECK: store target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) %[[NEW_HANDLE]], ptr %[[HANDLE_GEP]]
+// CHECK: store [[HANDLE_TY]] %[[NEW_HANDLE]], ptr %[[HANDLE_GEP]]
 // CHECK: %[[HANDLE_GEP2:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]]", ptr %[[TMP]], i32 0, i32 0
-// CHECK: %[[HANDLE:.*]] = load target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]), ptr %[[HANDLE_GEP2]]
+// CHECK: %[[HANDLE:.*]] = load [[HANDLE_TY]], ptr %[[HANDLE_GEP2]]
 // CHECK: %[[MIPS_GEP:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]]", ptr %[[TMP]], i32 0, i32 1
 // CHECK: %[[MIPS_HANDLE_GEP:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_type", ptr %[[MIPS_GEP]], i32 0, i32 0
-// CHECK: store target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) %[[HANDLE]], ptr %[[MIPS_HANDLE_GEP]]
+// CHECK: store [[HANDLE_TY]] %[[HANDLE]], ptr %[[MIPS_HANDLE_GEP]]
 
 // CHECK: define internal {{.*}} <4 x float> @test_mips([[COORD_CXX]])([[COORD_LLVM]] {{.*}} %loc)
 // CHECK: entry:
 // CHECK: %[[LOC_ADDR:.*]] = alloca [[COORD_LLVM]]
 // CHECK: %[[REF_TMP:.*]] = alloca %"struct.hlsl::[[TEXTURE]]<>::mips_slice_type"
 // CHECK: store [[COORD_LLVM]] %loc, ptr %[[LOC_ADDR]]
-// CHECK: call void @hlsl::[[TEXTURE]]<float vector[4]>::mips_type::operator[](int) const(ptr {{.*}} %[[REF_TMP]], ptr {{.*}} getelementptr {{.*}} (i8, ptr @t, i32 4), i32 noundef 0)
+// CHECK: call {{(spir_func )?}}void @hlsl::[[TEXTURE]]<float vector[4]>::mips_type::operator[](int) const(ptr {{.*}} %[[REF_TMP]], ptr {{.*}} getelementptr {{.*}} (i8, ptr @t, [[MIPS_OFFSET]]), i32 noundef 0)
 // CHECK: %[[V0:.*]] = load [[COORD_LLVM]], ptr %[[LOC_ADDR]]
 // CHECK: %[[CONV:.*]] = fptosi [[COORD_LLVM]] %[[V0]] to [[INDEX_LLVM]]
 // CHECK: %[[CALL:.*]] = call {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::operator[]([[INDEX_CXX]]) const(ptr {{.*}} %[[REF_TMP]], [[INDEX_LLVM]] {{.*}} %[[CONV]])
@@ -98,7 +154,7 @@ float4 test_mips(COORD_TYPE loc : LOC) : SV_Target {
   return t.mips[0][(INDEX_TYPE)loc];
 }
 
-// CHECK: define linkonce_odr hidden void @hlsl::[[TEXTURE]]<float vector[4]>::mips_type::operator[](int) const(ptr  {{.*}} %agg.result, ptr {{.*}} %this, i32 {{.*}} %Level)
+// CHECK: define linkonce_odr hidden {{(spir_func )?}}void @hlsl::[[TEXTURE]]<float vector[4]>::mips_type::operator[](int) const(ptr  {{.*}} %agg.result, ptr {{.*}} %this, i32 {{.*}} %Level)
 // CHECK: entry:
 // CHECK: %{{.*}} = alloca ptr
 // CHECK: %[[THIS_ADDR:.*]] = alloca ptr
@@ -108,15 +164,15 @@ float4 test_mips(COORD_TYPE loc : LOC) : SV_Target {
 // CHECK: store ptr %this, ptr %[[THIS_ADDR]]
 // CHECK: store i32 %Level, ptr %[[LEVEL_ADDR]]
 // CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]]
-// CHECK: call void @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::mips_slice_type()(ptr {{.*}} %[[SLICE]])
+// CHECK: call {{(spir_func )?}}void @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::mips_slice_type()(ptr {{.*}} %[[SLICE]])
 // CHECK: %[[HANDLE_GEP:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_type", ptr %[[THIS1]], i32 0, i32 0
-// CHECK: %[[HANDLE:.*]] = load target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]), ptr %[[HANDLE_GEP]]
+// CHECK: %[[HANDLE:.*]] = load [[HANDLE_TY]], ptr %[[HANDLE_GEP]]
 // CHECK: %[[HANDLE_GEP2:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_slice_type", ptr %[[SLICE]], i32 0, i32 0
-// CHECK: store target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) %[[HANDLE]], ptr %[[HANDLE_GEP2]]
+// CHECK: store [[HANDLE_TY]] %[[HANDLE]], ptr %[[HANDLE_GEP2]]
 // CHECK: %[[L_VAL:.*]] = load i32, ptr %[[LEVEL_ADDR]]
 // CHECK: %[[LEVEL_GEP:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_slice_type", ptr %[[SLICE]], i32 0, i32 1
 // CHECK: store i32 %[[L_VAL]], ptr %[[LEVEL_GEP]]
-// CHECK: call void @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::mips_slice_type(hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type const&)(ptr noundef nonnull align 4 dereferenceable(8) %agg.result, ptr noundef nonnull align 4 dereferenceable(8) %[[SLICE]])
+// CHECK: call {{(spir_func )?}}void @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::mips_slice_type(hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type const&)(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %agg.result, ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[SLICE]])
 
 // CHECK: define linkonce_odr hidden {{.*}} <4 x float> @hlsl::[[TEXTURE]]<float vector[4]>::mips_slice_type::operator[]([[INDEX_CXX]]) const(ptr {{.*}} %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[COORD:.*]])
 // CHECK: entry:
@@ -127,7 +183,7 @@ float4 test_mips(COORD_TYPE loc : LOC) : SV_Target {
 // VEC-COORD: %[[COORD_PARAM:.*]] = load [[INDEX_LLVM]], ptr %[[COORD_ADDR]]
 // VEC-COORD: store [[INDEX_LLVM]] %[[COORD_PARAM]], ptr %[[VEC_TMP]]
 // CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"struct.hlsl::[[TEXTURE]]<>::mips_slice_type", ptr %[[THIS1]], i32 0, i32 0
-// CHECK: %[[HANDLE:.*]] = load target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
+// CHECK: %[[HANDLE:.*]] = load [[HANDLE_TY]], ptr %[[HANDLE_PTR]]
 // A 1D coordinate is a single value, so it goes straight into the location.
 // SCALAR-COORD: %[[COORD_VAL:.*]] = load i32, ptr %[[COORD_ADDR]]
 // SCALAR-COORD: %[[VECINIT3:.*]] = insertelement <[[LOAD_DIM]] x i32> poison, i32 %[[COORD_VAL]], i32 0
@@ -149,5 +205,5 @@ float4 test_mips(COORD_TYPE loc : LOC) : SV_Target {
 // SCALAR-COORD: %[[COORD_X:.*]] = extractelement <[[LOAD_DIM]] x i32> %[[VECINITL]], i64 0
 // VEC-COORD: %[[COORD_X:.*]] = shufflevector <[[LOAD_DIM]] x i32> %[[VECINITL]], <[[LOAD_DIM]] x i32> poison, [[INDEX_LLVM]] {{.*}}
 // CHECK: %[[LOD:.*]] = extractelement <[[LOAD_DIM]] x i32> %[[VECINITL]], i64 [[COORD_DIM]]
-// CHECK: %[[RES:.*]] = call {{.*}} <4 x float> @llvm.dx.resource.load.level.v4f32.tdx.Texture_v4f32_0_0_0_[[DXIL_TY]]t{{.*}}(target("dx.Texture", <4 x float>, 0, 0, 0, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[COORD_X]], i32 %[[LOD]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
+// CHECK: %[[RES:.*]] = call {{.*}} <4 x float> @llvm.{{dx|spv}}.resource.load.level.v4f32.{{[^(]*}}([[HANDLE_TY]] %[[HANDLE]], [[INDEX_LLVM]] %[[COORD_X]], i32 %[[LOD]], [[OFFSET_LLVM]] [[OFFSET_ZERO]])
 // CHECK: ret <4 x float> %[[RES]]
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
index 59e448efd1f68..48442a12b5da0 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
@@ -1,163 +1,141 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DDXIL_TY=1 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DOFFSET_LLVM=i32 \
 // RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
 // RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=2 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
-// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
-// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
-// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
-// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
-// Texture3D
+// RUN:   -DDXIL_TY=4 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=5 -DRW=0 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=9 -DRW=0 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -168,13 +146,9 @@
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
-//   COORD_DIM          sample location components (DIM plus the array slice)
-//   GRAD_CXX           ddx/ddy type in the C++ signature
 //   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   OFFSET_CONST       the offset literal as it appears in the IR
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
index 6889b4e9eb694..4456bb653ea43 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
@@ -1,163 +1,141 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DDXIL_TY=1 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DOFFSET_LLVM=i32 \
 // RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
 // RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=2 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
-// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
-// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
-// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
-// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
-// Texture3D
+// RUN:   -DDXIL_TY=4 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=5 -DRW=0 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=9 -DRW=0 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -168,13 +146,9 @@
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
-//   COORD_DIM          sample location components (DIM plus the array slice)
-//   GRAD_CXX           ddx/ddy type in the C++ signature
 //   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   OFFSET_CONST       the offset literal as it appears in the IR
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
index f4daf941f63f8..e533ee05171d4 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
@@ -1,141 +1,120 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DDXIL_TY=1 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DOFFSET_LLVM=i32 \
 // RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
 // RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=2 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
-// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
-// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
-// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
-// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=5 -DRW=0 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=9 -DRW=0 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
@@ -145,13 +124,9 @@
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
-//   COORD_DIM          sample location components (DIM plus the array slice)
-//   GRAD_CXX           ddx/ddy type in the C++ signature
 //   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   OFFSET_CONST       the offset literal as it appears in the IR
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
index 0b02ccefc8227..d58a2e8dfa966 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
@@ -1,137 +1,113 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
 // RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=1 \
-// RUN:   -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DOFFSET_LLVM=i32 \
 // RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=6 \
-// RUN:   -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
 // RUN:   -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=2 \
-// RUN:   -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL -DDXIL_TY=5 -DRW=0 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL -DDXIL_TY=9 -DRW=0 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
-// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=0 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 -DOFFSET_CONST="1" \
-// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
 // RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=1 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture2D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=0 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DTEXTURE=Texture2D \
+// RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=2 \
+// RUN:   -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 \
-// RUN:   -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 \
-// RUN:   -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2D \
+// RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,CHECK-OFFSET,DXIL-OFFSET -DDXIL_TY=7 \
-// RUN:   -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,SPIRV,CHECK-OFFSET,SPIRV-OFFSET -DARRAYED=1 \
-// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube --check-prefixes=CHECK,DXIL \
+// RUN:   -DDXIL_TY=5 -DRW=0 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube --check-prefixes=CHECK,SPIRV \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,DXIL \
+// RUN:   -DDXIL_TY=9 -DRW=0 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,SPIRV \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -142,13 +118,9 @@
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
-//   COORD_DIM          sample location components (DIM plus the array slice)
-//   GRAD_CXX           ddx/ddy type in the C++ signature
 //   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   OFFSET_CONST       the offset literal as it appears in the IR
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
index 82d01e36f40b1..8940baf921dc7 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
@@ -1,146 +1,133 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1D \
 // RUN:   -DCOORD_TYPE=float %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   -DTEXTURE=Texture1D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   -DDXIL_TY=1 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DGRAD_LLVM=float -DGRAD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1D \
+// RUN:   -DCOORD_TYPE=float %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DGRAD_LLVM=float \
+// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1DArray \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture1DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DGRAD_LLVM=float -DGRAD_CXX=float \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1DArray \
+// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
 // RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   FileCheck %s -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=2 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DGRAD_LLVM="<2 x float>" -DGRAD_CXX="float vector[2]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2D \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DGRAD_LLVM="<2 x float>" \
 // RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=5 -DRW=0 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
-// RUN:   | llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCubeArray \
-// RUN:   -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
-// RUN:   -DDXIL_TY=9 -DRW=0 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1D \
-// RUN:   -DCOORD_TYPE=float %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
-// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
-// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
-// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1DArray \
-// RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2DArray \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DGRAD_LLVM="<2 x float>" -DGRAD_CXX="float vector[2]" \
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DGRAD_LLVM="<2 x float>" \
 // RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=5 -DRW=0 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCube \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
 // RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
+// RUN:   | llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL,CHECK-NOOFFSET,DXIL-NOOFFSET \
+// RUN:   -DDXIL_TY=9 -DRW=0 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DGRAD_LLVM="<3 x float>" \
 // RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DGRAD_TYPE=float3 -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s \
 // RUN:   | llvm-cxxfilt | FileCheck %s -DTEXTURE=TextureCubeArray \
-// RUN:   -DCOORD_DIM=4 \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL,CHECK-NOOFFSET,SPIRV-NOOFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 \
 // RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
-// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -DGRAD_TYPE=float2 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DGRAD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -176,13 +163,10 @@
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
-//   COORD_DIM          sample location components (DIM plus the array slice)
 //   GRAD_CXX           ddx/ddy type in the C++ signature
 //   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   OFFSET_CONST       the offset literal as it appears in the IR
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
index 9bb4d20dd3799..19a70a4047d64 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
@@ -1,161 +1,139 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=1 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
+// RUN:   -DDXIL_TY=1 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM=float \
+// RUN:   -DCOORD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DOFFSET_LLVM=i32 \
 // RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=6 -DRW=0 -DDIM=1 -DOFFSET_CONST="1" \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
+// RUN:   -DDXIL_TY=6 -DRW=0 -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
 // RUN:   -DOFFSET_ZERO=0
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
+// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DOFFSET_CONST="1" \
+// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
+// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=2 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=5 -DRW=0 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=9 -DRW=0 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
-// RUN:   -DINDEX_LLVM="<4 x i32>" -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM=float -DCOORD_CXX=float \
-// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int" \
-// RUN:   -DINDEX_CXX_I=int -DGRAD_LLVM=float -DGRAD_CXX=float \
-// RUN:   -DOFFSET_LLVM=i32 -DOFFSET_CXX=int -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
-// RUN:   -DHAS_OFFSET -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 %s | \
-// RUN:   llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1DArray -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=0 -DDIM=1 \
-// RUN:   -DOFFSET_CONST="1" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DCOORD_DIM=2 \
+// RUN:   -DTEXTURE=Texture2D \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=0 -DSAMPLED=1 \
-// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=1 -DSAMPLED=1 \
-// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DDIM=3 -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=7 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>" \
+// RUN:   -DDXIL_TY=7 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2>" \
 // RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DOFFSET_LLVM="<2 x i32>" -DOFFSET_CXX="int vector[2]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 \
+// RUN:   -DTEXTURE=Texture2DArray \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2 \
+// RUN:   -DARRAYED=1 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 \
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>" -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D \
 // RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
-// Texture3D
+// RUN:   -DDXIL_TY=4 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   -DCOORD_TYPE=float3 %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D \
 // RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=5 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=0 -DSAMPLED=1 \
+// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+
+// TextureCubeArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-NOTEXEL -DDXIL_TY=9 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<4 x float>" -DCOORD_CXX="float vector[4]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-NOTEXEL -DARRAYED=1 -DSAMPLED=1 \
+// RUN:   -DIMG_FMT=0 -DSPV_DIM=3 -DCOORD_LLVM="<4 x float>" \
+// RUN:   -DCOORD_CXX="float vector[4]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -166,13 +144,9 @@
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
-//   COORD_DIM          sample location components (DIM plus the array slice)
-//   GRAD_CXX           ddx/ddy type in the C++ signature
 //   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
-//   DIM                number of resource dimensions (offset, ddx/ddy, LOD
-//                      location)
 //   OFFSET_CONST       the offset literal as it appears in the IR
 //   ARRAYED            spirv.Image Arrayed operand
 //   SAMPLED            spirv.Image Sampled operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
index 53eba7cdf9641..c1bf4267e49bc 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
@@ -1,208 +1,153 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
 // RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
-// RUN:   -DCOORD_DIM=1 --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 -DRW=0 -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 -DRW=0 -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
+// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=0 \
+// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int"
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1DArray \
 // RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 --check-prefixes=CHECK,DXIL \
+// RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,DXIL \
 // RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=6 -DRW=0 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
-// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_DIM=2 --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DRW=0 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
-// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
-// RUN:   -DCOORD_DIM=1 --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 \
-// RUN:   -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=0 \
-// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1DArray \
 // RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1DArray -DCOORD_DIM=2 --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=1 -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 \
-// RUN:   -DFMT_INT3=0 -DSPV_DIM=0 -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
+// RUN:   -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 \
+// RUN:   -DSPV_DIM=0 -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]"
+
+// Texture2D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture2D \
+// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DRW=0 -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
 // RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_DIM=2 --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 \
-// RUN:   -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=1 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
+// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=1 \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 --check-prefixes=CHECK,DXIL \
+// RUN:   -DTEXTURE=Texture2DArray --check-prefixes=CHECK,DXIL \
 // RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 -DRW=0 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_DIM=3 --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=1 -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 \
-// RUN:   -DFMT_INT3=0 -DSPV_DIM=1 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DTEXTURE=Texture2DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
+// RUN:   -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 \
+// RUN:   -DSPV_DIM=1 -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]"
+
+// Texture2DMS
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DMS \
 // RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DMS -DCOORD_DIM=2 --check-prefixes=CHECK,DXIL \
-// RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.MSTexture -DDXIL_TY=3 -DRW=0 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DTEXTURE=Texture2DMS --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.MSTexture -DDXIL_TY=3 -DRW=0 \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DMS \
 // RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2DMS -DCOORD_DIM=2 --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=0 -DMS=1 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 \
-// RUN:   -DFMT_INT3=0 -DSPV_DIM=1 -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
-// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture2D -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DTEXTURE=Texture2DMS --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
+// RUN:   -DMS=1 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 \
+// RUN:   -DSPV_DIM=1 -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]"
+
+// RWTexture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1D \
 // RUN:   -DCOORD_TYPE=uint -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
-// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture2D -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=0 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=1 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DTEXTURE=RWTexture1D --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 \
+// RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 \
+// RUN:   -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1D \
 // RUN:   -DCOORD_TYPE=uint -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture1D -DCOORD_DIM=1 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=0 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=0 \
-// RUN:   -DCOORD_LLVM=float -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   -DTEXTURE=RWTexture1D --check-prefixes=CHECK,CHECK-STORE,SPIRV \
+// RUN:   -DARRAYED=0 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=0 -DINDEX_LLVM=i32 \
+// RUN:   -DINDEX_CXX_U="unsigned int"
+
+// RWTexture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
-// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1DArray \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture1DArray --check-prefixes=CHECK,CHECK-STORE,DXIL \
+// RUN:   -DRW=1 -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=6 \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1DArray \
 // RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture1DArray -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=6 -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   -DTEXTURE=RWTexture1DArray --check-prefixes=CHECK,CHECK-STORE,SPIRV \
+// RUN:   -DARRAYED=1 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=0 -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]"
+
+// RWTexture2D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture2D --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 \
+// RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 \
+// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
+// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture2D --check-prefixes=CHECK,CHECK-STORE,SPIRV \
+// RUN:   -DARRAYED=0 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=1 -DINDEX_LLVM="<2 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[2]"
+
+// RWTexture2DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
 // RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=1 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=1 \
-// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
-// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DTEXTURE=RWTexture2DArray --check-prefixes=CHECK,CHECK-STORE,DXIL \
+// RUN:   -DRW=1 -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1DArray \
-// RUN:   -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
-// RUN:   -DTEXTURE=RWTexture1DArray -DCOORD_DIM=2 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=1 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=0 \
-// RUN:   -DCOORD_LLVM="<2 x float>" -DCOORD_CXX="float vector[2]" \
-// RUN:   -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
+// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture2DArray --check-prefixes=CHECK,CHECK-STORE,SPIRV \
+// RUN:   -DARRAYED=1 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=1 -DINDEX_LLVM="<3 x i32>" \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]"
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -258,12 +203,9 @@
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
-//   COORD_DIM          sample location components (DIM plus the array slice)
 //   ROV_OR_COUNT       the overloaded second dx handle operand: IsROV for
 //                      dx.Texture, the sample count for dx.MSTexture
 //   DXIL_HANDLE        DXIL resource handle type (dx.Texture or dx.MSTexture)
-//   GRAD_CXX           ddx/ddy type in the C++ signature
-//   COORD_CXX          sample location type in the C++ signature
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   ARRAYED            spirv.Image Arrayed operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl b/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
index b2cd56e0a8959..331d814c170b9 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
@@ -1,63 +1,72 @@
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 -DDXIL_TY=2 -DRW=0 \
 // RUN:   --check-prefixes=CHECK,CHECK-TEXEL
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_TYPE=float3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
-// RUN:   -DCOORD_TYPE=float3 -o - %s \
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 -DDXIL_TY=5 \
-// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-NOTEXEL
+// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 -DARRAYED=0 \
+// RUN:   --check-prefixes=SPIRV,SPIRV-TEXEL -DSPV_DIM=1
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -o - %s \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 -DDXIL_TY=9 \
-// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-NOTEXEL
+// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 -DDXIL_TY=7 \
+// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-TEXEL
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 -o - %s \
+// RUN:   -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 -DARRAYED=0 \
+// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 -DARRAYED=1 \
 // RUN:   --check-prefixes=SPIRV,SPIRV-TEXEL -DSPV_DIM=1
+
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture3D \
 // RUN:   -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 -DARRAYED=0 \
 // RUN:   --check-prefixes=SPIRV,SPIRV-TEXEL -DSPV_DIM=2
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+
+// TextureCube
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
 // RUN:   -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 -DARRAYED=0 \
-// RUN:   --check-prefixes=SPIRV,SPIRV-NOTEXEL -DSPV_DIM=3
+// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 -DDXIL_TY=5 \
+// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-NOTEXEL
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -o - %s \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
+// RUN:   -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 -DARRAYED=1 \
+// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 -DARRAYED=0 \
 // RUN:   --check-prefixes=SPIRV,SPIRV-NOTEXEL -DSPV_DIM=3
+
+// TextureCubeArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -o - %s \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 -DDXIL_TY=7 \
-// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-TEXEL
+// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 -DDXIL_TY=9 \
+// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-NOTEXEL
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -o - %s \
+// RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -o - %s \
 // RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 -DARRAYED=1 \
-// RUN:   --check-prefixes=SPIRV,SPIRV-TEXEL -DSPV_DIM=1
+// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 -DARRAYED=1 \
+// RUN:   --check-prefixes=SPIRV,SPIRV-NOTEXEL -DSPV_DIM=3
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
diff --git a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
index e2a43bcdc0a1a..4e205f9d7de7e 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
@@ -1,62 +1,89 @@
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
 // RUN:   -finclude-default-header -DTEXTURE=Texture1D -o - %s | FileCheck %s \
-// RUN:   -DTEXTURE=Texture1D -DDXIL_TY=1 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM=float \
-// RUN:   -DCOORD_CXX=float -DINDEX_LLVM=i32 \
-// RUN:   -DINDEX_CXX_U="unsigned int" -DINDEX_CXX_I=int \
-// RUN:   -DGRAD_LLVM=float -DGRAD_CXX=float -DOFFSET_LLVM=i32 \
-// RUN:   -DOFFSET_CXX=int -DOFFSET_ZERO=0
+// RUN:   -DTEXTURE=Texture1D --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 1)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("dx.Texture", float, 0, 0, 0, 1)'
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -std=hlsl202x \
+// RUN:   -emit-llvm -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture1D -o - %s | FileCheck %s -DTEXTURE=Texture1D \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 0, 2, 0, 0, 1, 0)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 0, 2, 0, 0, 1, 0)'
+
+// Texture1DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
 // RUN:   -finclude-default-header -DTEXTURE=Texture1DArray -o - %s | \
-// RUN:   FileCheck %s -DTEXTURE=Texture1DArray -DDXIL_TY=6 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM=float \
-// RUN:   -DGRAD_CXX=float -DOFFSET_LLVM=i32 -DOFFSET_CXX=int \
-// RUN:   -DOFFSET_ZERO=0
+// RUN:   FileCheck %s -DTEXTURE=Texture1DArray \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 6)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("dx.Texture", float, 0, 0, 0, 6)'
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -std=hlsl202x \
+// RUN:   -emit-llvm -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture1DArray -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=Texture1DArray --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 0, 2, 1, 0, 1, 0)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 0, 2, 1, 0, 1, 0)'
+
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
 // RUN:   -finclude-default-header -DTEXTURE=Texture2D -o - %s | FileCheck %s \
-// RUN:   -DTEXTURE=Texture2D -DDXIL_TY=2 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM="<2 x float>" \
-// RUN:   -DCOORD_CXX="float vector[2]" -DINDEX_LLVM="<2 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[2]" \
-// RUN:   -DINDEX_CXX_I="int vector[2]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DTEXTURE=Texture2D --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 2)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("dx.Texture", float, 0, 0, 0, 2)'
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -std=hlsl202x \
+// RUN:   -emit-llvm -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture2D -o - %s | FileCheck %s -DTEXTURE=Texture2D \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 1, 2, 0, 0, 1, 0)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 1, 2, 0, 0, 1, 0)'
+
+// Texture2DArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=TextureCube -o - %s | FileCheck \
-// RUN:   %s -DTEXTURE=TextureCube -DDXIL_TY=5 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -finclude-default-header -DTEXTURE=Texture2DArray -o - %s | \
+// RUN:   FileCheck %s -DTEXTURE=Texture2DArray \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 7)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("dx.Texture", float, 0, 0, 0, 7)'
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -std=hlsl202x \
+// RUN:   -emit-llvm -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture2DArray -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=Texture2DArray --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 1, 2, 1, 0, 1, 0)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 1, 2, 1, 0, 1, 0)'
+
+// TextureCube
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=TextureCubeArray -o - %s | \
-// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray -DDXIL_TY=9 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL -DCOORD_LLVM="<4 x float>" \
-// RUN:   -DCOORD_CXX="float vector[4]" -DINDEX_LLVM="<4 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[4]" \
-// RUN:   -DINDEX_CXX_I="int vector[4]" -DGRAD_LLVM="<3 x float>" \
-// RUN:   -DGRAD_CXX="float vector[3]" -DOFFSET_LLVM="<3 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -finclude-default-header -DTEXTURE=TextureCube -o - %s | FileCheck \
+// RUN:   %s -DTEXTURE=TextureCube --check-prefixes=CHECK,CHECK-NOTEXEL \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 5)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("dx.Texture", float, 0, 0, 0, 5)'
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -std=hlsl202x \
+// RUN:   -emit-llvm -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=TextureCube -o - %s | FileCheck %s -DTEXTURE=TextureCube \
+// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 3, 2, 0, 0, 1, 0)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 3, 2, 0, 0, 1, 0)'
+
+// TextureCubeArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=Texture2DArray -o - %s | \
-// RUN:   FileCheck %s -DTEXTURE=Texture2DArray -DDXIL_TY=7 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL -DCOORD_LLVM="<3 x float>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DINDEX_LLVM="<3 x i32>" \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" \
-// RUN:   -DINDEX_CXX_I="int vector[3]" -DGRAD_LLVM="<2 x float>" \
-// RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
-// RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -finclude-default-header -DTEXTURE=TextureCubeArray -o - %s | \
+// RUN:   FileCheck %s -DTEXTURE=TextureCubeArray \
+// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 9)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("dx.Texture", float, 0, 0, 0, 9)'
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -std=hlsl202x \
+// RUN:   -emit-llvm -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=TextureCubeArray -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=TextureCubeArray --check-prefixes=CHECK,CHECK-NOTEXEL \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 3, 2, 1, 0, 1, 0)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 3, 2, 1, 0, 1, 0)'
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
@@ -69,10 +96,9 @@
 // of another dimension only requires new RUN lines.
 //
 //   TEXTURE            resource type name
-//   GRAD_CXX           ddx/ddy type in the C++ signature
-//   COORD_CXX          sample location type in the C++ signature
-//   DXIL_TY            dx.Texture resource-kind operand
-//   RW                 dx.Texture UAV operand
+//   HANDLE_TY          the resource handle type of the float4 texture in the
+//                      IR
+//   SCALAR_HANDLE_TY   the resource handle type of the float texture in the IR
 //
 // Check prefixes:
 //   TEXEL              the type has integer texel addressing (Load,
@@ -80,18 +106,18 @@
 //                      layout
 //   NOTEXEL            the type has no integer texel addressing
 
-// CHECK-TEXEL: %"class.hlsl::[[TEXTURE]]" = type { target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]), %"struct.hlsl::[[TEXTURE]]<>::mips_type" }
-// CHECK-NOTEXEL: %"class.hlsl::[[TEXTURE]]" = type { target("dx.Texture", <4 x float>, [[RW]], 0, 0, [[DXIL_TY]]) }
-// CHECK-TEXEL: %"class.hlsl::[[TEXTURE]].0" = type { target("dx.Texture", float, [[RW]], 0, 0, [[DXIL_TY]]), %"struct.hlsl::[[TEXTURE]]<float>::mips_type" }
-// CHECK-NOTEXEL: %"class.hlsl::[[TEXTURE]].0" = type { target("dx.Texture", float, [[RW]], 0, 0, [[DXIL_TY]]) }
+// CHECK-TEXEL: %"class.hlsl::[[TEXTURE]]" = type { [[HANDLE_TY]], %"struct.hlsl::[[TEXTURE]]<>::mips_type" }
+// CHECK-NOTEXEL: %"class.hlsl::[[TEXTURE]]" = type { [[HANDLE_TY]] }
+// CHECK-TEXEL: %"class.hlsl::[[TEXTURE]].0" = type { [[SCALAR_HANDLE_TY]], %"struct.hlsl::[[TEXTURE]]<float>::mips_type" }
+// CHECK-NOTEXEL: %"class.hlsl::[[TEXTURE]].0" = type { [[SCALAR_HANDLE_TY]] }
 
-// CHECK: @{{.*}}t1 = internal global %"class.hlsl::[[TEXTURE]]" poison, align 4
+// CHECK: @{{.*}}t1 = internal global %"class.hlsl::[[TEXTURE]]" poison, align {{[0-9]+}}
 TEXTURE<> t1;
 
-// CHECK: @{{.*}}t2 = internal global %"class.hlsl::[[TEXTURE]].0" poison, align 4
+// CHECK: @{{.*}}t2 = internal global %"class.hlsl::[[TEXTURE]].0" poison, align {{[0-9]+}}
 TEXTURE<float> t2;
 
-// CHECK: @{{.*}}t3 = internal global %"class.hlsl::[[TEXTURE]]" poison, align 4
+// CHECK: @{{.*}}t3 = internal global %"class.hlsl::[[TEXTURE]]" poison, align {{[0-9]+}}
 TEXTURE t3;
 
 void main() {
diff --git a/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl b/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
index 0210feff458e7..99ec66f6254f0 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
@@ -1,33 +1,42 @@
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
 // RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 -DDXIL_TY=2 -DRW=0 \
 // RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+
+// Texture2DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 -DDXIL_TY=7 \
+// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-TEXEL
+
+// Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
 // RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=0 \
 // RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+
+// TextureCube
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
 // RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 -DDXIL_TY=5 \
 // RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-NOTEXEL
+
+// TextureCubeArray
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
 // RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DCOORD_DIM=4 -DDXIL_TY=9 \
 // RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-NOTEXEL
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
-// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DCOORD_DIM=3 -DDXIL_TY=7 \
-// RUN:   -DRW=0 --check-prefixes=CHECK,CHECK-TEXEL
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
diff --git a/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
index 8ce078b40b390..ac91fb789dd8d 100644
--- a/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
@@ -27,11 +27,11 @@
 //   LOD_TYPE           CalculateLevelOfDetail location type
 //
 // Check prefixes:
+//   dim1               diagnostics naming a scalar offset or location
 //   dim2               diagnostics naming a 2-component offset or location
 //                      vector
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
-//   dim1               diagnostics naming a scalar offset or location
 
 TEXTURE<float4> tex;
 SamplerState samp;
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
index 7a9f2bf34dca4..ca24ff804a739 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
@@ -39,9 +39,10 @@
 //
 // Check prefixes:
 //   offset             diagnostics for types that have offset overloads
+//   nooffset           diagnostics for types that have no offset overloads
+//   dim1               diagnostics naming a scalar offset or location
 //   dim2               diagnostics naming a 2-component offset or location
 //                      vector
-//   nooffset           diagnostics for types that have no offset overloads
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl
index e97db852e8df1..d7509b583285d 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl
@@ -35,10 +35,10 @@
 //
 // Check prefixes:
 //   offset             diagnostics for types that have offset overloads
-//   dim2               diagnostics naming a 2-component offset or location
-//                      vector
 //   nooffset           diagnostics for types that have no offset overloads
 //   dim1               diagnostics naming a scalar offset or location
+//   dim2               diagnostics naming a 2-component offset or location
+//                      vector
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl
index e30c2d47560d3..78709ff47809e 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl
@@ -35,10 +35,10 @@
 //
 // Check prefixes:
 //   offset             diagnostics for types that have offset overloads
-//   dim2               diagnostics naming a 2-component offset or location
-//                      vector
 //   nooffset           diagnostics for types that have no offset overloads
 //   dim1               diagnostics naming a scalar offset or location
+//   dim2               diagnostics naming a 2-component offset or location
+//                      vector
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
index f9a01ffaf5049..f4accded102d9 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
@@ -41,9 +41,10 @@
 //
 // Check prefixes:
 //   offset             diagnostics for types that have offset overloads
+//   nooffset           diagnostics for types that have no offset overloads
+//   dim1               diagnostics naming a scalar offset or location
 //   dim2               diagnostics naming a 2-component offset or location
 //                      vector
-//   nooffset           diagnostics for types that have no offset overloads
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
index 151035639f7c9..2b95584c58b60 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
@@ -39,9 +39,10 @@
 //
 // Check prefixes:
 //   offset             diagnostics for types that have offset overloads
+//   nooffset           diagnostics for types that have no offset overloads
+//   dim1               diagnostics naming a scalar offset or location
 //   dim2               diagnostics naming a 2-component offset or location
 //                      vector
-//   nooffset           diagnostics for types that have no offset overloads
 //   dim3               diagnostics naming a 3-component offset or location
 //                      vector
 //
diff --git a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
index ab666a914d899..c0ee382b6dd56 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
@@ -1,56 +1,56 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=Texture2D -DINDEX_TYPE=uint2 \
-// RUN:   -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
-// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=Texture1D -DINDEX_TYPE=uint \
 // RUN:   -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 -DWIDE_INDEX_ARG="int2(1, 2)" \
 // RUN:   -verify=expected,scalaridx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=Texture2DArray -DINDEX_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
-// RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
-// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify=expected,vecidx -o - %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=Texture1DArray -DINDEX_TYPE=uint2 \
 // RUN:   -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
 // RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=RWTexture2D -DHAS_STORE \
-// RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
+// RUN:   -finclude-default-header -DTEXTURE=Texture2D -DINDEX_TYPE=uint2 \
+// RUN:   -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
 // RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=Texture2DArray -DINDEX_TYPE=uint3 \
+// RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
+// RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
+// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture1D -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 \
+// RUN:   -DWIDE_INDEX_ARG="int2(1, 2)" -verify=expected,scalaridx -o - %s
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture1D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 \
 // RUN:   -DWIDE_INDEX_ARG="int2(1, 2)" -verify=expected,scalaridx -o - %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=RWTexture2DArray -DHAS_STORE \
-// RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
-// RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
-// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
-// RUN:   -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture1DArray -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
 // RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture1DArray -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
 // RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=RWTexture1D -DHAS_STORE \
-// RUN:   -DINDEX_TYPE=uint -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 \
-// RUN:   -DWIDE_INDEX_ARG="int2(1, 2)" -verify=expected,scalaridx -o - %s
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture2D -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
+// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2DArray -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
 // RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
 // RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
 // RUN:   -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=RWTexture1DArray -DHAS_STORE \
-// RUN:   -DINDEX_TYPE=uint2 -DINDEX_ARG="uint2(1, 2)" -DWIDE_INDEX_TYPE=int3 \
-// RUN:   -DWIDE_INDEX_ARG="int3(1, 2, 3)" -verify=expected,vecidx -o - %s
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture2DArray -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
+// RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
+// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
+// RUN:   -verify=expected,vecidx -o - %s
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
diff --git a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
index d4783aec5616c..daca84b3802e8 100644
--- a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
@@ -1,33 +1,33 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture2D -DINDEX_TYPE=int2 -DHAS_MIPS -verify %s
+// RUN:   -DTEXTURE=Texture1D -DINDEX_TYPE=int -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture1D -DINDEX_TYPE=int -DHAS_MIPS -verify %s
+// RUN:   -DTEXTURE=Texture1DArray -DINDEX_TYPE=int2 -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture2DArray -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
+// RUN:   -DTEXTURE=Texture2D -DINDEX_TYPE=int2 -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture1DArray -DINDEX_TYPE=int2 -DHAS_MIPS -verify %s
+// RUN:   -DTEXTURE=Texture2DArray -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=RWTexture2D -verify %s
+// RUN:   -DTEXTURE=TextureCube -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=RWTexture1D -verify %s
+// RUN:   -DTEXTURE=TextureCubeArray -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=RWTexture2DArray -verify %s
+// RUN:   -DTEXTURE=RWTexture1D -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=RWTexture1DArray -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=TextureCube -verify %s
+// RUN:   -DTEXTURE=RWTexture2D -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=TextureCubeArray -verify %s
+// RUN:   -DTEXTURE=RWTexture2DArray -verify %s
 
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
diff --git a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
index 4f202e9698efc..2c0247931d3d8 100644
--- a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
@@ -7,18 +7,6 @@
 // RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DGRAD_TYPE=float \
 // RUN:   -DOFFSET_TYPE=int -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2D \
-// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture1D \
-// RUN:   -DCOORD_TYPE=float -DGRAD_TYPE=float -DOFFSET_TYPE=int -verify %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2DArray \
-// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture1DArray \
-// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float -DOFFSET_TYPE=int -verify %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_GATHER -DHAS_LOD \
 // RUN:   -DLOAD_ARG="int4(0, 0, 0, 0)" -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 -verify \
@@ -28,6 +16,18 @@
 // RUN:   -DLOAD_ARG="int4(0, 0, 0, 0)" -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -DOFFSET_TYPE=int3 \
 // RUN:   -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture1D \
+// RUN:   -DCOORD_TYPE=float -DGRAD_TYPE=float -DOFFSET_TYPE=int -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture1DArray \
+// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float -DOFFSET_TYPE=int -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2D \
+// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2DArray \
+// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
 
 // RWTexture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \

>From 8d6ce2f12ca95a3a4bf43e97c5ba8498890879e8 Mon Sep 17 00:00:00 2001
From: Deric Cheung <cheung.deric at gmail.com>
Date: Thu, 10 Sep 2026 15:07:49 -0700
Subject: [PATCH 4/6] Derive the coordinate width from the resource attribute
 for better readability

---
 clang/lib/CodeGen/CGHLSLBuiltins.cpp | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
index 9926cd78fd147..b1ec72ae46242 100644
--- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp
+++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp
@@ -791,32 +791,37 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
     Value *CoordLODOp = EmitScalarExpr(E->getArg(1));
     const HLSLAttributedResourceType *RT = getRequiredHandleType(E, 0);
 
+    const auto &Attrs = RT->getAttrs();
+
     Value *CoordOp = nullptr;
     Value *LODOp = nullptr;
-    if (RT->getAttrs().ResourceClass == llvm::dxil::ResourceClass::UAV) {
+    if (Attrs.ResourceClass == llvm::dxil::ResourceClass::UAV) {
       // A UAV descriptor binds a single mip slice, so a RWTexture location is
       // all coordinate and there is no mip level to select.
       CoordOp = CoordLODOp;
       LODOp = llvm::PoisonValue::get(Int32Ty);
     } else {
-      auto *CoordLODVecTy = cast<llvm::FixedVectorType>(CoordLODOp->getType());
-      unsigned NumElts = CoordLODVecTy->getNumElements();
-      assert(NumElts >= 2 && "CoordLOD must have at least 2 elements");
-
       // Split CoordLOD into Coord and LOD. 1D resources use a scalar
       // coordinate rather than a 1-element vector.
-      if (NumElts == 2) {
+      unsigned CoordSize =
+          clang::hlsl::getResourceDimensions(Attrs.ResourceDimension) +
+          (Attrs.IsArray ? 1 : 0);
+      assert(cast<llvm::FixedVectorType>(CoordLODOp->getType())
+                     ->getNumElements() == CoordSize + 1 &&
+             "CoordLOD must have one element per coordinate, plus the level");
+
+      if (CoordSize == 1) {
         CoordOp = Builder.CreateExtractElement(CoordLODOp, uint64_t(0),
                                                "hlsl.load.coord");
       } else {
         SmallVector<int, 4> Mask;
-        for (unsigned I = 0; I < NumElts - 1; ++I)
+        for (unsigned I = 0; I < CoordSize; ++I)
           Mask.push_back(I);
         CoordOp =
             Builder.CreateShuffleVector(CoordLODOp, Mask, "hlsl.load.coord");
       }
-      LODOp = Builder.CreateExtractElement(CoordLODOp, NumElts - 1,
-                                           "hlsl.load.lod");
+      LODOp =
+          Builder.CreateExtractElement(CoordLODOp, CoordSize, "hlsl.load.lod");
     }
 
     SmallVector<Value *, 4> Args;

>From 0cf16f9631a66bcaa3d21093c84aa5bc6ca1047a Mon Sep 17 00:00:00 2001
From: Deric Cheung <cheung.deric at gmail.com>
Date: Thu, 10 Sep 2026 15:08:18 -0700
Subject: [PATCH 5/6] Add missing macro descriptions to tests

---
 clang/test/AST/HLSL/Textures-AST.hlsl                        | 4 ++++
 clang/test/AST/HLSL/Textures-scalar-AST.hlsl                 | 2 ++
 clang/test/AST/HLSL/Textures-vector-AST.hlsl                 | 2 ++
 .../resources/Textures-CalculateLevelOfDetail.hlsl           | 1 +
 clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl        | 4 ++++
 clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl    | 4 ++++
 clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl     | 4 ++++
 .../CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl   | 4 ++++
 clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl    | 5 +++++
 clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl   | 4 ++++
 clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl     | 2 ++
 .../test/SemaHLSL/Resources/Textures-declaration-order.hlsl  | 4 ++++
 12 files changed, 40 insertions(+)

diff --git a/clang/test/AST/HLSL/Textures-AST.hlsl b/clang/test/AST/HLSL/Textures-AST.hlsl
index 5a456170501cd..f0a39dc7dc281 100644
--- a/clang/test/AST/HLSL/Textures-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-AST.hlsl
@@ -78,9 +78,13 @@
 //   INDEX_ARG          a literal operator[] index
 //   TEXTURE            resource type name
 //   INDEX_TYPE         operator[] index type
+//   TRUNC_TYPE         the operator[] index type as the truncating cast of
+//                      INDEX_ARG spells it; only used by UAV-TRUNC
 //   LOCATION_TYPE      Load location type
 //   DIM_NAME           hlsl::dimension spelling
 //   RW                 dx.Texture UAV operand
+//   HAS_GETDIM         defined for types that have the GetDimensions
+//                      overloads
 //
 // Check prefixes:
 //   SRV                read-only (SRV) textures
diff --git a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
index 69f7c731d0900..587a8bdb41fe8 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -87,6 +87,8 @@
 //                      methods
 //   HAS_GATHER         defined for types that have the Gather* methods
 //   TEXTURE            resource type name
+//   IS_ARRAY           the hlsl::is_array attribute as it appears on the
+//                      handle of an array texture, empty otherwise
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   GRAD_TYPE          SampleGrad ddx/ddy type, one component per resource
diff --git a/clang/test/AST/HLSL/Textures-vector-AST.hlsl b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
index 80c75d640f3a6..92c53c2edec4e 100644
--- a/clang/test/AST/HLSL/Textures-vector-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
@@ -87,6 +87,8 @@
 //                      methods
 //   HAS_GATHER         defined for types that have the Gather* methods
 //   TEXTURE            resource type name
+//   IS_ARRAY           the hlsl::is_array attribute as it appears on the
+//                      handle of an array texture, empty otherwise
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   GRAD_TYPE          SampleGrad ddx/ddy type, one component per resource
diff --git a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
index 9d784aa953b75..7b04ffd9e6a3c 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
@@ -100,6 +100,7 @@
 //   LOD_TYPE           CalculateLevelOfDetail location type
 //   TEXTURE            resource type name
 //   GRAD_CXX           ddx/ddy type in the C++ signature
+//   GRAD_LLVM          ddx/ddy type in the IR
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   ARRAYED            spirv.Image Arrayed operand
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
index 48442a12b5da0..e2af245ec9939 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
@@ -147,6 +147,10 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_CXX          sample location type in the C++ signature
+//   COORD_LLVM         sample location type in the IR
+//   OFFSET_CXX         offset type in the C++ signature
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   OFFSET_CONST       the offset literal as it appears in the IR
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
index 4456bb653ea43..e117ed939eba0 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
@@ -147,6 +147,10 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_CXX          sample location type in the C++ signature
+//   COORD_LLVM         sample location type in the IR
+//   OFFSET_CXX         offset type in the C++ signature
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   OFFSET_CONST       the offset literal as it appears in the IR
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
index e533ee05171d4..d3a8d53d5e615 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
@@ -125,6 +125,10 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_CXX          sample location type in the C++ signature
+//   COORD_LLVM         sample location type in the IR
+//   OFFSET_CXX         offset type in the C++ signature
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   OFFSET_CONST       the offset literal as it appears in the IR
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
index d58a2e8dfa966..18e4c2632d228 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
@@ -119,6 +119,10 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_CXX          sample location type in the C++ signature
+//   COORD_LLVM         sample location type in the IR
+//   OFFSET_CXX         offset type in the C++ signature
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   OFFSET_CONST       the offset literal as it appears in the IR
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
index 8940baf921dc7..0ea68e5f3e635 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
@@ -164,7 +164,12 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   GRAD_CXX           ddx/ddy type in the C++ signature
+//   GRAD_LLVM          ddx/ddy type in the IR
 //   COORD_CXX          sample location type in the C++ signature
+//   COORD_LLVM         sample location type in the IR
+//   OFFSET_CXX         offset type in the C++ signature
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   OFFSET_CONST       the offset literal as it appears in the IR
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
index 19a70a4047d64..157fa04e114b3 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
@@ -145,6 +145,10 @@
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   COORD_CXX          sample location type in the C++ signature
+//   COORD_LLVM         sample location type in the IR
+//   OFFSET_CXX         offset type in the C++ signature
+//   OFFSET_LLVM        offset type in the IR
+//   OFFSET_ZERO        the all-zero offset as it appears in the IR
 //   DXIL_TY            dx.Texture resource-kind operand
 //   RW                 dx.Texture UAV operand
 //   OFFSET_CONST       the offset literal as it appears in the IR
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
index c1bf4267e49bc..64e6c3654a52c 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
@@ -201,6 +201,8 @@
 //   REG1               register binding for Tex2
 //   REG2               register binding for Tex3
 //   TEXTURE            resource type name
+//   INDEX_CXX_U        operator[] index type in the C++ signature
+//   INDEX_LLVM         operator[] index type in the IR
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
 //   ROV_OR_COUNT       the overloaded second dx handle operand: IsROV for
diff --git a/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl b/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
index 557a5a648475f..74103d9b65e57 100644
--- a/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
@@ -8,6 +8,10 @@
 // types. Both patterns are only defined on demand by HLSLExternalSemaSource, so
 // completing one of them must not prevent the other one from being completed.
 // See https://github.com/llvm/llvm-project/issues/212575.
+//
+//   SCALAR_FIRST       defined to declare the scalar element types first, and
+//                      left undefined to declare the vector ones first, so
+//                      that both orders are covered
 
 // expected-no-diagnostics
 

>From c782d0a4d098faddfbd2ca23efb6d1a276276881 Mon Sep 17 00:00:00 2001
From: Deric Cheung <cheung.deric at gmail.com>
Date: Thu, 10 Sep 2026 22:35:44 +0000
Subject: [PATCH 6/6] Fold Texture3D into the texture tests after the rebase

---
 clang/test/AST/HLSL/Textures-AST.hlsl         |  1 +
 clang/test/AST/HLSL/Textures-scalar-AST.hlsl  |  9 ++-
 .../test/AST/HLSL/Textures-shorthand-AST.hlsl |  1 +
 clang/test/AST/HLSL/Textures-vector-AST.hlsl  |  9 ++-
 .../Textures-CalculateLevelOfDetail.hlsl      | 32 ++++----
 .../resources/Textures-Gather.hlsl            |  1 +
 .../resources/Textures-GetDimensions.hlsl     |  1 +
 .../CodeGenHLSL/resources/Textures-Load.hlsl  | 80 ++++++++++---------
 .../CodeGenHLSL/resources/Textures-Mips.hlsl  | 24 ++++--
 .../resources/Textures-Sample.hlsl            |  1 +
 .../resources/Textures-SampleBias.hlsl        |  1 +
 .../resources/Textures-SampleCmp.hlsl         |  1 +
 .../Textures-SampleCmpLevelZero.hlsl          |  1 +
 .../resources/Textures-SampleGrad.hlsl        | 48 +++++------
 .../resources/Textures-SampleLevel.hlsl       |  1 +
 .../resources/Textures-Subscript.hlsl         | 60 ++++++--------
 .../Textures-default-explicit-binding.hlsl    |  1 +
 .../resources/Textures-default.hlsl           | 22 +++--
 .../Textures-shorthand-contexts.hlsl          |  1 +
 .../Resources/Textures-Subscript.hlsl         | 23 +++---
 .../Resources/Textures-mips-errors.hlsl       | 10 +--
 .../Textures-unsupported-methods-errors.hlsl  | 12 +--
 22 files changed, 185 insertions(+), 155 deletions(-)

diff --git a/clang/test/AST/HLSL/Textures-AST.hlsl b/clang/test/AST/HLSL/Textures-AST.hlsl
index f0a39dc7dc281..839da416c714c 100644
--- a/clang/test/AST/HLSL/Textures-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-AST.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DINDEX_ARG_TYPE=uint3 \
 // RUN:   -DINDEX_ARG="uint3(0, 0, 0)" -DTEXTURE=Texture1D -o - %s | FileCheck \
diff --git a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
index 587a8bdb41fe8..643b5f553741e 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -1,5 +1,6 @@
 // Texture1D
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1D -DCOORD_TYPE=float \
@@ -16,7 +17,7 @@
 // RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 \
 // RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | \
 // RUN:   FileCheck %s \
-// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
 // RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DLOAD_DIM=3 \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 2>" \
@@ -96,6 +97,12 @@
 //   LOD_LOCATION       expression producing a LOD_TYPE location from `loc`
 //   OFFSET_ARG         a literal offset argument
 //   DIM_NAME           hlsl::dimension spelling
+//   LOCATION_TYPE      sample location type in the declarations, one
+//                      component per resource dimension plus the array slice
+//   GRADIENT_TYPE      ddx/ddy type in the declarations, one component per
+//                      resource dimension
+//   OFFSET_TYPE        offset type in the declarations, one component per
+//                      resource dimension
 //   LOAD_DIM           Load location components (COORD_DIM plus the mip level)
 //   INDEX_TYPE         operator[] index type
 //
diff --git a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
index 4250f8d7843d1..a7d6f9d3d9897 100644
--- a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture1D -o \
 // RUN:   - %s | FileCheck %s -DTEXTURE=Texture1D
diff --git a/clang/test/AST/HLSL/Textures-vector-AST.hlsl b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
index 92c53c2edec4e..b0f19a8923c9e 100644
--- a/clang/test/AST/HLSL/Textures-vector-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
@@ -1,5 +1,6 @@
 // Texture1D
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
 // RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1D -DCOORD_TYPE=float \
@@ -16,7 +17,7 @@
 // RUN:   -DHAS_SAMPLE_CMP -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 \
 // RUN:   -DGRAD_TYPE=float -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | \
 // RUN:   FileCheck %s \
-// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,SAMPLECMP,SAMPLECMP-OFFSET \
 // RUN:   -DTEXTURE=Texture1DArray -DDIM_NAME=1D -DLOAD_DIM=3 \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]" -DLOCATION_TYPE="vector<float, 2>" \
@@ -96,6 +97,12 @@
 //   LOD_LOCATION       expression producing a LOD_TYPE location from `loc`
 //   OFFSET_ARG         a literal offset argument
 //   DIM_NAME           hlsl::dimension spelling
+//   LOCATION_TYPE      sample location type in the declarations, one
+//                      component per resource dimension plus the array slice
+//   GRADIENT_TYPE      ddx/ddy type in the declarations, one component per
+//                      resource dimension
+//   OFFSET_TYPE        offset type in the declarations, one component per
+//                      resource dimension
 //   LOAD_DIM           Load location components (COORD_DIM plus the mip level)
 //   INDEX_TYPE         operator[] index type
 //
diff --git a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
index 7b04ffd9e6a3c..9dcc077677eea 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float \
 // RUN:   -DTEXTURE=Texture1D %s | llvm-cxxfilt | FileCheck %s \
@@ -50,6 +51,19 @@
 // RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DGRAD_LLVM="<2 x float>" \
 // RUN:   -DGRAD_CXX="float vector[2]"
 
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=Texture3D %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D --check-prefixes=CHECK,DXIL -DDXIL_TY=4 -DRW=0 \
+// RUN:   -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=Texture3D %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
+// RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DGRAD_CXX="float vector[3]" \
+// RUN:   -DGRAD_LLVM="<3 x float>"
+
 // TextureCube
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
@@ -76,24 +90,6 @@
 // RUN:   -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=3 -DGRAD_LLVM="<3 x float>" \
 // RUN:   -DGRAD_CXX="float vector[3]"
 
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=Texture3D %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,DXIL \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 \
-// RUN:   -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>"
-
-// Texture3D
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
-// RUN:   -DTEXTURE=Texture3D %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,SPIRV \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>"
-
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl
index 2ddebfaf037dd..6ea41a88891d4 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl
@@ -1,4 +1,5 @@
 // Texture2D
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
 // RUN:   -DOFFSET_ARG="int2(1, 2)" -DHAS_OFFSET -DTEXTURE=Texture2D \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-GetDimensions.hlsl b/clang/test/CodeGenHLSL/resources/Textures-GetDimensions.hlsl
index 93cd5620198af..8c7c078cd0d0b 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-GetDimensions.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-GetDimensions.hlsl
@@ -1,4 +1,5 @@
 // Texture2D
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D -o \
 // RUN:   - %s \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
index 604c446e124a8..67b87daab860c 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="1" -DTEXTURE=Texture1D \
@@ -94,6 +95,32 @@
 // RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<4 x i32>" \
 // RUN:   -DLOAD_CXX="int vector[4]"
 
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,DXIL,DXIL-SRV \
+// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=4 -DRW=0 \
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_CXX="int vector[4]" -DLOAD_LLVM="<4 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,SRV,VEC-COORD,WIDE-LOC,SPIRV,SPIRV-SRV \
+// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=0 -DSAMPLED=1 \
+// RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
+// RUN:   -DFORMAT25=0 -DSPV_DIM=2 -DCOORD_LLVM="<3 x i32>" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[4]" \
+// RUN:   -DLOAD_LLVM="<4 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)"
+
 // RWTexture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int \
@@ -179,51 +206,30 @@
 // RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_LLVM="<3 x i32>" \
 // RUN:   -DLOAD_CXX="int vector[3]"
 
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
-// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,DXIL,DXIL-SRV \
-// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=4 -DRW=0 \
-// RUN:   -DENTRY_DIM=2 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x i32>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[4]" -DLOAD_LLVM="<4 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
-// Texture3D
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
-// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,SPIRV,SPIRV-SRV \
-// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
-// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=0 -DSAMPLED=1 \
-// RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
-// RUN:   -DFORMAT25=0 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x i32>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[4]" -DLOAD_LLVM="<4 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
 // RWTexture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
+// RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
 // RUN:   -DTEXTURE=RWTexture3D -D#LOAD_DIM=3 -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=1 \
-// RUN:   -DENTRY_DIM=2 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x i32>" -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[3]" -DLOAD_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
-// RWTexture3D
+// RUN:   -DCOORD_LLVM="<3 x i32>" -DCOORD_MASK="<i32 0, i32 1, i32 2>" \
+// RUN:   -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[3]" \
+// RUN:   -DLOAD_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer \
+// RUN:   -DOFFSET_CONST="splat (i32 1)"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
-// RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
+// RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
 // RUN:   -DTEXTURE=RWTexture3D -D#LOAD_DIM=3 -DCOORD_DIM=3 -DARRAYED=0 \
 // RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
-// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3 \
-// RUN:   -DCOORD_LLVM="<3 x i32>" -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DENTRY_CXX="int vector[2]" -DLOAD_CXX="int vector[3]" -DLOAD_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=2 -DCOORD_LLVM="<3 x i32>" \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DENTRY_CXX="int vector[2]" \
+// RUN:   -DLOAD_CXX="int vector[3]" -DLOAD_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer -DOFFSET_CONST="splat (i32 1)"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
index 80b892f2a525b..354aa39b2f6a6 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
 // RUN:   -DTEXTURE=Texture1D -DCOORD_TYPE=float -DINDEX_TYPE=int -o - %s | \
@@ -91,11 +92,24 @@
 // Texture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
-// RUN:   -DTEXTURE=Texture3D -DCOORD_DIM=3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,COORD3 -DTEXTURE=Texture3D \
-// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=4 -DDIM=3 \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DINDEX_CXX="int vector[3]" -DINDEX_LLVM="<3 x i32>" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DINDEX_TYPE=int3 -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,COORD3,VEC-COORD \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 4)' \
+// RUN:   -DMIPS_OFFSET='i32 4' \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-unknown-vulkan-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DINDEX_TYPE=int3 -o - %s | \
+// RUN:   llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,COORD3,VEC-COORD \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 2, 2, 0, 0, 1, 0)' \
+// RUN:   -DMIPS_OFFSET='i64 8' \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
index e2af245ec9939..2959e12696ae5 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
index e117ed939eba0..4c9d52081735d 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
index d3a8d53d5e615..b08e3dd477cf9 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
index 18e4c2632d228..2d5eda66d00fc 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
index 0ea68e5f3e635..a9e676b3b65c3 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DGRAD_TYPE=float -DHAS_OFFSET -DTEXTURE=Texture1D \
@@ -87,6 +88,30 @@
 // RUN:   -DGRAD_CXX="float vector[2]" -DOFFSET_LLVM="<2 x i32>" \
 // RUN:   -DOFFSET_CXX="int vector[2]" -DOFFSET_ZERO=zeroinitializer
 
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture3D \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
+// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" \
+// RUN:   -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>" \
+// RUN:   -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" \
+// RUN:   -DOFFSET_ZERO=zeroinitializer
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s | llvm-cxxfilt | \
+// RUN:   FileCheck %s -DTEXTURE=Texture3D \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" -DCOORD_CXX="float vector[3]" \
+// RUN:   -DCOORD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]" \
+// RUN:   -DGRAD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" \
+// RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
+
 // TextureCube
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
@@ -129,29 +154,6 @@
 // RUN:   -DOFFSET_LLVM="<3 x i32>" -DOFFSET_CXX="int vector[3]" \
 // RUN:   -DOFFSET_ZERO=zeroinitializer
 
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
-// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
-// Texture3D
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -o - \
-// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
-// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
-// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
-// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>" \
-// RUN:   -DCOORD_CXX="float vector[3]" -DCOORD_LLVM="<3 x float>" -DGRAD_CXX="float vector[3]" -DGRAD_LLVM="<3 x float>" -DOFFSET_CXX="int vector[3]" -DOFFSET_LLVM="<3 x i32>" -DOFFSET_ZERO=zeroinitializer
-
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
index 157fa04e114b3..18975646e8442 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DOFFSET_ARG="1" \
 // RUN:   -DHAS_OFFSET -DTEXTURE=Texture1D -DCOORD_TYPE=float %s | \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
index 64e6c3654a52c..7dd765da8104a 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
@@ -81,6 +82,22 @@
 // RUN:   -DSPV_DIM=1 -DINDEX_LLVM="<2 x i32>" \
 // RUN:   -DINDEX_CXX_U="unsigned int vector[2]"
 
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture3D \
+// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 -DRW=0 \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
+// RUN:   -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture3D \
+// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
+// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=2 \
+// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
+
 // RWTexture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
@@ -149,49 +166,22 @@
 // RUN:   -DFMT_INT3=0 -DSPV_DIM=1 -DINDEX_LLVM="<3 x i32>" \
 // RUN:   -DINDEX_CXX_U="unsigned int vector[3]"
 
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
-// RUN:   -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 -DRW=0 \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
-
-// Texture3D
-// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
-// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
-// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
-// RUN:   -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
-// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=2 \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
-
 // RWTexture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
-// RUN:   -DCOORD_TYPE=uint3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 \
+// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture3D --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 \
+// RUN:   -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 \
 // RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
-
-// RWTexture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
-// RUN:   -DCOORD_TYPE=uint3 -o - %s \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
-// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=0 -DMS=0 \
-// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=2 \
-// RUN:   -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
+// RUN:   -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
+// RUN:   -DTEXTURE=RWTexture3D --check-prefixes=CHECK,CHECK-STORE,SPIRV \
+// RUN:   -DARRAYED=0 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
+// RUN:   -DFMT_INT3=0 -DSPV_DIM=2 -DINDEX_CXX_U="unsigned int vector[3]" \
+// RUN:   -DINDEX_LLVM="<3 x i32>"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
diff --git a/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl b/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
index 331d814c170b9..f736241027a3a 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
@@ -1,4 +1,5 @@
 // Texture2D
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 -o - %s \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
index 4e205f9d7de7e..69762453f7189 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
@@ -1,4 +1,5 @@
 // Texture1D
+// Texture1D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
 // RUN:   -finclude-default-header -DTEXTURE=Texture1D -o - %s | FileCheck %s \
@@ -56,6 +57,20 @@
 // RUN:   -DHANDLE_TY='target("spirv.Image", float, 1, 2, 1, 0, 1, 0)' \
 // RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 1, 2, 1, 0, 1, 0)'
 
+// Texture3D
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
+// RUN:   -finclude-default-header -DTEXTURE=Texture3D -o - %s | FileCheck %s \
+// RUN:   -DTEXTURE=Texture3D --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("dx.Texture", <4 x float>, 0, 0, 0, 4)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("dx.Texture", float, 0, 0, 0, 4)'
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -std=hlsl202x \
+// RUN:   -emit-llvm -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture3D -o - %s | FileCheck %s -DTEXTURE=Texture3D \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL \
+// RUN:   -DHANDLE_TY='target("spirv.Image", float, 2, 2, 0, 0, 1, 0)' \
+// RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 2, 2, 0, 0, 1, 0)'
+
 // TextureCube
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
@@ -85,13 +100,6 @@
 // RUN:   -DHANDLE_TY='target("spirv.Image", float, 3, 2, 1, 0, 1, 0)' \
 // RUN:   -DSCALAR_HANDLE_TY='target("spirv.Image", float, 3, 2, 1, 0, 1, 0)'
 
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
-// RUN:   -finclude-default-header -DTEXTURE=Texture3D -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DDXIL_TY=4 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
-
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //
diff --git a/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl b/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
index 99ec66f6254f0..46a24b7b078fd 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
@@ -1,4 +1,5 @@
 // Texture2D
+// Texture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
 // RUN:   -DTEXTURE=Texture2D -DCOORD_TYPE=float2 -o - %s \
diff --git a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
index c0ee382b6dd56..191744b8c979f 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
@@ -16,6 +16,12 @@
 // RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
 // RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify=expected,vecidx -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=Texture3D -DINDEX_TYPE=uint3 \
+// RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
+// RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
+// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" \
+// RUN:   -verify=expected,vecidx -o - %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture1D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint -DINDEX_ARG="1" -DWIDE_INDEX_TYPE=int2 \
 // RUN:   -DWIDE_INDEX_ARG="int2(1, 2)" -verify=expected,scalaridx -o - %s
@@ -51,28 +57,19 @@
 // RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
 // RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
 // RUN:   -verify=expected,vecidx -o - %s
-
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DTEXTURE=Texture3D -DINDEX_TYPE=uint3 \
-// RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
-// RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
-// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify -o - %s
-
-// RWTexture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
 // RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
-// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" -verify \
+// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
+// RUN:   -verify=expected,vecidx \
 // RUN:   -o - %s
-
-// RWTexture3D
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DHAS_STORE \
 // RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
 // RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
-// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" -verify \
+// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" \
+// RUN:   -verify=expected,vecidx \
 // RUN:   -o - %s
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
diff --git a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
index daca84b3802e8..d521e11463afc 100644
--- a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
@@ -12,6 +12,9 @@
 // RUN:   -DTEXTURE=Texture2DArray -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture3D -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=TextureCube -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
@@ -28,13 +31,6 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=RWTexture2DArray -verify %s
-
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
-// RUN:   -DTEXTURE=Texture3D -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
-
-// RWTexture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=RWTexture3D -verify %s
diff --git a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
index 2c0247931d3d8..856c5b00c1820 100644
--- a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
@@ -7,6 +7,10 @@
 // RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DGRAD_TYPE=float \
 // RUN:   -DOFFSET_TYPE=int -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DHAS_SAMPLE -DHAS_LOD \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 \
+// RUN:   -DGRAD_TYPE=float3 -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_GATHER -DHAS_LOD \
 // RUN:   -DLOAD_ARG="int4(0, 0, 0, 0)" -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 -verify \
@@ -28,18 +32,10 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2DArray \
 // RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
-
-// RWTexture3D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture3D \
 // RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 -DOFFSET_TYPE=int3 -verify %s
 
-// Texture3D
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_TEXEL -DHAS_SAMPLE -DHAS_LOD \
-// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 \
-// RUN:   -DGRAD_TYPE=float3 -verify %s
-
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
 //



More information about the llvm-branch-commits mailing list