[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:49:58 PDT 2026


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

>From 0e7faf916c54272a5cbe811cbb833b13ccc3720a 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] [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  | 817 +++++++++---------
 .../test/AST/HLSL/Textures-shorthand-AST.hlsl |  21 +-
 clang/test/AST/HLSL/Textures-vector-AST.hlsl  | 817 +++++++++---------
 .../Textures-CalculateLevelOfDetail.hlsl      | 160 +++-
 .../CodeGenHLSL/resources/Textures-Load.hlsl  | 404 ++++++---
 .../CodeGenHLSL/resources/Textures-Mips.hlsl  | 113 ++-
 .../resources/Textures-Sample.hlsl            | 210 +++--
 .../resources/Textures-SampleBias.hlsl        | 179 ++--
 .../resources/Textures-SampleCmp.hlsl         | 196 +++--
 .../Textures-SampleCmpLevelZero.hlsl          | 170 +++-
 .../resources/Textures-SampleGrad.hlsl        | 258 ++++--
 .../resources/Textures-SampleLevel.hlsl       | 183 ++--
 .../resources/Textures-Subscript.hlsl         | 289 +++++--
 .../resources/Textures-default.hlsl           |  65 +-
 .../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     |  12 +-
 .../Resources/Textures-Subscript.hlsl         |  63 +-
 .../Resources/Textures-declaration-order.hlsl |  28 +-
 .../Resources/Textures-mips-errors.hlsl       |  12 +
 .../Textures-unsupported-methods-errors.hlsl  |  17 +-
 30 files changed, 2816 insertions(+), 1655 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 3f42316d2f1fb..877538215945c 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 d7c3602672675..8ec42466d6198 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -1,31 +1,54 @@
 // 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 -DTEXTURE=Texture2D -DCOORD_TYPE=float2 \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_TYPE=float -DGRAD_TYPE=float \
+// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="1" -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture1D \
+// RUN:   -DDIM_NAME=1D -DLOAD_DIM=2 -DLOCATION_TYPE=float \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int -DINDEX_TYPE="unsigned int" \
+// RUN:   -DIS_ARRAY=""
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DGRAD_TYPE=float \
+// RUN:   -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture1DArray \
+// RUN:   -DDIM_NAME=1D -DLOAD_DIM=3 -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// 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_GATHER -DTEXTURE=Texture2D -DCOORD_TYPE=float2 \
 // RUN:   -DGRAD_TYPE=float2 -DLOD_LOCATION=loc -DOFFSET_ARG="int2(1, 2)" -o - \
-// RUN:   %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY \
-// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GATHER,GATHER-OFFSET,GETDIM-XY \
+// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DLOAD_DIM=3 \
+// RUN:   -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>" \
 // 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 -DTEXTURE=TextureCube \
-// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK -DTEXTURE=TextureCube \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 -DIS_ARRAY=""
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GATHER \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
+// RUN:   -DLOD_LOCATION=loc -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,GATHER -DTEXTURE=TextureCube -DDIM_NAME=Cube \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DIS_ARRAY=""
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GATHER \
 // RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -DGRAD_TYPE=float3 \
-// RUN:   -DLOD_LOCATION=loc.xyz -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK -DTEXTURE=TextureCubeArray \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN:   -DLOD_LOCATION=loc.xyz -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,GATHER -DTEXTURE=TextureCubeArray \
+// RUN:   -DDIM_NAME=Cube -DLOCATION_TYPE="vector<float, 4>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DIS_ARRAY=" [[hlsl::is_array]]"
 // 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 -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 \
-// RUN:   -DGRAD_TYPE=float2 -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" \
-// RUN:   -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY \
-// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
-// RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DHAS_GETDIM_XY -DHAS_GATHER -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc.xy \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GATHER,GATHER-OFFSET,GETDIM-XY \
+// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DLOAD_DIM=4 \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>" \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
@@ -35,6 +58,7 @@
 //                      have overloads taking an offset
 //   HAS_GETDIM_XY      defined for types that have the width/height
 //                      GetDimensions overloads
+//   HAS_GATHER         defined for types that have the Gather methods
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
@@ -43,10 +67,12 @@
 //   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)
+//   LOCATION_TYPE      sample location type
+//   GRADIENT_TYPE      SampleGrad ddx/ddy and CalculateLevelOfDetail location
+//                      type, one component per resource dimension
+//   OFFSET_TYPE        offset type, one component per resource dimension
+//   LOAD_DIM           Load location components (the location plus the mip
+//                      level); always a vector
 //   INDEX_TYPE         operator[] index type
 //
 // Check prefixes:
@@ -56,7 +82,8 @@
 //   OFFSET             the sampling and gathering methods have offset
 //                      overloads
 //   GETDIM-XY          the width/height GetDimensions overloads exist
-//   ARRAY              the resource has an array slice
+//   GATHER             the Gather/GatherCmp methods exist
+//   GATHER-OFFSET      the Gather methods have offset overloads
 //   IS_ARRAY           the [[hlsl::is_array]] attribute on arrayed resources,
 //                      or empty
 
@@ -95,9 +122,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>
@@ -111,7 +138,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
@@ -132,9 +159,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>
@@ -149,13 +176,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>
@@ -172,14 +199,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
@@ -197,14 +224,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
@@ -220,15 +247,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>
@@ -245,16 +272,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
@@ -272,17 +299,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>
@@ -297,17 +324,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>
@@ -324,18 +351,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
@@ -353,16 +380,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
@@ -378,15 +405,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>
@@ -403,14 +430,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
 
-// CHECK: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -426,15 +453,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -451,16 +478,16 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' '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 {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue '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
@@ -478,15 +505,15 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' '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 {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -502,15 +529,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -527,14 +554,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' '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
 
-// 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>
@@ -549,12 +576,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>
@@ -569,7 +596,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)'
@@ -658,287 +685,287 @@
 // GETDIM-XY-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'numberOfLevels' 'float &__restrict'
 // GETDIM-XY-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 1
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 1
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 2
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 2
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 3
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 3
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
-// CHECK-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
+// GATHER: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: CompoundStmt
+// GATHER-OFFSET-NEXT: ReturnStmt
+// GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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 {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: CompoundStmt
+// GATHER-OFFSET-NEXT: ReturnStmt
+// GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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 {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
 TEXTURE<float> t;
 SamplerState s;
@@ -953,7 +980,9 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleCmpLevelZero(scs, loc, cmp);
   t.CalculateLevelOfDetail(s, LOD_LOCATION);
   t.CalculateLevelOfDetailUnclamped(s, LOD_LOCATION);
+#ifdef HAS_GATHER
   t.Gather(s, loc);
+#endif
 
 #ifdef HAS_OFFSET
   t.Sample(s, loc, OFFSET_ARG);
diff --git a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
index f30bd9e85d3b9..02dbbce4d6193 100644
--- a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
@@ -1,19 +1,24 @@
 // 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
 
 // 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 1600c689d629b..95df39a24ffd5 100644
--- a/clang/test/AST/HLSL/Textures-vector-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
@@ -1,31 +1,54 @@
 // 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 -DTEXTURE=Texture2D -DCOORD_TYPE=float2 \
+// RUN:   -DTEXTURE=Texture1D -DCOORD_TYPE=float -DGRAD_TYPE=float \
+// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="1" -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture1D \
+// RUN:   -DDIM_NAME=1D -DLOAD_DIM=2 -DLOCATION_TYPE=float \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int -DINDEX_TYPE="unsigned int" \
+// RUN:   -DIS_ARRAY=""
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture1DArray -DCOORD_TYPE=float2 -DGRAD_TYPE=float \
+// RUN:   -DLOD_LOCATION=loc.x -DOFFSET_ARG="1" -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET -DTEXTURE=Texture1DArray \
+// RUN:   -DDIM_NAME=1D -DLOAD_DIM=3 -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE=float -DOFFSET_TYPE=int \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" \
+// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// 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_GATHER -DTEXTURE=Texture2D -DCOORD_TYPE=float2 \
 // RUN:   -DGRAD_TYPE=float2 -DLOD_LOCATION=loc -DOFFSET_ARG="int2(1, 2)" -o - \
-// RUN:   %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY \
-// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GATHER,GATHER-OFFSET,GETDIM-XY \
+// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DLOAD_DIM=3 \
+// RUN:   -DLOCATION_TYPE="vector<float, 2>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>" \
 // 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 -DTEXTURE=TextureCube \
-// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK -DTEXTURE=TextureCube \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 -DIS_ARRAY=""
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GATHER \
+// RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
+// RUN:   -DLOD_LOCATION=loc -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,GATHER -DTEXTURE=TextureCube -DDIM_NAME=Cube \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DIS_ARRAY=""
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_GATHER \
 // RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -DGRAD_TYPE=float3 \
-// RUN:   -DLOD_LOCATION=loc.xyz -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK -DTEXTURE=TextureCubeArray \
-// RUN:   -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
-// RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN:   -DLOD_LOCATION=loc.xyz -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,GATHER -DTEXTURE=TextureCubeArray \
+// RUN:   -DDIM_NAME=Cube -DLOCATION_TYPE="vector<float, 4>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 3>" -DIS_ARRAY=" [[hlsl::is_array]]"
 // 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 -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 \
-// RUN:   -DGRAD_TYPE=float2 -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" \
-// RUN:   -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY \
-// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
-// RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
+// RUN:   -DHAS_GETDIM_XY -DHAS_GATHER -DTEXTURE=Texture2DArray \
+// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc.xy \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GATHER,GATHER-OFFSET,GETDIM-XY \
+// RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DLOAD_DIM=4 \
+// RUN:   -DLOCATION_TYPE="vector<float, 3>" \
+// RUN:   -DGRADIENT_TYPE="vector<float, 2>" -DOFFSET_TYPE="vector<int, 2>" \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
@@ -35,6 +58,7 @@
 //                      have overloads taking an offset
 //   HAS_GETDIM_XY      defined for types that have the width/height
 //                      GetDimensions overloads
+//   HAS_GATHER         defined for types that have the Gather methods
 //   TEXTURE            resource type name
 //   COORD_TYPE         sample location type (DIM components plus the array
 //                      slice)
@@ -43,10 +67,12 @@
 //   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)
+//   LOCATION_TYPE      sample location type
+//   GRADIENT_TYPE      SampleGrad ddx/ddy and CalculateLevelOfDetail location
+//                      type, one component per resource dimension
+//   OFFSET_TYPE        offset type, one component per resource dimension
+//   LOAD_DIM           Load location components (the location plus the mip
+//                      level); always a vector
 //   INDEX_TYPE         operator[] index type
 //
 // Check prefixes:
@@ -56,7 +82,8 @@
 //   OFFSET             the sampling and gathering methods have offset
 //                      overloads
 //   GETDIM-XY          the width/height GetDimensions overloads exist
-//   ARRAY              the resource has an array slice
+//   GATHER             the Gather/GatherCmp methods exist
+//   GATHER-OFFSET      the Gather methods have offset overloads
 //   IS_ARRAY           the [[hlsl::is_array]] attribute on arrayed resources,
 //                      or empty
 
@@ -99,9 +126,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>
@@ -115,7 +142,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
@@ -136,9 +163,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>
@@ -153,13 +180,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>
@@ -176,14 +203,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
@@ -201,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: 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
@@ -224,15 +251,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>
@@ -249,16 +276,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
@@ -276,17 +303,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>
@@ -301,17 +328,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>
@@ -328,18 +355,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
@@ -357,16 +384,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
@@ -382,15 +409,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>
@@ -407,14 +434,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
 
-// CHECK: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -430,15 +457,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -455,16 +482,16 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' '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 {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]], float)'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue '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
@@ -482,15 +509,15 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' '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 {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// CHECK: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// CHECK-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
 // CHECK-NEXT: CompoundStmt
 // CHECK-NEXT: ReturnStmt
@@ -506,15 +533,15 @@
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // CHECK-SAME: ' lvalue .__handle
 // CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' 'float'
 // CHECK-NEXT: AlwaysInlineAttr
 
-// OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])'
 // OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
 // OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
 // OFFSET-NEXT: CompoundStmt
 // OFFSET-NEXT: ReturnStmt
 // OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
@@ -531,14 +558,14 @@
 // OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 // OFFSET-SAME: ' lvalue .__handle
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// 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 {{.*}} 'CompareValue' '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
 
-// 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>
@@ -553,12 +580,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>
@@ -573,7 +600,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)'
@@ -658,287 +685,287 @@
 // GETDIM-XY-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'height' 'float &__restrict'
 // GETDIM-XY-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'numberOfLevels' 'float &__restrict'
 
-// CHECK: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 0
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 1
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 1
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 2
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 2
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 3
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} 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: IntegerLiteral {{.*}} 'unsigned int' 3
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
-// CHECK-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
-// CHECK-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
-// CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// CHECK-NEXT: CompoundStmt
-// CHECK-NEXT: ReturnStmt
-// CHECK-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle
-// CHECK-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// CHECK-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
-// OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
-// OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<{{.*}}>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
+// GATHER: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, [[LOCATION_TYPE]])' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<element_type, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// 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>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[LOCATION_TYPE]]' lvalue ParmVar {{.*}} 'Location' '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: CompoundStmt
+// GATHER-OFFSET-NEXT: ReturnStmt
+// GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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 {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-NEXT: CompoundStmt
+// GATHER-NEXT: ReturnStmt
+// GATHER-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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, [[LOCATION_TYPE]], float, [[OFFSET_TYPE]])' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location '[[LOCATION_TYPE]]'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: CompoundStmt
+// GATHER-OFFSET-NEXT: ReturnStmt
+// GATHER-OFFSET-NEXT: CStyleCastExpr {{.*}} 'vector<float, 4>' <Dependent>
+// GATHER-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_gather_cmp' 'void (...) noexcept'
+// GATHER-OFFSET-NEXT: MemberExpr {{.*}} lvalue .__handle
+// 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 {{.*}} '[[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 {{.*}} '[[OFFSET_TYPE]]' lvalue ParmVar {{.*}} 'Offset' '[[OFFSET_TYPE]]'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
 TEXTURE<float4> t;
 SamplerState s;
