[clang] [HLSL] Add Texture3D and RWTexture3D types (PR #220438)

Deric C. via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 9 14:10:03 PDT 2026


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

>From 834e5142986fc1e4c433a0f0ef838279ee89077f Mon Sep 17 00:00:00 2001
From: Deric Cheung <cheung.deric at gmail.com>
Date: Tue, 1 Sep 2026 17:37:06 -0700
Subject: [PATCH 1/2] Add Texture3D and RWTexture3D

---
 clang/lib/Sema/HLSLExternalSemaSource.cpp     |   7 +
 clang/test/AST/HLSL/Textures-scalar-AST.hlsl  | 862 +++++++++---------
 .../test/AST/HLSL/Textures-shorthand-AST.hlsl |   4 +
 clang/test/AST/HLSL/Textures-vector-AST.hlsl  | 862 +++++++++---------
 .../Textures-CalculateLevelOfDetail.hlsl      |  12 +
 .../CodeGenHLSL/resources/Textures-Load.hlsl  |  74 +-
 .../CodeGenHLSL/resources/Textures-Mips.hlsl  |  25 +-
 .../resources/Textures-Sample.hlsl            |  17 +
 .../resources/Textures-SampleBias.hlsl        |  17 +
 .../resources/Textures-SampleGrad.hlsl        |  17 +
 .../resources/Textures-SampleLevel.hlsl       |  17 +
 .../resources/Textures-Subscript.hlsl         |  32 +
 .../Textures-default-explicit-binding.hlsl    |  12 +
 .../resources/Textures-default.hlsl           |   5 +
 .../Textures-shorthand-contexts.hlsl          |   6 +
 .../Textures-CalculateLevelOfDetail.hlsl      |   3 +
 .../Resources/Textures-Load-errors.hlsl       |   9 +
 .../Resources/Textures-SampleBias.hlsl        |   4 +
 .../Resources/Textures-SampleGrad.hlsl        |   4 +
 .../Resources/Textures-SampleLevel.hlsl       |   4 +
 .../SemaHLSL/Resources/Textures-Sema.hlsl     |   7 +-
 .../Resources/Textures-Subscript.hlsl         |  17 +
 .../Resources/Textures-declaration-order.hlsl |  13 +
 .../Resources/Textures-mips-errors.hlsl       |   6 +
 .../Textures-unsupported-methods-errors.hlsl  |  16 +-
 25 files changed, 1182 insertions(+), 870 deletions(-)

diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp
index d2d9c97b98a57..097ad5ea93153 100644
--- a/clang/lib/Sema/HLSLExternalSemaSource.cpp
+++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp
@@ -322,6 +322,13 @@ static const TextureTypeInfo TextureTypes[] = {
      /*IsArray=*/false, /*IsROV=*/false,
      TemplateShape::ElementTypeAndSampleCount,
      TexCap::LoadMS | TexCap::Subscript},
+    {"Texture3D", ResourceClass::SRV, ResourceDimension::Dim3D,
+     /*IsArray=*/false, /*IsROV=*/false, TemplateShape::ElementType,
+     TexCap::Load | TexCap::Subscript | TexCap::Mips | TexCap::Sample |
+         TexCap::CalcLOD | TexCap::GetDims},
+    {"RWTexture3D", ResourceClass::UAV, ResourceDimension::Dim3D,
+     /*IsArray=*/false, /*IsROV=*/false, TemplateShape::ElementType,
+     TexCap::LoadRW | TexCap::Subscript | TexCap::GetDims},
     {"TextureCube", ResourceClass::SRV, ResourceDimension::Cube,
      /*IsArray=*/false, /*IsROV=*/false, TemplateShape::ElementType,
      TexCap::Sample | TexCap::SampleCmp | TexCap::CalcLOD | TexCap::Gather |
diff --git a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
index d7c3602672675..a9dbe6b2d11eb 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -1,32 +1,43 @@
 // 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:   -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:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s \
+// RUN:   | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY=""
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -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_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
+// RUN:   -DTEXTURE=TextureCube -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 \
+// RUN:   -DIS_ARRAY=""
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header \
-// 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:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
+// RUN:   -DTEXTURE=TextureCubeArray -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
 // RUN: %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:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 \
+// RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s \
+// RUN:   | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
 // RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
+// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,TEXEL,OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY=""
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -35,6 +46,9 @@
 //                      have overloads taking an offset
 //   HAS_GETDIM_XY      defined for types that have the width/height
 //                      GetDimensions overloads
+//   HAS_SAMPLE_CMP     defined for types that have the comparison sampling
+//                      methods
+//   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)
@@ -56,6 +70,10 @@
 //   OFFSET             the sampling and gathering methods have offset
 //                      overloads
 //   GETDIM-XY          the width/height GetDimensions overloads exist
+//   SAMPLECMP          the comparison sampling methods exist
+//   SAMPLECMP-OFFSET   the comparison sampling methods have offset overloads
+//   GATHER             the Gather* methods exist
+//   GATHER-OFFSET      the Gather* methods have offset overloads
 //   ARRAY              the resource has an array slice
 //   IS_ARRAY           the [[hlsl::is_array]] attribute on arrayed resources,
 //                      or empty
@@ -67,7 +85,7 @@
 
 // CHECK: CXXRecordDecl {{.*}} SamplerComparisonState definition
 // CHECK: FinalAttr {{.*}} Implicit final
-// CHECK-NEXT: FieldDecl {{.*}} implicit {{.*}} __handle '__hlsl_resource_t
+// CHECK-NEXT: FieldDecl {{.*}} implicit {{.*}}__handle '__hlsl_resource_t
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 
 // CHECK: ClassTemplateDecl {{.*}} [[TEXTURE]]
@@ -408,129 +426,129 @@
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
-// 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 {{.*}} 'float' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// CHECK-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}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: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
-// 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 {{.*}} 'float' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-NEXT: CompoundStmt
+// SAMPLECMP-NEXT: ReturnStmt
+// SAMPLECMP-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}hlsl::contained_type(element_type){{\]\]}}
+// SAMPLECMP-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: CompoundStmt
+// SAMPLECMP-OFFSET-NEXT: ReturnStmt
+// SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
 // ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// OFFSET-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// OFFSET-SAME: ' lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
-// 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: ParmVarDecl {{.*}} Clamp 'float'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// SAMPLECMP-OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
+// SAMPLECMP-OFFSET-NEXT: CompoundStmt
+// SAMPLECMP-OFFSET-NEXT: ReturnStmt
+// SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
 // ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// OFFSET-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// OFFSET-SAME: ' lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
-// 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 {{.*}} 'float' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// CHECK-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}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: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
-// 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 {{.*}} 'float' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// SAMPLECMP-OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
+// SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-NEXT: CompoundStmt
+// SAMPLECMP-NEXT: ReturnStmt
+// SAMPLECMP-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}hlsl::contained_type(element_type){{\]\]}}
+// SAMPLECMP-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: CompoundStmt
+// SAMPLECMP-OFFSET-NEXT: ReturnStmt
+// SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
 // ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// OFFSET-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// OFFSET-SAME: ' lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
+// SAMPLECMP-OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<element_type>' lvalue implicit this
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
 // CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetail 'float (hlsl::SamplerState, vector<float, [[DIM]]>)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
@@ -658,287 +676,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, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
 TEXTURE<float> t;
 SamplerState s;
@@ -949,11 +967,15 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleBias(s, loc, 0.0);
   t.SampleGrad(s, loc, (GRAD_TYPE)0, (GRAD_TYPE)0);
   t.SampleLevel(s, loc, 0.0);
+#ifdef HAS_SAMPLE_CMP
   t.SampleCmp(scs, loc, cmp);
   t.SampleCmpLevelZero(scs, loc, cmp);
+#endif
   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);
@@ -963,10 +985,12 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleGrad(s, loc, (GRAD_TYPE)0, (GRAD_TYPE)0, OFFSET_ARG);
   t.SampleGrad(s, loc, (GRAD_TYPE)0, (GRAD_TYPE)0, OFFSET_ARG, 1.0);
   t.SampleLevel(s, loc, 0.0, OFFSET_ARG);
+#ifdef HAS_SAMPLE_CMP
   t.SampleCmp(scs, loc, cmp, OFFSET_ARG);
   t.SampleCmp(scs, loc, cmp, OFFSET_ARG, 1.0f);
   t.SampleCmpLevelZero(scs, loc, cmp, OFFSET_ARG);
 #endif
+#endif
 
 #ifdef HAS_GETDIM_XY
   uint u_w, u_h, u_l;
diff --git a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
index f30bd9e85d3b9..98d58726ec7fc 100644
--- a/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-shorthand-AST.hlsl
@@ -14,6 +14,10 @@
 // RUN:   -disable-llvm-passes -finclude-default-header \
 // RUN:   -DTEXTURE=Texture2DArray -o - %s \
 // RUN:   | FileCheck %s -DTEXTURE=Texture2DArray
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture3D \
+// RUN:   -o - %s \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D
 
 // 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..5086310bb7470 100644
--- a/clang/test/AST/HLSL/Textures-vector-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-vector-AST.hlsl
@@ -1,32 +1,43 @@
 // 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:   -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:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER -DTEXTURE=Texture2D \
+// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc \
+// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s \
+// RUN:   | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>" -DIS_ARRAY=""
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -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_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCube -DCOORD_TYPE=float3 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc -o - %s \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
+// RUN:   -DTEXTURE=TextureCube -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=3 \
+// RUN:   -DIS_ARRAY=""
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header \
-// 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:   -disable-llvm-passes -finclude-default-header -DHAS_SAMPLE_CMP \
+// RUN:   -DHAS_GATHER -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 \
+// RUN:   -DGRAD_TYPE=float3 -DLOD_LOCATION=loc.xyz -o - %s \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SAMPLECMP,GATHER \
+// RUN:   -DTEXTURE=TextureCubeArray -DDIM_NAME=Cube -DDIM=3 -DCOORD_DIM=4 \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
 // RUN: %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:   -DHAS_GETDIM_XY -DHAS_SAMPLE_CMP -DHAS_GATHER \
+// RUN:   -DTEXTURE=Texture2DArray -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 \
+// RUN:   -DLOD_LOCATION=loc.xy -DOFFSET_ARG="int2(1, 2)" -o - %s \
+// RUN:   | FileCheck %s \
+// RUN:   --check-prefixes=CHECK,ARRAY,TEXEL,OFFSET,GETDIM-XY,SAMPLECMP,SAMPLECMP-OFFSET,GATHER,GATHER-OFFSET \
 // RUN:   -DTEXTURE=Texture2DArray -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=3 \
 // RUN:   -DLOAD_DIM=4 -DINDEX_TYPE="vector<unsigned int, 3>" \
 // RUN:   -DIS_ARRAY=" [[hlsl::is_array]]"
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 \
+// RUN:   -DLOD_LOCATION=loc -DOFFSET_ARG="int3(1, 2, 3)" -o - %s \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,TEXEL,OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DDIM_NAME=3D -DDIM=3 -DCOORD_DIM=3 -DLOAD_DIM=4 \
+// RUN:   -DINDEX_TYPE="vector<unsigned int, 3>" -DIS_ARRAY=""
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -35,6 +46,9 @@
 //                      have overloads taking an offset
 //   HAS_GETDIM_XY      defined for types that have the width/height
 //                      GetDimensions overloads
+//   HAS_SAMPLE_CMP     defined for types that have the comparison sampling
+//                      methods
+//   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)
@@ -56,6 +70,10 @@
 //   OFFSET             the sampling and gathering methods have offset
 //                      overloads
 //   GETDIM-XY          the width/height GetDimensions overloads exist
+//   SAMPLECMP          the comparison sampling methods exist
+//   SAMPLECMP-OFFSET   the comparison sampling methods have offset overloads
+//   GATHER             the Gather* methods exist
+//   GATHER-OFFSET      the Gather* methods have offset overloads
 //   ARRAY              the resource has an array slice
 //   IS_ARRAY           the [[hlsl::is_array]] attribute on arrayed resources,
 //                      or empty
@@ -67,7 +85,7 @@
 
 // CHECK: CXXRecordDecl {{.*}} SamplerComparisonState definition
 // CHECK: FinalAttr {{.*}} Implicit final
-// CHECK-NEXT: FieldDecl {{.*}} implicit {{.*}} __handle '__hlsl_resource_t
+// CHECK-NEXT: FieldDecl {{.*}} implicit {{.*}}__handle '__hlsl_resource_t
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
 
 // CHECK: ClassTemplateDecl {{.*}} [[TEXTURE]]
@@ -412,129 +430,129 @@
 // OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
 // OFFSET-NEXT: AlwaysInlineAttr
 
-// CHECK: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
-// 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 {{.*}} 'float' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// CHECK-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}hlsl::contained_type(vector<element_type, element_count>){{\]\]}}
-// CHECK-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// CHECK-SAME: ' lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
-// 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 {{.*}} 'float' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-NEXT: CompoundStmt
+// SAMPLECMP-NEXT: ReturnStmt
+// SAMPLECMP-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}hlsl::contained_type(vector<element_type, element_count>){{\]\]}}
+// SAMPLECMP-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: CompoundStmt
+// SAMPLECMP-OFFSET-NEXT: ReturnStmt
+// SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
 // ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// OFFSET-SAME{LITERAL}: [[hlsl::contained_type(vector<element_type, element_count>)]]
-// OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// OFFSET-SAME: ' lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
-// 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: ParmVarDecl {{.*}} Clamp 'float'
-// OFFSET-NEXT: CompoundStmt
-// OFFSET-NEXT: ReturnStmt
-// OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::contained_type(vector<element_type, element_count>)]]
+// SAMPLECMP-OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmp 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>, float)'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Clamp 'float'
+// SAMPLECMP-OFFSET-NEXT: CompoundStmt
+// SAMPLECMP-OFFSET-NEXT: ReturnStmt
+// SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp' 'void (...) noexcept'
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
 // ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// OFFSET-SAME{LITERAL}: [[hlsl::contained_type(vector<element_type, element_count>)]]
-// OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// OFFSET-SAME: ' lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
-// OFFSET-NEXT: AlwaysInlineAttr
-
-// CHECK: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
-// 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 {{.*}} 'float' <Dependent>
-// CHECK-NEXT: CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// CHECK-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}hlsl::contained_type(vector<element_type, element_count>){{\]\]}}
-// CHECK-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// CHECK-SAME: ' lvalue .__handle
-// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
-// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// CHECK-NEXT: AlwaysInlineAttr
-
-// OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
-// 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 {{.*}} 'float' <Dependent>
-// OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
-// OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::contained_type(vector<element_type, element_count>)]]
+// SAMPLECMP-OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'Clamp' 'float'
+// SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-NEXT: CompoundStmt
+// SAMPLECMP-NEXT: ReturnStmt
+// SAMPLECMP-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME: {{\[\[}}hlsl::resource_class("SRV"){{\]\]}}[[IS_ARRAY]] {{\[\[}}hlsl::contained_type(vector<element_type, element_count>){{\]\]}}
+// SAMPLECMP-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
+// SAMPLECMP-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-SAME: ' lvalue .__handle
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-NEXT: AlwaysInlineAttr
+
+// SAMPLECMP-OFFSET: CXXMethodDecl {{.*}} SampleCmpLevelZero 'float (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// SAMPLECMP-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: CompoundStmt
+// SAMPLECMP-OFFSET-NEXT: ReturnStmt
+// SAMPLECMP-OFFSET-NEXT: CStyleCastExpr {{.*}} 'float' <Dependent>
+// SAMPLECMP-OFFSET-NEXT: CallExpr {{.*}} '<dependent type>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_sample_cmp_level_zero' 'void (...) noexcept'
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("SRV")]]
 // ARRAY-SAME{LITERAL}: [[hlsl::is_array]]
