blob: 7dd765da8104ad20e6ee0cbc7f674cc6ab3633ef [file] [edit]
// Texture1D
// Texture1D
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
// RUN: -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
// RUN: --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
// RUN: -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 -DRW=0 -DINDEX_LLVM=i32 \
// RUN: -DINDEX_CXX_U="unsigned int"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1D -DCOORD_TYPE=uint \
// RUN: -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture1D \
// RUN: --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
// RUN: -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=0 \
// RUN: -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int"
// Texture1DArray
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1DArray \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=Texture1DArray --check-prefixes=CHECK,DXIL \
// RUN: -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=6 -DRW=0 \
// RUN: -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture1DArray \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=Texture1DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
// RUN: -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 \
// RUN: -DSPV_DIM=0 -DINDEX_LLVM="<2 x i32>" \
// RUN: -DINDEX_CXX_U="unsigned int vector[2]"
// Texture2D
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
// RUN: -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture2D \
// RUN: --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
// RUN: -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 -DRW=0 -DINDEX_LLVM="<2 x i32>" \
// RUN: -DINDEX_CXX_U="unsigned int vector[2]"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2D -DCOORD_TYPE=uint2 \
// RUN: -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture2D \
// RUN: --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
// RUN: -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=1 \
// RUN: -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
// Texture2DArray
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DArray \
// RUN: -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=Texture2DArray --check-prefixes=CHECK,DXIL \
// RUN: -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 -DRW=0 \
// RUN: -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DArray \
// RUN: -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=Texture2DArray --check-prefixes=CHECK,SPIRV -DARRAYED=1 \
// RUN: -DMS=0 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 \
// RUN: -DSPV_DIM=1 -DINDEX_LLVM="<3 x i32>" \
// RUN: -DINDEX_CXX_U="unsigned int vector[3]"
// Texture2DMS
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DMS \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=Texture2DMS --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
// RUN: -DDXIL_HANDLE=dx.MSTexture -DDXIL_TY=3 -DRW=0 \
// RUN: -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture2DMS \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=Texture2DMS --check-prefixes=CHECK,SPIRV -DARRAYED=0 \
// RUN: -DMS=1 -DSAMPLED=1 -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 \
// RUN: -DSPV_DIM=1 -DINDEX_LLVM="<2 x i32>" \
// RUN: -DINDEX_CXX_U="unsigned int vector[2]"
// Texture3D
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
// RUN: -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture3D \
// RUN: --check-prefixes=CHECK,DXIL -DROV_OR_COUNT=0 \
// RUN: -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 -DRW=0 \
// RUN: -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DREG0=t0 -DREG1=t1 -DREG2=t2 -DTEXTURE=Texture3D -DCOORD_TYPE=uint3 \
// RUN: -o - %s | llvm-cxxfilt | FileCheck %s -DTEXTURE=Texture3D \
// RUN: --check-prefixes=CHECK,SPIRV -DARRAYED=0 -DMS=0 -DSAMPLED=1 \
// RUN: -DFMT_FLOAT4=0 -DFMT_FLOAT=0 -DFMT_INT3=0 -DSPV_DIM=2 \
// RUN: -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
// RWTexture1D
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1D \
// RUN: -DCOORD_TYPE=uint -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture1D --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 \
// RUN: -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=1 \
// RUN: -DINDEX_LLVM=i32 -DINDEX_CXX_U="unsigned int"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1D \
// RUN: -DCOORD_TYPE=uint -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture1D --check-prefixes=CHECK,CHECK-STORE,SPIRV \
// RUN: -DARRAYED=0 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
// RUN: -DFMT_INT3=0 -DSPV_DIM=0 -DINDEX_LLVM=i32 \
// RUN: -DINDEX_CXX_U="unsigned int"
// RWTexture1DArray
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1DArray \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture1DArray --check-prefixes=CHECK,CHECK-STORE,DXIL \
// RUN: -DRW=1 -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=6 \
// RUN: -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture1DArray \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture1DArray --check-prefixes=CHECK,CHECK-STORE,SPIRV \
// RUN: -DARRAYED=1 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
// RUN: -DFMT_INT3=0 -DSPV_DIM=0 -DINDEX_LLVM="<2 x i32>" \
// RUN: -DINDEX_CXX_U="unsigned int vector[2]"
// RWTexture2D
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture2D --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 \
// RUN: -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=2 \
// RUN: -DINDEX_LLVM="<2 x i32>" -DINDEX_CXX_U="unsigned int vector[2]"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2D \
// RUN: -DCOORD_TYPE=uint2 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture2D --check-prefixes=CHECK,CHECK-STORE,SPIRV \
// RUN: -DARRAYED=0 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
// RUN: -DFMT_INT3=0 -DSPV_DIM=1 -DINDEX_LLVM="<2 x i32>" \
// RUN: -DINDEX_CXX_U="unsigned int vector[2]"
// RWTexture2DArray
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
// RUN: -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture2DArray --check-prefixes=CHECK,CHECK-STORE,DXIL \
// RUN: -DRW=1 -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=7 \
// RUN: -DINDEX_LLVM="<3 x i32>" -DINDEX_CXX_U="unsigned int vector[3]"
// RUN: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture2DArray \
// RUN: -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture2DArray --check-prefixes=CHECK,CHECK-STORE,SPIRV \
// RUN: -DARRAYED=1 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
// RUN: -DFMT_INT3=0 -DSPV_DIM=1 -DINDEX_LLVM="<3 x i32>" \
// RUN: -DINDEX_CXX_U="unsigned int vector[3]"
// RWTexture3D
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -emit-llvm \
// RUN: -disable-llvm-passes -finclude-default-header -Wno-sign-conversion \
// RUN: -DHAS_STORE -DREG0=u0 -DREG1=u1 -DREG2=u2 -DTEXTURE=RWTexture3D \
// RUN: -DCOORD_TYPE=uint3 -o - %s | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture3D --check-prefixes=CHECK,CHECK-STORE,DXIL -DRW=1 \
// RUN: -DROV_OR_COUNT=0 -DDXIL_HANDLE=dx.Texture -DDXIL_TY=4 \
// RUN: -DINDEX_CXX_U="unsigned int vector[3]" -DINDEX_LLVM="<3 x i32>"
// 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 | llvm-cxxfilt | FileCheck %s \
// RUN: -DTEXTURE=RWTexture3D --check-prefixes=CHECK,CHECK-STORE,SPIRV \
// RUN: -DARRAYED=0 -DMS=0 -DSAMPLED=2 -DFMT_FLOAT4=1 -DFMT_FLOAT=3 \
// RUN: -DFMT_INT3=0 -DSPV_DIM=2 -DINDEX_CXX_U="unsigned int vector[3]" \
// RUN: -DINDEX_LLVM="<3 x i32>"
// Parameterized over the texture types in the RUN lines above; adding a texture
// of another dimension only requires new RUN lines.
//
// REG0 register binding for Tex (t# for read-only, u# for
// writable)
// REG1 register binding for Tex2
// REG2 register binding for Tex3
// TEXTURE resource type name
// INDEX_CXX_U operator[] index type in the C++ signature
// INDEX_LLVM operator[] index type in the IR
// COORD_TYPE sample location type (DIM components plus the array
// slice)
// ROV_OR_COUNT the overloaded second dx handle operand: IsROV for
// dx.Texture, the sample count for dx.MSTexture
// DXIL_HANDLE DXIL resource handle type (dx.Texture or dx.MSTexture)
// DXIL_TY dx.Texture resource-kind operand
// RW dx.Texture UAV operand
// ARRAYED spirv.Image Arrayed operand
// MS spirv.Image MS (multisampled) operand
// SAMPLED spirv.Image Sampled operand
// FMT_FLOAT4 spirv.Image Image Format for the float4 texture;
// uniform for sampled images but per-element for storage
// images
// FMT_FLOAT spirv.Image Image Format for the float texture
// FMT_INT3 spirv.Image Image Format for the int3 texture
// SPV_DIM spirv.Image Dim operand
// HAS_STORE defined for writable (UAV) textures, which can
// additionally store through operator[]
//
// Check prefixes:
// STORE storing through operator[]
//
// Texture2DMS reuses the same operator[] codegen; only the resource handle type
// differs (dx.MSTexture / a multisampled spirv.Image). It reads sample 0.
// ROV_OR_COUNT is the overloaded second int operand of the DXIL handle type:
// IsROV for dx.Texture, the sample count for dx.MSTexture. It is 0 for every
// texture below (none are ROVs, and Texture2DMS<T> defaults to a runtime
// sample count), but a ROV or an explicit Texture2DMS<T, N> would need its own
// value here.
TEXTURE<float4> Tex : register(REG0);
TEXTURE<float> Tex2 : register(REG1);
TEXTURE<int3> Tex3 : register(REG2);
[numthreads(1,1,1)]
void main(COORD_TYPE DTid : SV_DispatchThreadID) {
// Every texture type can read through the subscript.
float4 val = Tex[DTid];
float val2 = Tex2[DTid];
int3 val3 = Tex3[DTid];
#ifdef HAS_STORE
// A writable texture can also store through it.
Tex[DTid] = float4(1, 2, 3, 4);
Tex[DTid].y = 5.0;
Tex2[DTid] = 6.0;
Tex3[DTid] = int3(7, 8, 9);
#endif
}
// CHECK: define hidden {{.*}}void @main([[INDEX_CXX_U]])([[INDEX_LLVM]] noundef %[[DTID:.*]])
// CHECK: %[[DTID_ADDR:.*]] = alloca [[INDEX_LLVM]]
// CHECK: %[[VAL:.*]] = alloca <4 x float>
// CHECK: %[[VAL2:.*]] = alloca float
// CHECK: %[[VAL3:.*]] = alloca <3 x i32>
// CHECK: store [[INDEX_LLVM]] %[[DTID]], ptr %[[DTID_ADDR]]
// CHECK: %[[DTID_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
// CHECK: %[[CALL1:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex, [[INDEX_LLVM]] noundef %[[DTID_VAL]])
// CHECK: %[[LOAD_VAL:.*]] = load <4 x float>, ptr{{.*}} %[[CALL1]]
// CHECK: store <4 x float> %[[LOAD_VAL]], ptr %[[VAL]]
// CHECK: %[[DTID_VAL2:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
// CHECK: %[[CALL2:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex2, [[INDEX_LLVM]] noundef %[[DTID_VAL2]])
// CHECK: %[[LOAD_VAL2:.*]] = load float, ptr{{.*}} %[[CALL2]]
// CHECK: store float %[[LOAD_VAL2]], ptr %[[VAL2]]
// CHECK: %[[DTID_VAL3:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
// CHECK: %[[CALL3:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @Tex3, [[INDEX_LLVM]] noundef %[[DTID_VAL3]])
// CHECK: %[[LOAD_VAL3:.*]] = load <3 x i32>, ptr{{.*}} %[[CALL3]]
// CHECK: store <3 x i32> %[[LOAD_VAL3]], ptr %[[VAL3]]
// Store a whole texel.
// CHECK-STORE: %[[DTID_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
// CHECK-STORE: %[[CALL1:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex, [[INDEX_LLVM]] noundef %[[DTID_VAL]])
// CHECK-STORE: store <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>, ptr{{.*}} %[[CALL1]]
// Store a single component: a GEP off the texel pointer, which the DXIL
// backend later expands into a read-modify-write of the whole texel.
// CHECK-STORE: %[[DTID_VAL2:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
// CHECK-STORE: %[[CALL2:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex, [[INDEX_LLVM]] noundef %[[DTID_VAL2]])
// CHECK-STORE: %[[ELEM:.*]] = getelementptr <4 x float>, ptr{{.*}} %[[CALL2]], i32 0, i32 1
// CHECK-STORE: store float 5.000000e+00, ptr{{.*}} %[[ELEM]]
// Store to a scalar texture.
// CHECK-STORE: %[[DTID_VAL3:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
// CHECK-STORE: %[[CALL3:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex2, [[INDEX_LLVM]] noundef %[[DTID_VAL3]])
// CHECK-STORE: store float 6.000000e+00, ptr{{.*}} %[[CALL3]]
// Store to an integer texture.
// CHECK-STORE: %[[DTID_VAL4:.*]] = load [[INDEX_LLVM]], ptr %[[DTID_ADDR]]
// CHECK-STORE: %[[CALL4:.*]] = call {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr {{.*}} @Tex3, [[INDEX_LLVM]] noundef %[[DTID_VAL4]])
// CHECK-STORE: store <3 x i32> <i32 7, i32 8, i32 9>, ptr{{.*}} %[[CALL4]]
// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float vector[4]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[INDEX:.*]])
// CHECK: %[[THIS_ADDR:.*]] = alloca ptr
// CHECK: %[[INDEX_ADDR:.*]] = alloca [[INDEX_LLVM]]
// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
// CHECK: store [[INDEX_LLVM]] %[[INDEX]], ptr %[[INDEX_ADDR]]
// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]]
// CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]]", ptr %[[THIS1]], i32 0, i32 0
// DXIL: %[[HANDLE:.*]] = load target("[[DXIL_HANDLE]]", <4 x float>, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
// SPIRV: %[[HANDLE:.*]] = load target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT4]]), ptr %[[HANDLE_PTR]]
// CHECK: %[[INDEX_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[INDEX_ADDR]]
// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", <4 x float>, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT4]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
// CHECK: ret ptr {{.*}}%[[PTR]]
// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<float{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[INDEX:.*]])
// CHECK: %[[THIS_ADDR:.*]] = alloca ptr
// CHECK: %[[INDEX_ADDR:.*]] = alloca [[INDEX_LLVM]]
// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
// CHECK: store [[INDEX_LLVM]] %[[INDEX]], ptr %[[INDEX_ADDR]]
// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]]
// CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]].0", ptr %[[THIS1]], i32 0, i32 0
// DXIL: %[[HANDLE:.*]] = load target("[[DXIL_HANDLE]]", float, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
// SPIRV: %[[HANDLE:.*]] = load target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT]]), ptr %[[HANDLE_PTR]]
// CHECK: %[[INDEX_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[INDEX_ADDR]]
// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", float, [[RW]], [[ROV_OR_COUNT]], 0, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.Image", float, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_FLOAT]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
// CHECK: ret ptr {{.*}}%[[PTR]]
// CHECK: define linkonce_odr hidden {{(spir_func )?}}noundef {{.*}}ptr{{.*}} @hlsl::[[TEXTURE]]<int vector[3]{{(, [0-9]+)?}}>::operator[]([[INDEX_CXX_U]]) const(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[THIS:.*]], [[INDEX_LLVM]] noundef %[[INDEX:.*]])
// CHECK: %[[THIS_ADDR:.*]] = alloca ptr
// CHECK: %[[INDEX_ADDR:.*]] = alloca [[INDEX_LLVM]]
// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]]
// CHECK: store [[INDEX_LLVM]] %[[INDEX]], ptr %[[INDEX_ADDR]]
// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]]
// CHECK: %[[HANDLE_PTR:.*]] = getelementptr {{.*}} %"class.hlsl::[[TEXTURE]].1", ptr %[[THIS1]], i32 0, i32 0
// DXIL: %[[HANDLE:.*]] = load target("[[DXIL_HANDLE]]", <3 x i32>, [[RW]], [[ROV_OR_COUNT]], 1, [[DXIL_TY]]), ptr %[[HANDLE_PTR]]
// SPIRV: %[[HANDLE:.*]] = load target("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_INT3]]), ptr %[[HANDLE_PTR]]
// CHECK: %[[INDEX_VAL:.*]] = load [[INDEX_LLVM]], ptr %[[INDEX_ADDR]]
// DXIL: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.{{.*}}(target("[[DXIL_HANDLE]]", <3 x i32>, [[RW]], [[ROV_OR_COUNT]], 1, [[DXIL_TY]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
// SPIRV: %[[PTR:.*]] = call ptr addrspace(11) @llvm.spv.resource.getpointer.p11.{{.*}}(target("spirv.SignedImage", i32, [[SPV_DIM]], 2, [[ARRAYED]], [[MS]], [[SAMPLED]], [[FMT_INT3]]) %[[HANDLE]], [[INDEX_LLVM]] %[[INDEX_VAL]])
// CHECK: ret ptr {{.*}}%[[PTR]]