@@ -953,7 +980,9 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleCmpLevelZero(scs, loc, cmp);
   t.CalculateLevelOfDetail(s, LOD_LOCATION);
   t.CalculateLevelOfDetailUnclamped(s, LOD_LOCATION);
+#ifdef HAS_GATHER
   t.Gather(s, loc);
+#endif
 
 #ifdef HAS_OFFSET
   t.Sample(s, loc, OFFSET_ARG);
diff --git a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
index 490575fc43807..f7038d20218f5 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
@@ -1,58 +1,126 @@
 // 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 \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2D --check-prefixes=CHECK,DXIL \
-// RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2
+// 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=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=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 \
-// 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:   -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:   | 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:   -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
 
 // 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
@@ -65,41 +133,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 26692a276287d..020fd4e85cf7a 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
@@ -1,78 +1,191 @@
+// 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:   -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:   -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:   | 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:   -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 \
-// 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:   -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]"
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -85,9 +198,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
@@ -110,41 +231,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
@@ -153,22 +278,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]]
 
 
@@ -177,193 +303,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, 1, 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, 1, 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 {{.*}} <[[DIM]] x i32> @test_load_int2(int vector[[[ENTRY_DIM]]])
-// CHECK: %[[CALL:.*]] = call {{.*}} <[[DIM]] x i32> @hlsl::[[TEXTURE]]<int vector[[[DIM]]]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_int2, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
-// CHECK: ret <[[DIM]] x i32> %[[CALL]]
+// 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 {{.*}} <[[DIM]] x i32> @hlsl::[[TEXTURE]]<int vector[[[DIM]]]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
-// DXIL: %[[RES:.*]] = call <[[DIM]] x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <[[DIM]] x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// SPIRV: %[[RES:.*]] = call <[[DIM]] x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, 1, 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
-// CHECK: ret <[[DIM]] x i32> %[[RES]]
+// 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 {{.*}} <[[DIM]] x i32> @test_load_offset_int2(int vector[[[ENTRY_DIM]]])
-// SRV: %[[CALL:.*]] = call {{.*}} <[[DIM]] x i32> @hlsl::[[TEXTURE]]<int vector[[[DIM]]]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_int2, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
-// SRV: ret <[[DIM]] x i32> %[[CALL]]
+// 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 {{.*}} <[[DIM]] x i32> @hlsl::[[TEXTURE]]<int vector[[[DIM]]]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
-// DXIL-SRV: %[[RES:.*]] = call <[[DIM]] x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <[[DIM]] x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SPIRV-SRV: %[[RES:.*]] = call <[[DIM]] x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, 1, 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
-// SRV: ret <[[DIM]] x i32> %[[RES]]
+// 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, 1, 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, 1, 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, 1, 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, 1, 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 6b7fbc1b3cff8..5d836acfcbb70 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
@@ -1,29 +1,62 @@
 // 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,NOARRAY -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,ARRAY -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
 
 // 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:
-//   NOARRAY            the resource has no array slice
-//   ARRAY              the resource has an array slice
+//   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;
 
@@ -40,20 +73,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)
@@ -76,30 +109,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
-// ARRAY: %[[COORD_VAL3:.*]] = load <3 x i32>, ptr %[[VEC_TMP]]
-// ARRAY: %[[VECEXT3:.*]] = extractelement <3 x i32> %[[COORD_VAL3]], i32 2
-// ARRAY: %[[VECINIT3B:.*]] = insertelement <4 x i32> %[[VECINIT3]], i32 %[[VECEXT3]], i32 2
+// 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]]
-// NOARRAY: %[[VECINITL:.*]] = insertelement <3 x i32> %[[VECINIT3]], i32 %[[LEVEL_VAL]], i32 2
-// ARRAY: %[[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: %[[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
+// 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 74c30c1d8130e..e7c144c7abac4 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Sample.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,31 +179,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]]
 
 
@@ -136,30 +213,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
@@ -174,33 +251,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 4966f1ab00798..0ab1071a1e9a0 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.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,26 +179,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]]
 
 
@@ -131,22 +209,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
@@ -161,24 +240,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 408f9b483cc48..5e70f21228681 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
@@ -1,65 +1,146 @@
 // 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:   --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:   -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="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:   -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=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:   -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 - -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: %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:   -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=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:   -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
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -73,6 +154,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
@@ -104,37 +187,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]]
 
 
@@ -144,36 +227,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
@@ -188,39 +271,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 31c1b72f24423..54331def9d508 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
@@ -1,63 +1,138 @@
 // 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:   --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 - -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 -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 \