-// OFFSET-SAME{LITERAL}: [[hlsl::contained_type(vector<element_type, element_count>)]]
-// OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
-// OFFSET-SAME: ' lvalue .__handle
-// OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
-// OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// 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 {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
-// OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
-// OFFSET-NEXT: AlwaysInlineAttr
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::contained_type(vector<element_type, element_count>)]]
+// SAMPLECMP-OFFSET-SAME: {{\[\[}}hlsl::dimension("[[DIM_NAME]]"){{\]\]}}
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: CXXThisExpr {{.*}} 'hlsl::[[TEXTURE]]<vector<element_type, element_count>>' lvalue implicit this
+// SAMPLECMP-OFFSET-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
+// SAMPLECMP-OFFSET-SAME{LITERAL}: [[hlsl::resource_class("Sampler")]]
+// SAMPLECMP-OFFSET-SAME: ' lvalue .__handle
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'hlsl::SamplerComparisonState' lvalue ParmVar {{.*}} 'Sampler' 'hlsl::SamplerComparisonState'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// SAMPLECMP-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// SAMPLECMP-OFFSET-NEXT: AlwaysInlineAttr
 
 // CHECK: CXXMethodDecl {{.*}} CalculateLevelOfDetail 'float (hlsl::SamplerState, vector<float, [[DIM]]>)'
 // CHECK-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
@@ -658,287 +676,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, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} Gather 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherRed 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherGreen 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherBlue 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherAlpha 'vector<element_type, 4> (hlsl::SamplerState, vector<float, [[COORD_DIM]]>, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmp 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpRed 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 0
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpGreen 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 1
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER: CXXMethodDecl {{.*}} GatherCmpBlue 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float)' inline
+// GATHER-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2
+// GATHER-NEXT: AlwaysInlineAttr
+
+// GATHER-OFFSET: CXXMethodDecl {{.*}} GatherCmpAlpha 'vector<float, 4> (hlsl::SamplerComparisonState, vector<float, [[COORD_DIM]]>, float, vector<int, [[DIM]]>)' inline
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Sampler 'hlsl::SamplerComparisonState'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Location 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} CompareValue 'float'
+// GATHER-OFFSET-NEXT: ParmVarDecl {{.*}} Offset 'vector<int, [[DIM]]>'
+// 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 {{.*}} 'vector<float, [[COORD_DIM]]>' lvalue ParmVar {{.*}} 'Location' 'vector<float, [[COORD_DIM]]>'
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'float' lvalue ParmVar {{.*}} 'CompareValue' 'float'
+// GATHER-OFFSET-NEXT: IntegerLiteral {{.*}} 'unsigned int' 3
+// GATHER-OFFSET-NEXT: DeclRefExpr {{.*}} 'vector<int, [[DIM]]>' lvalue ParmVar {{.*}} 'Offset' 'vector<int, [[DIM]]>'
+// GATHER-OFFSET-NEXT: AlwaysInlineAttr
 
 TEXTURE<float4> t;
 SamplerState s;