-// 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.
@@ -69,6 +144,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
@@ -98,34 +175,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
@@ -134,23 +211,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 28c09fb820877..6a7f5acdbb73a 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
@@ -1,83 +1,208 @@
 // 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: %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:   -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,DXIL -DROV_OR_COUNT=0 \
-// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DRW=0
+// 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: %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 \
-// 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,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 -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=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=2
+// 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=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: %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 \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
+// 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=7
+// 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 \
-// RUN:   | llvm-cxxfilt \
-// RUN:   | FileCheck %s -DTEXTURE=RWTexture2DArray -DCOORD_DIM=3 \
+// 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=1
+// 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
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -93,6 +218,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
@@ -138,85 +265,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 a271f0ff2ff94..54b223ebce312 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
@@ -1,28 +1,69 @@
 // 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=TextureCube -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCube -DDXIL_TY=5 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL
+// 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=TextureCubeArray -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=TextureCubeArray -DDXIL_TY=9 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-NOTEXEL
+// 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=Texture2DArray -o - %s \
-// RUN:   | FileCheck %s -DTEXTURE=Texture2DArray -DDXIL_TY=7 -DRW=0 \
-// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+// 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 -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:   --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
 
 // 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 0b31f4beceb1a..c4f87bca10f3b 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 \
@@ -22,6 +28,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;
@@ -48,10 +55,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 1b141cf052ac5..02bcddc023ee8 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 9ef77e5723988..6939a9489a5a1 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 1713cc1ea0529..5dd74870808c5 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 5b01281efe00d..bc4d491e2a858 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
@@ -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
 //
@@ -66,7 +75,8 @@ void main(COORD_TYPE loc) {
 
   t.Sample(s, loc, OFFSET_ARG, 1.0);
 
-  // expected-error at +4 {{no matching member function for call to 'Sample'}}
+  // expected-error at +5 {{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}}
   // expected-note@*:* {{candidate function not viable: requires 2 arguments, but 3 were provided}}
   // expected-note@*:* {{candidate function not viable: requires 4 arguments, but 3 were provided}}
diff --git a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
index 4eea4ea142713..ac59283fcf5af 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
@@ -1,32 +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 -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=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=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)" -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 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
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -44,6 +68,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;
@@ -57,20 +85,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 9811202570310..495f13a5498c7 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;
@@ -25,6 +33,14 @@ TextureCube<float2> TexCubeVec;
 TextureCubeArray<float> TexCubeArray;
 TextureCubeArray<float2> TexCubeArrayVec;
 #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;
@@ -43,7 +59,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 3f5ecf264938f..334c9238e65fd 100644
--- a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
@@ -3,15 +3,27 @@
 // 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=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=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 \
diff --git a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
index d2c62b9d5a082..aed3368173cff 100644
--- a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
@@ -1,10 +1,24 @@
 // 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=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 \
@@ -31,7 +45,8 @@
 //   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;



More information about the llvm-branch-commits mailing list