@@ -949,11 +967,15 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleBias(s, loc, 0.0);
   t.SampleGrad(s, loc, (GRAD_TYPE)0, (GRAD_TYPE)0);
   t.SampleLevel(s, loc, 0.0);
+#ifdef HAS_SAMPLE_CMP
   t.SampleCmp(scs, loc, cmp);
   t.SampleCmpLevelZero(scs, loc, cmp);
+#endif
   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);
@@ -963,10 +985,12 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleGrad(s, loc, (GRAD_TYPE)0, (GRAD_TYPE)0, OFFSET_ARG);
   t.SampleGrad(s, loc, (GRAD_TYPE)0, (GRAD_TYPE)0, OFFSET_ARG, 1.0);
   t.SampleLevel(s, loc, 0.0, OFFSET_ARG);
+#ifdef HAS_SAMPLE_CMP
   t.SampleCmp(scs, loc, cmp, OFFSET_ARG);
   t.SampleCmp(scs, loc, cmp, OFFSET_ARG, 1.0f);
   t.SampleCmpLevelZero(scs, loc, cmp, OFFSET_ARG);
 #endif
+#endif
 
 #ifdef HAS_GETDIM_XY
   uint u_w, u_h, u_l;
diff --git a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
index 490575fc43807..a7815f2f130f6 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl
@@ -6,6 +6,12 @@
 // RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=Texture3D %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,DXIL \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3
+// RUN: %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 \
@@ -24,6 +30,12 @@
 // RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=1 -DDIM=2
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - -DLOD_TYPE=float3 \
+// RUN:   -DTEXTURE=Texture3D %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D --check-prefixes=CHECK,SPIRV \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3
+// RUN: %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 \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
index 26692a276287d..0c80f408afc3e 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Load.hlsl
@@ -28,6 +28,15 @@
 // RUN:   -DTEXTURE=Texture2DArray -D#LOAD_DIM=4 -DCOORD_DIM=3 \
 // RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=7 -DRW=0 -DENTRY_DIM=2 \
 // RUN:   -DDIM=2
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,DXIL,DXIL-SRV \
+// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DDXIL_TY=4 -DRW=0 \
+// RUN:   -DENTRY_DIM=2 -DDIM=3
 // RUN: %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 \
@@ -38,6 +47,16 @@
 // RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=1 -DSAMPLED=1 \
 // RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
 // RUN:   -DFORMAT25=0 -DSPV_DIM=1 -DENTRY_DIM=2 -DDIM=2
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 1, 1)" -DTEXTURE=Texture3D \
+// RUN:   -DLOAD_ARG="int4(loc, 0, 0)" -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,SRV,WIDE-LOC,SPIRV,SPIRV-SRV \
+// RUN:   -DTEXTURE=Texture3D -D#LOAD_DIM=4 -DCOORD_DIM=3 \
+// RUN:   -DCOORD_MASK="<i32 0, i32 1, i32 2>" -DARRAYED=0 -DSAMPLED=1 \
+// RUN:   -DFORMAT1=0 -DFORMAT3=0 -DFORMAT6=0 -DFORMAT21=0 -DFORMAT24=0 \
+// RUN:   -DFORMAT25=0 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3
 
 // RWTexture2D
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
@@ -64,6 +83,13 @@
 // 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: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,DXIL,DXIL-UAV \
+// RUN:   -DTEXTURE=RWTexture3D -D#LOAD_DIM=3 -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=1 \
+// RUN:   -DENTRY_DIM=2 -DDIM=3
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
 // RUN:   -DTEXTURE=RWTexture2DArray -DLOAD_ARG="int3(loc, 0)" -o - %s \
@@ -73,6 +99,14 @@
 // 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: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DENTRY_TYPE=int2 \
+// RUN:   -DTEXTURE=RWTexture3D -DLOAD_ARG="int3(loc, 0)" -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,UAV,WIDE-LOC,SPIRV,SPIRV-UAV \
+// RUN:   -DTEXTURE=RWTexture3D -D#LOAD_DIM=3 -DCOORD_DIM=3 -DARRAYED=0 \
+// RUN:   -DSAMPLED=2 -DFORMAT1=1 -DFORMAT3=3 -DFORMAT6=6 -DFORMAT21=21 \
+// RUN:   -DFORMAT24=24 -DFORMAT25=25 -DSPV_DIM=2 -DENTRY_DIM=2 -DDIM=3
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -267,7 +301,7 @@ int test_load_int(ENTRY_TYPE loc : LOC) {
 
 // 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)
+// SPIRV: %[[RES:.*]] = call i32 @llvm.spv.resource.load.level.i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT24]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
 // CHECK: ret i32 %[[RES]]
 
 #ifdef HAS_OFFSET
@@ -281,36 +315,36 @@ int test_load_offset_int(ENTRY_TYPE loc : LOC) {
 
 // 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> %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call i32 @llvm.spv.resource.load.level.i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT24]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
 // SRV: 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(int vector[[[ENTRY_DIM]]])
+// CHECK: %[[CALL:.*]] = call {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load(int vector[[[#LOAD_DIM]]])(ptr {{.*}} @t_int2, <[[#LOAD_DIM]] x i32> noundef %{{.*}})
+// CHECK: 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(int vector[[[#LOAD_DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]])
+// DXIL: %[[RES:.*]] = call <2 x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <2 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// SPIRV: %[[RES:.*]] = call <2 x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
+// CHECK: 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(int vector[[[ENTRY_DIM]]])
+// SRV: %[[CALL:.*]] = call {{.*}} <2 x i32> @hlsl::[[TEXTURE]]<int vector[2]>::Load(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} @t_int2, <[[#LOAD_DIM]] x i32> noundef %{{.*}}, <[[DIM]] x i32> noundef splat (i32 1))
+// SRV: 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(int vector[[[#LOAD_DIM]]], int vector[[[DIM]]])(ptr {{.*}} %[[THIS:.*]], <[[#LOAD_DIM]] x i32> {{.*}} %[[LOAD:.*]], <[[DIM]] x i32> {{.*}} %[[OFFSET:.*]])
+// DXIL-SRV: %[[RES:.*]] = call <2 x i32> @llvm.dx.resource.load.level.v2i32.tdx.Texture_v2i32_{{.*}}("dx.Texture", <2 x i32>, [[RW]], 0, 1, [[DXIL_TY]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call <2 x i32> @llvm.spv.resource.load.level.v2i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT25]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
+// SRV: ret <2 x i32> %[[RES]]
 
 TEXTURE<int3> t_int3;
 
@@ -323,7 +357,7 @@ int3 test_load_int3(ENTRY_TYPE loc : LOC) {
 
 // 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)
+// SPIRV: %[[RES:.*]] = call <3 x i32> @llvm.spv.resource.load.level.v3i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
 // CHECK: ret <3 x i32> %[[RES]]
 
 #ifdef HAS_OFFSET
@@ -337,7 +371,7 @@ int3 test_load_offset_int3(ENTRY_TYPE loc : LOC) {
 
 // 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> %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call <3 x i32> @llvm.spv.resource.load.level.v3i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], 0) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
 // SRV: ret <3 x i32> %[[RES]]
 
 TEXTURE<int4> t_int4;
@@ -351,7 +385,7 @@ int4 test_load_int4(ENTRY_TYPE loc : LOC) {
 
 // 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)
+// SPIRV: %[[RES:.*]] = call <4 x i32> @llvm.spv.resource.load.level.v4i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT21]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 {{[^,]*}}, <[[DIM]] x i32> zeroinitializer)
 // CHECK: ret <4 x i32> %[[RES]]
 
 #ifdef HAS_OFFSET
@@ -365,5 +399,5 @@ int4 test_load_offset_int4(ENTRY_TYPE loc : LOC) {
 
 // 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> %{{.*}})
+// SPIRV-SRV: %[[RES:.*]] = call <4 x i32> @llvm.spv.resource.load.level.v4i32.tspirv.SignedImage_i32_{{.*}}("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], 0, [[SAMPLED]], [[FORMAT21]]) %{{.*}}, <[[COORD_DIM]] x i32> %{{.*}}, i32 %{{.*}}, <[[DIM]] x i32> %{{.*}})
 // SRV: 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..7f258ec5b0c5f 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Mips.hlsl
@@ -2,14 +2,20 @@
 // 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:   | FileCheck %s --check-prefixes=CHECK,COORD2 -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_DIM=2 -DLOAD_DIM=3 -DDXIL_TY=2 -DDIM=2
 // 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:   | FileCheck %s --check-prefixes=CHECK,COORD3 -DTEXTURE=Texture2DArray \
 // RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=7 -DDIM=2
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -hlsl-entry test_mips \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_DIM=3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,COORD3 -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_DIM=3 -DLOAD_DIM=4 -DDXIL_TY=4 -DDIM=3
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
@@ -22,8 +28,9 @@
 //                      location)
 //
 // Check prefixes:
-//   NOARRAY            the resource has no array slice
-//   ARRAY              the resource has an array slice
+//   COORD2             the coordinate has two components
+//   COORD3             the coordinate has three components (an
+//                      array slice or a third resource dimension)
 
 TEXTURE<float4> t;
 
@@ -92,13 +99,13 @@ float4 test_mips(vector<float, COORD_DIM> loc : LOC) : SV_Target {
 // 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
+// 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
+// COORD2: %[[VECINITL:.*]] = insertelement <3 x i32> %[[VECINIT3]], i32 %[[LEVEL_VAL]], i32 2
+// COORD3: %[[VECINITL:.*]] = insertelement <4 x i32> %[[VECINIT3B]], i32 %[[LEVEL_VAL]], i32 3
 // CHECK: %[[COORD_X:.*]] = shufflevector <[[LOAD_DIM]] x i32> %[[VECINITL]], <[[LOAD_DIM]] x i32> poison, <[[COORD_DIM]] x i32> {{.*}}
 // 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)
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
index b3a85fdf63b19..a6a6add106d2b 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl
@@ -8,6 +8,14 @@
 // RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
@@ -31,6 +39,15 @@
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
index 0de7e40d58620..8760ae923544a 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl
@@ -8,6 +8,14 @@
 // RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
@@ -31,6 +39,15 @@
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
index 6d2de772e2beb..dd12d2750f8c0 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl
@@ -8,6 +8,14 @@
 // RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
@@ -31,6 +39,15 @@
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DGRAD_TYPE=float3 -DHAS_OFFSET \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
index 72bc867e5c9da..ca66af9c52056 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl
@@ -8,6 +8,14 @@
 // RUN:   -DDXIL_TY=2 -DRW=0 -DDIM=2 -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL,DXIL-TEXEL,CHECK-OFFSET,DXIL-OFFSET \
+// RUN:   -DDXIL_TY=4 -DRW=0 -DDIM=3 -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
@@ -29,6 +37,15 @@
 // RUN:   -DOFFSET_CONST="<i32 1, i32 2>"
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -o - \
+// RUN:   -DOFFSET_ARG="int3(1, 2, 3)" -DHAS_OFFSET -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV,SPIRV-TEXEL,CHECK-OFFSET,SPIRV-OFFSET \
+// RUN:   -DARRAYED=0 -DSAMPLED=1 -DIMG_FMT=0 -DSPV_DIM=2 -DDIM=3 \
+// RUN:   -DOFFSET_CONST="<i32 1, i32 2, i32 3>"
+// RUN: %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 \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
index 28c09fb820877..b098682e09e64 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-Subscript.hlsl
@@ -6,6 +6,14 @@
 // 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: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
+// RUN:   -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 -DRW=0
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
 // RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
@@ -14,6 +22,14 @@
 // 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: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
+// RUN:   -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
+// RUN:   -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=2
 // RUN: %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 \
@@ -54,6 +70,14 @@
 // RUN:   | FileCheck %s -DTEXTURE=RWTexture2D -DCOORD_DIM=2 \
 // RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
 // RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
+// RUN:   -DCOORD_TYPE=uint3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 -DROV_OR_COUNT=0 \
+// RUN:   -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4
 // RUN: %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 \
@@ -62,6 +86,14 @@
 // RUN:   | FileCheck %s -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: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
+// RUN:   -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
+// RUN:   -DCOORD_TYPE=uint3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=RWTexture3D -DCOORD_DIM=3 \
+// RUN:   --check-prefixes=CHECK,CHECK-STORE,SPIRV -DARRAYED=0 -DMS=0 \
+// RUN:   -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 -DFMT_INT3=0 -DSPV_DIM=2
 // RUN: %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 \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl b/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
index a0869ad668560..b2cd56e0a8959 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl
@@ -5,6 +5,12 @@
 // RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 -DDXIL_TY=2 -DRW=0 \
 // RUN:   --check-prefixes=CHECK,CHECK-TEXEL
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
 // RUN:   -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
@@ -23,6 +29,12 @@
 // RUN:   | FileCheck %s -DTEXTURE=Texture2D -DCOORD_DIM=2 -DARRAYED=0 \
 // RUN:   --check-prefixes=SPIRV,SPIRV-TEXEL -DSPV_DIM=1
 // RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
+// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 -DARRAYED=0 \
+// RUN:   --check-prefixes=SPIRV,SPIRV-TEXEL -DSPV_DIM=2
+// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
 // RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=TextureCube \
 // RUN:   -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
diff --git a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
index a271f0ff2ff94..41c71a7bf4d9a 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-default.hlsl
@@ -5,6 +5,11 @@
 // RUN:   --check-prefixes=CHECK,CHECK-TEXEL
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -std=hlsl202x -emit-llvm -disable-llvm-passes \
+// RUN:   -finclude-default-header -DTEXTURE=Texture3D -o - %s \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DDXIL_TY=4 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+// RUN: %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
diff --git a/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl b/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
index 4a037bafc452f..0210feff458e7 100644
--- a/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
+++ b/clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl
@@ -6,6 +6,12 @@
 // RUN:   --check-prefixes=CHECK,CHECK-TEXEL
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -o - %s \
+// RUN:   | llvm-cxxfilt \
+// RUN:   | FileCheck %s -DTEXTURE=Texture3D -DCOORD_DIM=3 -DDXIL_TY=4 -DRW=0 \
+// RUN:   --check-prefixes=CHECK,CHECK-TEXEL
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -emit-llvm -disable-llvm-passes \
 // RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -o - %s \
 // RUN:   | llvm-cxxfilt \
 // RUN:   | FileCheck %s -DTEXTURE=TextureCube -DCOORD_DIM=3 -DDXIL_TY=5 \
diff --git a/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl b/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
index 0b31f4beceb1a..dbaab1b9f8e64 100644
--- a/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl
@@ -2,6 +2,9 @@
 // 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 \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,dim3 \
+// RUN:   -DTEXTURE=Texture3D -DLOD_TYPE=float3 %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
 // RUN:   -finclude-default-header -fsyntax-only -verify=expected,dim2 \
 // RUN:   -DTEXTURE=Texture2DArray -DLOD_TYPE=float2 %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
diff --git a/clang/test/SemaHLSL/Resources/Textures-Load-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-Load-errors.hlsl
index 3a13b1d1e13ff..1d8fae8f1ebe4 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Load-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Load-errors.hlsl
@@ -9,6 +9,11 @@
 // RUN:   -DOFFSET_TYPE=int2 -DOFFSET_FLOAT_TYPE=float2 \
 // RUN:   -DWIDE_OFFSET_TYPE=int3 -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=Texture3D -DHAS_OFFSET \
+// RUN:   -DLOAD_TYPE=int4 -DLOAD_FLOAT_TYPE=float4 -DNARROW_LOAD_TYPE=int3 \
+// RUN:   -DOFFSET_TYPE=int3 -DOFFSET_FLOAT_TYPE=float3 \
+// RUN:   -DWIDE_OFFSET_TYPE=int4 -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2D -DLOAD_TYPE=int2 \
 // RUN:   -DLOAD_FLOAT_TYPE=float2 -DNARROW_LOAD_TYPE=int1 \
 // RUN:   -DWIDE_LOAD_TYPE=int3 -DOFFSET_TYPE=int2 -verify %s
@@ -16,6 +21,10 @@
 // RUN:   -finclude-default-header -DTEXTURE=RWTexture2DArray -DLOAD_TYPE=int3 \
 // RUN:   -DLOAD_FLOAT_TYPE=float3 -DNARROW_LOAD_TYPE=int2 \
 // RUN:   -DWIDE_LOAD_TYPE=int4 -DOFFSET_TYPE=int2 -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DLOAD_TYPE=int3 \
+// RUN:   -DLOAD_FLOAT_TYPE=float3 -DNARROW_LOAD_TYPE=int2 \
+// RUN:   -DWIDE_LOAD_TYPE=int4 -DOFFSET_TYPE=int3 -verify %s
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
index 1b141cf052ac5..f7ebbafc19df0 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl
@@ -3,6 +3,10 @@
 // RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int2 -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim3 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int3 -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %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=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
index 9ef77e5723988..649fbb3d27897 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl
@@ -3,6 +3,10 @@
 // RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int2 -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim3 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int3 -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 %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=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 %s
diff --git a/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl b/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
index 1713cc1ea0529..594e101740f67 100644
--- a/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl
@@ -3,6 +3,10 @@
 // RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int2 -DTEXTURE=Texture2D \
 // RUN:   -DCOORD_TYPE=float2 %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
+// RUN:   -finclude-default-header -fsyntax-only -verify=expected,offset,dim3 \
+// RUN:   -DHAS_OFFSET -DOFFSET_TYPE=int3 -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %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=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s
diff --git a/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl b/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl
index 5b01281efe00d..8ea48f8dc2872 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Sema.hlsl
@@ -3,6 +3,10 @@
 // RUN:   -DHAS_OFFSET -DOFFSET_ARG="int2(1, 2)" -DTEXTURE=Texture2D \
 // 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,dim3 \
+// RUN:   -DHAS_OFFSET -DOFFSET_ARG="int3(1, 2, 3)" -DTEXTURE=Texture3D \
+// RUN:   -DCOORD_TYPE=float3 %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=Texture2DArray \
 // RUN:   -DCOORD_TYPE=float3 %s
@@ -66,8 +70,9 @@ 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'}}
   // dim2-note@*:* {{candidate function not viable: no known conversion from 'SamplerState' to 'vector<int, 2>' (vector of 2 'int' values) for 3rd argument}}
+  // dim3-note@*:* {{candidate function not viable: no known conversion from 'SamplerState' to 'vector<int, 3>' (vector of 3 'int' values) for 3rd argument}}
   // expected-note@*:* {{candidate function not viable: requires 2 arguments, but 3 were provided}}
   // expected-note@*:* {{candidate function not viable: requires 4 arguments, but 3 were provided}}
   t.Sample(s, loc, s);
diff --git a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
index 4eea4ea142713..e1e55497af1fa 100644
--- a/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-Subscript.hlsl
@@ -8,6 +8,11 @@
 // RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
 // RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify -o - %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=Texture3D -DINDEX_TYPE=uint3 \
+// RUN:   -DINDEX_ARG="uint3(1, 2, 0)" -DWIDE_INDEX_TYPE=int4 \
+// RUN:   -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" -DNARROW_INDEX_TYPE=uint2 \
+// RUN:   -DNARROW_INDEX_ARG="uint2(1, 2)" -verify -o - %s
+// RUN: %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
@@ -17,6 +22,12 @@
 // 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: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
+// RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
+// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" -verify \
+// RUN:   -o - %s
 // RUN: %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 \
@@ -27,6 +38,12 @@
 // 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: %clang_cc1 -triple spirv-vulkan-library -x hlsl \
+// RUN:   -finclude-default-header -DTEXTURE=RWTexture3D -DHAS_STORE \
+// RUN:   -DINDEX_TYPE=uint3 -DINDEX_ARG="uint3(1, 2, 0)" \
+// RUN:   -DWIDE_INDEX_TYPE=int4 -DWIDE_INDEX_ARG="int4(1, 2, 3, 4)" \
+// RUN:   -DNARROW_INDEX_TYPE=uint2 -DNARROW_INDEX_ARG="uint2(1, 2)" -verify \
+// RUN:   -o - %s
 
 // Parameterized over the texture types in the RUN lines above; adding a texture
 // of another dimension only requires new RUN lines.
diff --git a/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl b/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
index 9811202570310..fc4a6555759ca 100644
--- a/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl
@@ -24,6 +24,10 @@ TextureCube<float> TexCube;
 TextureCube<float2> TexCubeVec;
 TextureCubeArray<float> TexCubeArray;
 TextureCubeArray<float2> TexCubeArrayVec;
+Texture3D<float> Tex3D;
+Texture3D<float2> Tex3DVec;
+RWTexture3D<float> RWTex3D;
+RWTexture3D<float2> RWTex3DVec;
 #else
 Texture2D<float2> Tex2DVec;
 Texture2D<float> Tex2D;
@@ -37,6 +41,10 @@ TextureCube<float2> TexCubeVec;
 TextureCube<float> TexCube;
 TextureCubeArray<float2> TexCubeArrayVec;
 TextureCubeArray<float> TexCubeArray;
+Texture3D<float2> Tex3DVec;
+Texture3D<float> Tex3D;
+RWTexture3D<float2> RWTex3DVec;
+RWTexture3D<float> RWTex3D;
 #endif
 
 SamplerState Samp;
@@ -59,4 +67,9 @@ export void useTextures(float2 UV, float3 UVW, float4 UVWA) {
 
   float CAS = TexCubeArray.Sample(Samp, UVWA);
   float2 CAV = TexCubeArrayVec.Sample(Samp, UVWA);
+
+  float VS = Tex3D.Sample(Samp, UVW);
+  float2 VV = Tex3DVec.Sample(Samp, UVW);
+  RWTex3D[uint3(0, 0, 0)] = VS;
+  RWTex3DVec[uint3(0, 0, 0)] = VV;
 }
diff --git a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
index 3f5ecf264938f..e89d9b9331f65 100644
--- a/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl
@@ -3,12 +3,18 @@
 // RUN:   -DTEXTURE=Texture2D -DINDEX_TYPE=int2 -DHAS_MIPS -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=Texture3D -DINDEX_TYPE=int3 -DHAS_MIPS -verify %s
+// RUN: %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=RWTexture2D -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -emit-llvm-only -disable-llvm-passes -finclude-default-header \
+// RUN:   -DTEXTURE=RWTexture3D -verify %s
+// RUN: %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 \
diff --git a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
index d2c62b9d5a082..518079a22cea4 100644
--- a/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
+++ b/clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl
@@ -2,15 +2,22 @@
 // RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2D \
 // RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture3D \
+// RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float3 -DOFFSET_TYPE=int3 -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
 // RUN:   -finclude-default-header -DHAS_TEXEL -DTEXTURE=RWTexture2DArray \
 // RUN:   -DCOORD_TYPE=float3 -DGRAD_TYPE=float2 -DOFFSET_TYPE=int2 -verify %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_GATHER -DHAS_LOD \
+// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_SAMPLE_CMP -DHAS_GATHER -DHAS_LOD \
 // RUN:   -DLOAD_ARG="int4(0, 0, 0, 0)" -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=TextureCube -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 -verify \
 // RUN:   %s
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
-// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_GATHER -DHAS_LOD \
+// RUN:   -finclude-default-header -DHAS_TEXEL -DHAS_SAMPLE -DHAS_LOD \
+// RUN:   -DTEXTURE=Texture3D -DCOORD_TYPE=float3 -DOFFSET_TYPE=int3 \
+// RUN:   -DGRAD_TYPE=float3 -verify %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl \
+// RUN:   -finclude-default-header -DHAS_SAMPLE -DHAS_SAMPLE_CMP -DHAS_GATHER -DHAS_LOD \
 // RUN:   -DLOAD_ARG="int4(0, 0, 0, 0)" -DINDEX_ARG="uint3(0, 0, 0)" \
 // RUN:   -DTEXTURE=TextureCubeArray -DCOORD_TYPE=float4 -DOFFSET_TYPE=int3 \
 // RUN:   -verify %s
@@ -28,6 +35,8 @@
 //                      dimension
 //   OFFSET_TYPE        offset type, one component per resource dimension
 //   HAS_SAMPLE         defined for types that have the Sample* methods
+//   HAS_SAMPLE_CMP     defined for types that have the comparison sampling
+//                      methods
 //   HAS_GATHER         defined for types that have the Gather* methods
 //   HAS_LOD            defined for types that have CalculateLevelOfDetail*
 //
@@ -50,6 +59,9 @@ void main(COORD_TYPE uv) {
   Tex.SampleBias(Samp, uv, 0.0f);
   // expected-error-re at +1 {{no member named 'SampleGrad' in 'hlsl::{{.*}}Texture}}
   Tex.SampleGrad(Samp, uv, (GRAD_TYPE)0, (GRAD_TYPE)0);
+#endif
+
+#ifndef HAS_SAMPLE_CMP
   // expected-error-re at +1 {{no member named 'SampleCmp' in 'hlsl::{{.*}}Texture}}
   Tex.SampleCmp(SampCmp, uv, compare);
   // expected-error-re at +1 {{no member named 'SampleCmpLevelZero' in 'hlsl::{{.*}}Texture}}

>From a516d4c004d07ded869a59b8101a88fda338e74c Mon Sep 17 00:00:00 2001
From: "Deric C." <cheung.deric at gmail.com>
Date: Wed, 9 Sep 2026 14:09:53 -0700
Subject: [PATCH 2/2] add comments to #endif

Co-authored-by: Finn Plummer <mail at inbelic.dev>
---
 clang/test/AST/HLSL/Textures-scalar-AST.hlsl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
index a9dbe6b2d11eb..1335863aa9d8b 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -989,8 +989,8 @@ void main(COORD_TYPE loc, float cmp) {
   t.SampleCmp(scs, loc, cmp, OFFSET_ARG);
   t.SampleCmp(scs, loc, cmp, OFFSET_ARG, 1.0f);
   t.SampleCmpLevelZero(scs, loc, cmp, OFFSET_ARG);
-#endif
-#endif
+#endif // HAS_SAMPLE_CMP
+#endif // HAS_OFFSET
 
 #ifdef HAS_GETDIM_XY
   uint u_w, u_h, u_l;



More information about the cfe-commits mailing list