[tint] Always clamp sample index for textureLoad

Even APIs that provide texture robustness produce undefined values
when the sample index is OOB, so unconditionally clamp it.

Fixed: 574212789
Change-Id: I3956bc778b404707a8f37b2325e5fd3dc412db45
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/351495
SLSA-Policy-Verified: SLSA Policy Verification Service <devtools-gerritcodereview-exitgate@google.com>
Reviewed-by: Alan Baker <alanbaker@google.com>
Commit-Queue: Alan Baker <alanbaker@google.com>
diff --git a/src/tint/lang/core/ir/transform/robustness.cc b/src/tint/lang/core/ir/transform/robustness.cc
index fe13bbc..0984ccf 100644
--- a/src/tint/lang/core/ir/transform/robustness.cc
+++ b/src/tint/lang/core/ir/transform/robustness.cc
@@ -104,11 +104,9 @@
                 },
                 [&](ir::CoreBuiltinCall* call) {
                     // Check if this is a texture builtin that needs to be clamped.
-                    if (config.clamp_texture) {
-                        if (call->Func() == core::BuiltinFn::kTextureDimensions ||
-                            call->Func() == core::BuiltinFn::kTextureLoad) {
-                            texture_calls.Push(call);
-                        }
+                    if (call->Func() == core::BuiltinFn::kTextureDimensions ||
+                        call->Func() == core::BuiltinFn::kTextureLoad) {
+                        texture_calls.Push(call);
                     }
                     // Check if this is a subgroup matrix builtin that needs to be clamped.
                     if (call->Func() == core::BuiltinFn::kSubgroupMatrixLoad ||
@@ -400,7 +398,7 @@
         // Select which arguments to clamp based on the function overload.
         switch (call->Func()) {
             case core::BuiltinFn::kTextureDimensions: {
-                if (args.size() > 1) {
+                if (config.clamp_texture && args.size() > 1) {
                     clamp_level(1u);
                 }
                 break;
@@ -408,16 +406,26 @@
             case core::BuiltinFn::kTextureLoad: {
                 uint32_t next_arg = 2u;
                 if (core::type::IsTextureArray(texture->Dim())) {
-                    clamp_array_index(next_arg++);
+                    if (config.clamp_texture) {
+                        clamp_array_index(next_arg);
+                    }
+                    next_arg++;
                 }
                 if (texture->IsAnyOf<core::type::SampledTexture, core::type::DepthTexture>()) {
-                    clamp_level(next_arg++);
+                    if (config.clamp_texture) {
+                        clamp_level(next_arg);
+                    }
+                    next_arg++;
                 }
                 if (texture->IsAnyOf<core::type::MultisampledTexture,
                                      core::type::DepthMultisampledTexture>()) {
+                    // Always clamp the sample index, even when `clamp_texture` is false, as
+                    // underlying APIs do not guarantee robustness for out-of-bounds sample indices.
                     clamp_sample_index(next_arg++);
                 }
-                clamp_coords(1u);  // Must run after clamp_level
+                if (config.clamp_texture) {
+                    clamp_coords(1u);  // Must run after clamp_level
+                }
                 break;
             }
             default:
diff --git a/src/tint/lang/core/ir/transform/robustness.h b/src/tint/lang/core/ir/transform/robustness.h
index c065c7a..35cc04e 100644
--- a/src/tint/lang/core/ir/transform/robustness.h
+++ b/src/tint/lang/core/ir/transform/robustness.h
@@ -44,6 +44,8 @@
 /// Configuration options that control when to clamp accesses.
 struct RobustnessConfig {
     /// Should texture accesses be clamped?
+    /// Note that the `sample_index` parameter of `textureLoad` will still be clamped if clamping is
+    /// disabled.
     bool clamp_texture = true;
 
     /// Should accesses to pointers with the 'immediate' address space be clamped?
diff --git a/src/tint/lang/core/ir/transform/robustness_test.cc b/src/tint/lang/core/ir/transform/robustness_test.cc
index 992bd97..cf19829 100644
--- a/src/tint/lang/core/ir/transform/robustness_test.cc
+++ b/src/tint/lang/core/ir/transform/robustness_test.cc
@@ -2371,11 +2371,39 @@
 }
 )";
 
+    auto* expect_sample_index_only = R"(
+$B1: {  # root
+  %texture:ptr<handle, texture_multisampled_2d<f32>, read> = var @binding_point(0, 0)
+}
+
+%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> {
+  $B2: {
+    %5:texture_multisampled_2d<f32> = load %texture
+    %6:u32 = textureNumSamples %5
+    %7:u32 = sub %6, 1u
+    %8:u32 = convert %level
+    %9:u32 = min %8, %7
+    %10:vec4<f32> = textureLoad %5, %coords, %9
+    ret %10
+  }
+}
+%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
+    %14:texture_multisampled_2d<f32> = load %texture
+    %15:u32 = textureNumSamples %14
+    %16:u32 = sub %15, 1u
+    %17:u32 = min %level_1, %16
+    %18:vec4<f32> = textureLoad %14, %coords_1, %17
+    ret %18
+  }
+}
+)";
+
     RobustnessConfig cfg;
     cfg.clamp_texture = GetParam().enabled;
     Run(Robustness, cfg);
 
-    EXPECT_EQ(GetParam().enabled ? expect : src, str());
+    EXPECT_EQ(GetParam().enabled ? expect : expect_sample_index_only, str());
 }
 
 TEST_P(IR_BindingVariableRobustnessTest, TextureLoad_Depth2D) {
@@ -2665,11 +2693,39 @@
 }
 )";
 
+    auto* expect_sample_index_only = R"(
+$B1: {  # root
+  %texture:ptr<handle, texture_depth_multisampled_2d, read> = var @binding_point(0, 0)
+}
+
+%load_signed = func(%coords:vec2<i32>, %index:i32):f32 {
+  $B2: {
+    %5:texture_depth_multisampled_2d = load %texture
+    %6:u32 = textureNumSamples %5
+    %7:u32 = sub %6, 1u
+    %8:u32 = convert %index
+    %9:u32 = min %8, %7
+    %10:f32 = textureLoad %5, %coords, %9
+    ret %10
+  }
+}
+%load_unsigned = func(%coords_1:vec2<u32>, %index_1:u32):f32 {  # %coords_1: 'coords', %index_1: 'index'
+  $B3: {
+    %14:texture_depth_multisampled_2d = load %texture
+    %15:u32 = textureNumSamples %14
+    %16:u32 = sub %15, 1u
+    %17:u32 = min %index_1, %16
+    %18:f32 = textureLoad %14, %coords_1, %17
+    ret %18
+  }
+}
+)";
+
     RobustnessConfig cfg;
     cfg.clamp_texture = GetParam().enabled;
     Run(Robustness, cfg);
 
-    EXPECT_EQ(GetParam().enabled ? expect : src, str());
+    EXPECT_EQ(GetParam().enabled ? expect : expect_sample_index_only, str());
 }
 
 TEST_P(IR_BindingVariableRobustnessTest, TextureLoad_External) {
diff --git a/src/tint/lang/hlsl/writer/builtin_test.cc b/src/tint/lang/hlsl/writer/builtin_test.cc
index 1df3008..b1cf5ff 100644
--- a/src/tint/lang/hlsl/writer/builtin_test.cc
+++ b/src/tint/lang/hlsl/writer/builtin_test.cc
@@ -1464,6 +1464,66 @@
 )");
 }
 
+TEST_F(HlslWriterTest, BuiltinTextureLoad_Multisampled2DI32_WithRobustness) {
+    auto* t =
+        b.Var(ty.ptr(handle, ty.multisampled_texture(core::type::TextureDimension::k2d, ty.i32())));
+    t->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(t);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        auto* coords = b.Composite(ty.vec2i(), 1_i, 2_i);
+        auto* sample_idx = b.Value(3_i);
+        b.Let("x", b.Call<vec4<i32>>(core::BuiltinFn::kTextureLoad, b.Load(t), coords, sample_idx));
+        b.Return(func);
+    });
+
+    Options opts;
+    opts.entry_point_name = "main";
+    opts.disable_robustness = false;
+    auto result = Generate(opts);
+    ASSERT_EQ(result, Success) << result.Failure().reason << output_.hlsl;
+    EXPECT_EQ(output_.hlsl, R"(
+Texture2DMS<int4> v : register(t0);
+void main() {
+  uint3 v_1 = (0u).xxx;
+  v.GetDimensions(v_1.x, v_1.y, v_1.z);
+  int4 x = v.Load(int2(int(1), int(2)), int(min(3u, (v_1.z - 1u))));
+}
+
+)");
+}
+
+TEST_F(HlslWriterTest, BuiltinTextureLoad_DepthMultisampledF32_WithRobustness) {
+    auto* t =
+        b.Var(ty.ptr(handle, ty.depth_multisampled_texture(core::type::TextureDimension::k2d)));
+    t->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(t);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        auto* coords = b.Composite(ty.vec2i(), 1_i, 2_i);
+        auto* sample_idx = b.Value(3_u);
+        b.Let("x", b.Call<f32>(core::BuiltinFn::kTextureLoad, b.Load(t), coords, sample_idx));
+        b.Return(func);
+    });
+
+    Options opts;
+    opts.entry_point_name = "main";
+    opts.disable_robustness = false;
+    auto result = Generate(opts);
+    ASSERT_EQ(result, Success) << result.Failure().reason << output_.hlsl;
+    EXPECT_EQ(output_.hlsl, R"(
+Texture2DMS<float4> v : register(t0);
+void main() {
+  uint3 v_1 = (0u).xxx;
+  v.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float x = v.Load(int2(int(1), int(2)), int(min(3u, (v_1.z - 1u)))).x;
+}
+
+)");
+}
+
 TEST_F(HlslWriterTest, BuiltinTextureStore1D) {
     auto* t = b.Var(
         ty.ptr(handle, ty.storage_texture(core::type::TextureDimension::k1d,
diff --git a/src/tint/lang/hlsl/writer/raise/raise.cc b/src/tint/lang/hlsl/writer/raise/raise.cc
index 4648fad..661de7b 100644
--- a/src/tint/lang/hlsl/writer/raise/raise.cc
+++ b/src/tint/lang/hlsl/writer/raise/raise.cc
@@ -197,6 +197,8 @@
         // Direct3D guarantees to return zero for any resource that is accessed out of bounds, and
         // according to the description of the assembly store_uav_typed, out of bounds addressing
         // means nothing gets written to memory.
+        // Note that the sample_index parameter of multisampled textureLoad will still be clamped by
+        // the Robustness transform, as Direct3D leaves out-of-bounds sample indices undefined.
         config.clamp_texture = false;
 
         config.use_integer_range_analysis = !options.disable_integer_range_analysis;
diff --git a/src/tint/lang/spirv/writer/texture_builtin_test.cc b/src/tint/lang/spirv/writer/texture_builtin_test.cc
index 921e16c..a1bbbe3 100644
--- a/src/tint/lang/spirv/writer/texture_builtin_test.cc
+++ b/src/tint/lang/spirv/writer/texture_builtin_test.cc
@@ -1367,7 +1367,10 @@
                                  {{"coords", 2, kI32}, {"sample_idx", 1, kI32}},
                                  {"result", 4, kF32},
                                  {
-                                     "OpImageFetch %v4float %t %coords Sample %sample_idx",
+                                     "%10 = OpImageQuerySamples %uint %t",
+                                     "%12 = OpISub %uint %10 %uint_1",
+                                     "%14 = OpExtInst %uint %15 UMin %uint_2 %12",
+                                     "%result = OpImageFetch %v4float %t %coords Sample %14",
                                  },
                              },
                              TextureBuiltinTestCase{
@@ -1400,8 +1403,11 @@
                                  {{"coords", 2, kI32}, {"sample_idx", 1, kI32}},
                                  {"result", 1, kF32},
                                  {
-                                     "OpImageFetch %v4float %t %coords Sample %sample_idx",
-                                     "%result = OpCompositeExtract %float",
+                                     "%9 = OpImageQuerySamples %uint %t",
+                                     "%11 = OpISub %uint %9 %uint_1",
+                                     "%13 = OpExtInst %uint %14 UMin %uint_2 %11",
+                                     "%16 = OpImageFetch %v4float %t %coords Sample %13",
+                                     "%result = OpCompositeExtract %float %16 0",
                                  },
                              },
 
diff --git a/test/tint/bug/tint/1976.wgsl.expected.dxc.hlsl b/test/tint/bug/tint/1976.wgsl.expected.dxc.hlsl
index 53407e6..32ee404 100644
--- a/test/tint/bug/tint/1976.wgsl.expected.dxc.hlsl
+++ b/test/tint/bug/tint/1976.wgsl.expected.dxc.hlsl
@@ -3,6 +3,8 @@
 RWByteAddressBuffer results : register(u2);
 [numthreads(1, 1, 1)]
 void main() {
-  results.Store(0u, asuint(texture0.Load((int(0)).xx, int(0)).x));
+  uint3 v = (0u).xxx;
+  texture0.GetDimensions(v.x, v.y, v.z);
+  results.Store(0u, asuint(texture0.Load((int(0)).xx, int(min(0u, (v.z - 1u)))).x));
 }
 
diff --git a/test/tint/bug/tint/1976.wgsl.expected.fxc.hlsl b/test/tint/bug/tint/1976.wgsl.expected.fxc.hlsl
index 53407e6..32ee404 100644
--- a/test/tint/bug/tint/1976.wgsl.expected.fxc.hlsl
+++ b/test/tint/bug/tint/1976.wgsl.expected.fxc.hlsl
@@ -3,6 +3,8 @@
 RWByteAddressBuffer results : register(u2);
 [numthreads(1, 1, 1)]
 void main() {
-  results.Store(0u, asuint(texture0.Load((int(0)).xx, int(0)).x));
+  uint3 v = (0u).xxx;
+  texture0.GetDimensions(v.x, v.y, v.z);
+  results.Store(0u, asuint(texture0.Load((int(0)).xx, int(min(0u, (v.z - 1u)))).x));
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.dxc.hlsl
index 5cb678a..ba34118 100644
--- a/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_03171c() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_03171c() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_03171c() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_03171c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_03171c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.fxc.hlsl
index 5cb678a..ba34118 100644
--- a/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/03171c.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_03171c() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_03171c() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_03171c() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_03171c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_03171c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.dxc.hlsl
index 8d7477d..58ed94e 100644
--- a/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_0b524e() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_0b524e() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_0b524e() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_0b524e();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_0b524e();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.fxc.hlsl
index 8d7477d..58ed94e 100644
--- a/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/0b524e.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_0b524e() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_0b524e() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_0b524e() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_0b524e();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_0b524e();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.dxc.hlsl
index 2a45b0d..7df8380 100644
--- a/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_162821() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_162821() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_162821() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_162821();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_162821();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.fxc.hlsl
index 2a45b0d..7df8380 100644
--- a/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/162821.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_162821() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_162821() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_162821() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_162821();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_162821();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.dxc.hlsl
index eaed26a..8cef844 100644
--- a/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_17ff6c() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_17ff6c() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_17ff6c() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_17ff6c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_17ff6c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.fxc.hlsl
index eaed26a..8cef844 100644
--- a/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/17ff6c.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_17ff6c() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_17ff6c() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_17ff6c() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_17ff6c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_17ff6c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.dxc.hlsl
index bf6af67..1b5e4c3 100644
--- a/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_2e09aa() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_2e09aa() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_2e09aa() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_2e09aa();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_2e09aa();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.fxc.hlsl
index bf6af67..1b5e4c3 100644
--- a/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/2e09aa.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_2e09aa() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_2e09aa() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_2e09aa() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_2e09aa();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_2e09aa();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.dxc.hlsl
index 860c5a0..ebdff75 100644
--- a/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_301d55() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_301d55() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_301d55() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_301d55();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_301d55();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.fxc.hlsl
index 860c5a0..ebdff75 100644
--- a/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/301d55.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_301d55() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_301d55() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_301d55() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_301d55();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_301d55();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.dxc.hlsl
index 54eb855..bd90b28 100644
--- a/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_378f51() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_378f51() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_378f51() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_378f51();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_378f51();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.fxc.hlsl
index 54eb855..bd90b28 100644
--- a/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/378f51.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_378f51() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_378f51() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_378f51() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_378f51();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_378f51();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.dxc.hlsl
index 7d4209e..5dc6819 100644
--- a/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_38f8ab() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_38f8ab() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_38f8ab() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_38f8ab();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_38f8ab();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.fxc.hlsl
index 7d4209e..5dc6819 100644
--- a/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/38f8ab.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_38f8ab() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_38f8ab() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_38f8ab() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_38f8ab();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_38f8ab();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.dxc.hlsl
index 90c676a..1c35263 100644
--- a/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_49f76f() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_49f76f() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_49f76f() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_49f76f();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_49f76f();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.fxc.hlsl
index 90c676a..1c35263 100644
--- a/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/49f76f.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_49f76f() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_49f76f() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_49f76f() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_49f76f();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_49f76f();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.dxc.hlsl
index fa0c6c6..6748306 100644
--- a/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_4db25c() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_4db25c() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_4db25c() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_4db25c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_4db25c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.fxc.hlsl
index fa0c6c6..6748306 100644
--- a/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/4db25c.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_4db25c() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_4db25c() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_4db25c() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_4db25c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_4db25c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.dxc.hlsl
index d2e2ca4..332c264 100644
--- a/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6273b1() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6273b1() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6273b1() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6273b1();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_6273b1();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.fxc.hlsl
index d2e2ca4..332c264 100644
--- a/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6273b1() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6273b1() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6273b1() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6273b1();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_6273b1();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.dxc.hlsl
index 763b046..ccb96ef 100644
--- a/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_639962() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_639962() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_639962() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_639962();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_639962();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.fxc.hlsl
index 763b046..ccb96ef 100644
--- a/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/639962.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_639962() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_639962() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_639962() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_639962();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_639962();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.dxc.hlsl
index b94b75d..4b72aac 100644
--- a/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_6477ba() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_6477ba() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_6477ba() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6477ba();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_6477ba();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.fxc.hlsl
index b94b75d..4b72aac 100644
--- a/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/6477ba.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_6477ba() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_6477ba() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_6477ba() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6477ba();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_6477ba();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.dxc.hlsl
index 96e0851..50550d8 100644
--- a/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6925bc() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6925bc() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6925bc() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6925bc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_6925bc();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.fxc.hlsl
index 96e0851..50550d8 100644
--- a/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/6925bc.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6925bc() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6925bc() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_6925bc() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6925bc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_6925bc();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.dxc.hlsl
index c071bb0..850103b 100644
--- a/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_77f9cc() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_77f9cc() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_77f9cc() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_77f9cc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_77f9cc();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.fxc.hlsl
index c071bb0..850103b 100644
--- a/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/77f9cc.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_77f9cc() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_77f9cc() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_77f9cc() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_77f9cc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_77f9cc();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.dxc.hlsl
index 92021ea..37f6301 100644
--- a/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_7bee94() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_7bee94() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_7bee94() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_7bee94();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_7bee94();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.fxc.hlsl
index 92021ea..37f6301 100644
--- a/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/7bee94.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_7bee94() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_7bee94() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_7bee94() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_7bee94();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_7bee94();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.dxc.hlsl
index 5eef81f..41bf1e7 100644
--- a/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_8449ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_8449ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_8449ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_8449ec();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_8449ec();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.fxc.hlsl
index 5eef81f..41bf1e7 100644
--- a/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/8449ec.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_8449ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_8449ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_8449ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_8449ec();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_8449ec();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.dxc.hlsl
index ae1eb82..1648ad6 100644
--- a/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_856602() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_856602() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_856602() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_856602();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_856602();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.fxc.hlsl
index ae1eb82..1648ad6 100644
--- a/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/856602.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_856602() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_856602() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_856602() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_856602();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_856602();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.dxc.hlsl
index db0248e..39a7473 100644
--- a/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_87162c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_87162c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_87162c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_87162c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_87162c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.fxc.hlsl
index db0248e..39a7473 100644
--- a/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/87162c.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_87162c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_87162c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_87162c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_87162c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_87162c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.dxc.hlsl
index 9c17325..5c452fa 100644
--- a/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_948f58() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_948f58() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_948f58() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_948f58();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_948f58();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.fxc.hlsl
index 9c17325..5c452fa 100644
--- a/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/948f58.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_948f58() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_948f58() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_948f58() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_948f58();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_948f58();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.dxc.hlsl
index 5b675cd..7232d1b 100644
--- a/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_98aa29() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_98aa29() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_98aa29() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_98aa29();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_98aa29();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.fxc.hlsl
index 5b675cd..7232d1b 100644
--- a/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/98aa29.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_98aa29() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_98aa29() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_98aa29() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_98aa29();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_98aa29();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.dxc.hlsl
index e5270fc..9307f21 100644
--- a/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_9d104c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_9d104c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_9d104c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_9d104c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_9d104c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.fxc.hlsl
index e5270fc..9307f21 100644
--- a/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/9d104c.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_9d104c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_9d104c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_9d104c() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_9d104c();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_9d104c();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.dxc.hlsl
index 2fd0f9f..54e1bfe 100644
--- a/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a583c9() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a583c9() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a583c9() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_a583c9();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_a583c9();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.fxc.hlsl
index 2fd0f9f..54e1bfe 100644
--- a/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a583c9() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a583c9() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a583c9() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_a583c9();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_a583c9();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl
index 1120e1f..6d30079 100644
--- a/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a6ef6a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a6ef6a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a6ef6a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_a6ef6a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_a6ef6a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl
index 1120e1f..6d30079 100644
--- a/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a6ef6a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a6ef6a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_a6ef6a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_a6ef6a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_a6ef6a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.dxc.hlsl
index 5e07e11..487ecc4 100644
--- a/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_b75d4a() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_b75d4a() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_b75d4a() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_b75d4a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_b75d4a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.fxc.hlsl
index 5e07e11..487ecc4 100644
--- a/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/b75d4a.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_b75d4a() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_b75d4a() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_b75d4a() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_b75d4a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_b75d4a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.dxc.hlsl
index 6406977..e13a850 100644
--- a/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bc4795() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bc4795() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bc4795() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_bc4795();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_bc4795();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.fxc.hlsl
index 6406977..e13a850 100644
--- a/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/bc4795.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bc4795() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bc4795() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bc4795() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_bc4795();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_bc4795();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.dxc.hlsl
index 31d22b0..2994ce0 100644
--- a/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_bec8ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_bec8ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_bec8ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_bec8ec();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_bec8ec();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.fxc.hlsl
index 31d22b0..2994ce0 100644
--- a/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/bec8ec.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_bec8ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_bec8ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_bec8ec() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_bec8ec();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_bec8ec();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.dxc.hlsl
index ee32bf7..913af7f 100644
--- a/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bed119() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bed119() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bed119() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_bed119();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_bed119();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.fxc.hlsl
index ee32bf7..913af7f 100644
--- a/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/bed119.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bed119() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bed119() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_bed119() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_bed119();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_bed119();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.dxc.hlsl
index 4d0ac8b..b7818601 100644
--- a/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c378ee() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c378ee() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c378ee() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c378ee();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_c378ee();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.fxc.hlsl
index 4d0ac8b..b7818601 100644
--- a/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c378ee() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c378ee() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c378ee() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c378ee();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_c378ee();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.dxc.hlsl
index 1b46543..6e800b1 100644
--- a/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_c4854a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_c4854a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_c4854a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c4854a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_c4854a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.fxc.hlsl
index 1b46543..6e800b1 100644
--- a/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/c4854a.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_c4854a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_c4854a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_c4854a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c4854a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_c4854a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.dxc.hlsl
index 31c4e62..a549a68 100644
--- a/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c87030() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c87030() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c87030() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c87030();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_c87030();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.fxc.hlsl
index 31c4e62..a549a68 100644
--- a/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/c87030.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c87030() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c87030() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_c87030() {
-  uint4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c87030();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_c87030();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.dxc.hlsl
index 5ba88d0..7535cf2 100644
--- a/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_cad5f2() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_cad5f2() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_cad5f2() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_cad5f2();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_cad5f2();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.fxc.hlsl
index 5ba88d0..7535cf2 100644
--- a/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/cad5f2.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_cad5f2() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_cad5f2() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_cad5f2() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_cad5f2();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_cad5f2();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl
index 1d2f1b3..c50e496 100644
--- a/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_dd4f2a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_dd4f2a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_dd4f2a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_dd4f2a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_dd4f2a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl
index 1d2f1b3..c50e496 100644
--- a/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_dd4f2a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_dd4f2a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<float4> arg_0 : register(t0, space1);
 float4 textureLoad_dd4f2a() {
-  float4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  float4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_dd4f2a();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_dd4f2a();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl
index f96abdf..3fbaede 100644
--- a/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_e3d2cc() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_e3d2cc() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_e3d2cc() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_e3d2cc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_e3d2cc();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl
index f96abdf..3fbaede 100644
--- a/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_e3d2cc() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_e3d2cc() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<int4> arg_0 : register(t0, space1);
 int4 textureLoad_e3d2cc() {
-  int4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  int4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_e3d2cc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_e3d2cc();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.dxc.hlsl
index 43d94a7..64fe4ce 100644
--- a/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_eceba4() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_eceba4() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_eceba4() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_eceba4();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_eceba4();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.fxc.hlsl
index 43d94a7..64fe4ce 100644
--- a/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/eceba4.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_eceba4() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_eceba4() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_eceba4() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_eceba4();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_eceba4();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.dxc.hlsl
index d2bfbe7..1f5a848 100644
--- a/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_f0abad() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_f0abad() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_f0abad() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_f0abad();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_f0abad();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.fxc.hlsl
index d2bfbe7..1f5a848 100644
--- a/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/f0abad.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_f0abad() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_f0abad() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float4 textureLoad_f0abad() {
-  float4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_f0abad();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_f0abad();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.dxc.hlsl
index a1f2a3f..41e7c63 100644
--- a/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_f7136f() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_f7136f() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_f7136f() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_f7136f();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_f7136f();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.fxc.hlsl
index a1f2a3f..41e7c63 100644
--- a/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/f7136f.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_f7136f() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_f7136f() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_f7136f() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_f7136f();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_f7136f();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.dxc.hlsl
index 12c558d..7504748 100644
--- a/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_fcd23d() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_fcd23d() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_fcd23d() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_fcd23d();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_fcd23d();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.fxc.hlsl
index 12c558d..7504748 100644
--- a/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/fcd23d.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_fcd23d() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_fcd23d() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<float4> arg_0 : register(t0, space1);
 float textureLoad_fcd23d() {
-  float res = arg_0.Load((int(1)).xx, int(1)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  float res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_fcd23d();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_fcd23d();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.dxc.hlsl
index a1a043a..f2c59ea 100644
--- a/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_fe0565() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_fe0565() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_fe0565() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_fe0565();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_fe0565();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.fxc.hlsl
index a1a043a..f2c59ea 100644
--- a/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/fe0565.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_fe0565() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_fe0565() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMS<uint4> arg_0 : register(t0, space1);
 uint4 textureLoad_fe0565() {
-  uint4 res = arg_0.Load((int(1)).xx, int(1));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint4 res = arg_0.Load((int(1)).xx, int(min(1u, (v.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_fe0565();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_fe0565();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.dxc.hlsl
index cc43fff..c2ebbb9 100644
--- a/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.dxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_fef2ed() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_fef2ed() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_fef2ed() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_fef2ed();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_fef2ed();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.fxc.hlsl
index cc43fff..c2ebbb9 100644
--- a/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/textureLoad/fef2ed.wgsl.expected.fxc.hlsl
@@ -5,7 +5,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_fef2ed() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -20,7 +22,9 @@
 RWByteAddressBuffer prevent_dce : register(u0);
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_fef2ed() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
@@ -45,21 +49,23 @@
 
 Texture2DMSArray<int4> arg_0 : register(t0, space1);
 int4 textureLoad_fef2ed() {
-  int4 res = arg_0.Load((int(1)).xxx, int(1));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  int4 res = arg_0.Load((int(1)).xxx, int(min(1u, (v.w - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_fef2ed();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_1 = (VertexOutput)0;
+  v_1.pos = (0.0f).xxxx;
+  v_1.prevent_dce = textureLoad_fef2ed();
+  VertexOutput v_2 = v_1;
+  return v_2;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_3 = vertex_main_inner();
+  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
+  return v_4;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.dxc.hlsl
index bc281cf..e7f28e6 100644
--- a/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.dxc.hlsl
@@ -8,9 +8,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -28,9 +30,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -58,23 +62,25 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_03171c();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_03171c();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.fxc.hlsl
index bc281cf..e7f28e6 100644
--- a/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/03171c.wgsl.expected.fxc.hlsl
@@ -8,9 +8,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -28,9 +30,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -58,23 +62,25 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_03171c();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_03171c();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.dxc.hlsl
index 175abb2..b822817 100644
--- a/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.dxc.hlsl
@@ -8,10 +8,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  float4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  float4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -29,10 +34,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  float4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  float4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -60,24 +70,29 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  float4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  float4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_0b524e();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_7 = (VertexOutput)0;
+  v_7.pos = (0.0f).xxxx;
+  v_7.prevent_dce = textureLoad_0b524e();
+  VertexOutput v_8 = v_7;
+  return v_8;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_9 = vertex_main_inner();
+  vertex_main_outputs v_10 = {v_9.prevent_dce, v_9.pos};
+  return v_10;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.fxc.hlsl
index 175abb2..b822817 100644
--- a/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/0b524e.wgsl.expected.fxc.hlsl
@@ -8,10 +8,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  float4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  float4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -29,10 +34,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  float4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  float4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -60,24 +70,29 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  float4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  float4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_0b524e();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_7 = (VertexOutput)0;
+  v_7.pos = (0.0f).xxxx;
+  v_7.prevent_dce = textureLoad_0b524e();
+  VertexOutput v_8 = v_7;
+  return v_8;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_9 = vertex_main_inner();
+  vertex_main_outputs v_10 = {v_9.prevent_dce, v_9.pos};
+  return v_10;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.dxc.hlsl
index 7289a96..fa64830 100644
--- a/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.dxc.hlsl
@@ -8,8 +8,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  uint4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -27,8 +33,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  uint4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -56,22 +68,28 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  uint4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_162821();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_162821();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.fxc.hlsl
index 7289a96..fa64830 100644
--- a/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/162821.wgsl.expected.fxc.hlsl
@@ -8,8 +8,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  uint4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -27,8 +33,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  uint4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -56,22 +68,28 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  uint4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_162821();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_162821();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.dxc.hlsl
index 8ed1ffe..3f32304 100644
--- a/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.dxc.hlsl
@@ -9,9 +9,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_17ff6c();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_17ff6c();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.fxc.hlsl
index 8ed1ffe..3f32304 100644
--- a/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/17ff6c.wgsl.expected.fxc.hlsl
@@ -9,9 +9,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_17ff6c();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_17ff6c();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.dxc.hlsl
index 6e35163..2d7e9f3 100644
--- a/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.dxc.hlsl
@@ -7,9 +7,11 @@
 float4 textureLoad_2e09aa() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -26,9 +28,11 @@
 float4 textureLoad_2e09aa() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -55,23 +59,25 @@
 float4 textureLoad_2e09aa() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_2e09aa();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_2e09aa();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.fxc.hlsl
index 6e35163..2d7e9f3 100644
--- a/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/2e09aa.wgsl.expected.fxc.hlsl
@@ -7,9 +7,11 @@
 float4 textureLoad_2e09aa() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -26,9 +28,11 @@
 float4 textureLoad_2e09aa() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -55,23 +59,25 @@
 float4 textureLoad_2e09aa() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_2e09aa();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_2e09aa();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.dxc.hlsl
index 9d3e5c8..c2ad08e 100644
--- a/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.dxc.hlsl
@@ -8,10 +8,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  uint4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  uint4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -29,10 +34,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  uint4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  uint4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -60,24 +70,29 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  uint4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  uint4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_301d55();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_7 = (VertexOutput)0;
+  v_7.pos = (0.0f).xxxx;
+  v_7.prevent_dce = textureLoad_301d55();
+  VertexOutput v_8 = v_7;
+  return v_8;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_9 = vertex_main_inner();
+  vertex_main_outputs v_10 = {v_9.prevent_dce, v_9.pos};
+  return v_10;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.fxc.hlsl
index 9d3e5c8..c2ad08e 100644
--- a/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/301d55.wgsl.expected.fxc.hlsl
@@ -8,10 +8,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  uint4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  uint4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -29,10 +34,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  uint4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  uint4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -60,24 +70,29 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  uint4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  uint4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_301d55();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_7 = (VertexOutput)0;
+  v_7.pos = (0.0f).xxxx;
+  v_7.prevent_dce = textureLoad_301d55();
+  VertexOutput v_8 = v_7;
+  return v_8;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_9 = vertex_main_inner();
+  vertex_main_outputs v_10 = {v_9.prevent_dce, v_9.pos};
+  return v_10;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.dxc.hlsl
index ae7bb03..87ee1bd 100644
--- a/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.dxc.hlsl
@@ -9,10 +9,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  float4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  float4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -31,10 +33,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  float4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  float4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -63,24 +67,26 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  float4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  float4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_4 = (VertexOutput)0;
-  v_4.pos = (0.0f).xxxx;
-  v_4.prevent_dce = textureLoad_378f51();
-  VertexOutput v_5 = v_4;
-  return v_5;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_378f51();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_6 = vertex_main_inner();
-  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
-  return v_7;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.fxc.hlsl
index ae7bb03..87ee1bd 100644
--- a/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/378f51.wgsl.expected.fxc.hlsl
@@ -9,10 +9,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  float4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  float4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -31,10 +33,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  float4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  float4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -63,24 +67,26 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  float4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  float4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_4 = (VertexOutput)0;
-  v_4.pos = (0.0f).xxxx;
-  v_4.prevent_dce = textureLoad_378f51();
-  VertexOutput v_5 = v_4;
-  return v_5;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_378f51();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_6 = vertex_main_inner();
-  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
-  return v_7;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.dxc.hlsl
index 9f8a7e8..2441b14 100644
--- a/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.dxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  int4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  int4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  int4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  int4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  int4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  int4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_38f8ab();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_38f8ab();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.fxc.hlsl
index 9f8a7e8..2441b14 100644
--- a/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/38f8ab.wgsl.expected.fxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  int4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  int4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  int4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  int4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  int4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  int4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_38f8ab();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_38f8ab();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.dxc.hlsl
index a6b9d5a..98c6f66 100644
--- a/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.dxc.hlsl
@@ -7,9 +7,11 @@
 uint4 textureLoad_49f76f() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -26,9 +28,11 @@
 uint4 textureLoad_49f76f() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -55,23 +59,25 @@
 uint4 textureLoad_49f76f() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_49f76f();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_49f76f();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.fxc.hlsl
index a6b9d5a..98c6f66 100644
--- a/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/49f76f.wgsl.expected.fxc.hlsl
@@ -7,9 +7,11 @@
 uint4 textureLoad_49f76f() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -26,9 +28,11 @@
 uint4 textureLoad_49f76f() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -55,23 +59,25 @@
 uint4 textureLoad_49f76f() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_49f76f();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_49f76f();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.dxc.hlsl
index 955e7f8..5527c79 100644
--- a/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.dxc.hlsl
@@ -7,9 +7,11 @@
 float textureLoad_4db25c() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float res = arg_0.Load(v_1, int(v)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float res = arg_0.Load(v_2, int(v_1)).x;
   return res;
 }
 
@@ -26,9 +28,11 @@
 float textureLoad_4db25c() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float res = arg_0.Load(v_1, int(v)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float res = arg_0.Load(v_2, int(v_1)).x;
   return res;
 }
 
@@ -55,23 +59,25 @@
 float textureLoad_4db25c() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float res = arg_0.Load(v_1, int(v)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float res = arg_0.Load(v_2, int(v_1)).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_4db25c();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_4db25c();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.fxc.hlsl
index 955e7f8..5527c79 100644
--- a/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/4db25c.wgsl.expected.fxc.hlsl
@@ -7,9 +7,11 @@
 float textureLoad_4db25c() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float res = arg_0.Load(v_1, int(v)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float res = arg_0.Load(v_2, int(v_1)).x;
   return res;
 }
 
@@ -26,9 +28,11 @@
 float textureLoad_4db25c() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float res = arg_0.Load(v_1, int(v)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float res = arg_0.Load(v_2, int(v_1)).x;
   return res;
 }
 
@@ -55,23 +59,25 @@
 float textureLoad_4db25c() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  float res = arg_0.Load(v_1, int(v)).x;
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  float res = arg_0.Load(v_2, int(v_1)).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_4db25c();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_4db25c();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.dxc.hlsl
index d5c3e47..3bd5a88 100644
--- a/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.dxc.hlsl
@@ -7,7 +7,11 @@
 float textureLoad_6273b1() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float res = arg_0.Load(arg_1, arg_2).x;
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float res = arg_0.Load(v, int(min(uint(arg_2), v_2))).x;
   return res;
 }
 
@@ -24,7 +28,11 @@
 float textureLoad_6273b1() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float res = arg_0.Load(arg_1, arg_2).x;
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float res = arg_0.Load(v, int(min(uint(arg_2), v_2))).x;
   return res;
 }
 
@@ -51,21 +59,25 @@
 float textureLoad_6273b1() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float res = arg_0.Load(arg_1, arg_2).x;
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float res = arg_0.Load(v, int(min(uint(arg_2), v_2))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6273b1();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_6273b1();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.fxc.hlsl
index d5c3e47..3bd5a88 100644
--- a/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/6273b1.wgsl.expected.fxc.hlsl
@@ -7,7 +7,11 @@
 float textureLoad_6273b1() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float res = arg_0.Load(arg_1, arg_2).x;
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float res = arg_0.Load(v, int(min(uint(arg_2), v_2))).x;
   return res;
 }
 
@@ -24,7 +28,11 @@
 float textureLoad_6273b1() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float res = arg_0.Load(arg_1, arg_2).x;
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float res = arg_0.Load(v, int(min(uint(arg_2), v_2))).x;
   return res;
 }
 
@@ -51,21 +59,25 @@
 float textureLoad_6273b1() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float res = arg_0.Load(arg_1, arg_2).x;
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float res = arg_0.Load(v, int(min(uint(arg_2), v_2))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_6273b1();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_6273b1();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.dxc.hlsl
index 3673bd8..aba7adc 100644
--- a/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.dxc.hlsl
@@ -7,9 +7,11 @@
 int4 textureLoad_639962() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -26,9 +28,11 @@
 int4 textureLoad_639962() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -55,23 +59,25 @@
 int4 textureLoad_639962() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_639962();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_639962();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.fxc.hlsl
index 3673bd8..aba7adc 100644
--- a/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/639962.wgsl.expected.fxc.hlsl
@@ -7,9 +7,11 @@
 int4 textureLoad_639962() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -26,9 +28,11 @@
 int4 textureLoad_639962() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -55,23 +59,25 @@
 int4 textureLoad_639962() {
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
-  uint v = arg_2;
-  int2 v_1 = int2(arg_1);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint3 v = (0u).xxx;
+  arg_0.GetDimensions(v.x, v.y, v.z);
+  uint v_1 = min(arg_2, (v.z - 1u));
+  int2 v_2 = int2(arg_1);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_639962();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_639962();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.dxc.hlsl
index 9dc1ec7..2b9e7ec 100644
--- a/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.dxc.hlsl
@@ -9,8 +9,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -29,8 +34,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -59,22 +69,27 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_6477ba();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_6477ba();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.fxc.hlsl
index 9dc1ec7..2b9e7ec 100644
--- a/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/6477ba.wgsl.expected.fxc.hlsl
@@ -9,8 +9,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -29,8 +34,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -59,22 +69,27 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_6477ba();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_6477ba();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.dxc.hlsl
index 72e518d..f100bb9 100644
--- a/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.dxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float res = arg_0.Load(v, int(arg_2)).x;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u)))).x;
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float res = arg_0.Load(v, int(arg_2)).x;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u)))).x;
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float res = arg_0.Load(v, int(arg_2)).x;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_6925bc();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_6925bc();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.fxc.hlsl
index 72e518d..f100bb9 100644
--- a/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/6925bc.wgsl.expected.fxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float res = arg_0.Load(v, int(arg_2)).x;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u)))).x;
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float res = arg_0.Load(v, int(arg_2)).x;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u)))).x;
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float res = arg_0.Load(v, int(arg_2)).x;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u)))).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_6925bc();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_6925bc();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.dxc.hlsl
index 6e5f711..059d3d8 100644
--- a/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.dxc.hlsl
@@ -8,9 +8,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -28,9 +30,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -58,23 +62,25 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_77f9cc();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_77f9cc();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.fxc.hlsl
index 6e5f711..059d3d8 100644
--- a/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/77f9cc.wgsl.expected.fxc.hlsl
@@ -8,9 +8,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -28,9 +30,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -58,23 +62,25 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  int4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  int4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_77f9cc();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_77f9cc();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.dxc.hlsl
index d162af3..f4cc26c 100644
--- a/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.dxc.hlsl
@@ -7,8 +7,13 @@
 int4 textureLoad_7bee94() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  int4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  int4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -25,8 +30,13 @@
 int4 textureLoad_7bee94() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  int4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  int4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -53,22 +63,27 @@
 int4 textureLoad_7bee94() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  int4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  int4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_7bee94();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_7bee94();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.fxc.hlsl
index d162af3..f4cc26c 100644
--- a/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/7bee94.wgsl.expected.fxc.hlsl
@@ -7,8 +7,13 @@
 int4 textureLoad_7bee94() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  int4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  int4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -25,8 +30,13 @@
 int4 textureLoad_7bee94() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  int4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  int4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -53,22 +63,27 @@
 int4 textureLoad_7bee94() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  int4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  int4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_7bee94();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_7bee94();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.dxc.hlsl
index 7ad82d3..c8430dc 100644
--- a/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.dxc.hlsl
@@ -8,10 +8,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  int4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -29,10 +34,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  int4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -60,24 +70,29 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  int4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_8449ec();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_7 = (VertexOutput)0;
+  v_7.pos = (0.0f).xxxx;
+  v_7.prevent_dce = textureLoad_8449ec();
+  VertexOutput v_8 = v_7;
+  return v_8;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_9 = vertex_main_inner();
+  vertex_main_outputs v_10 = {v_9.prevent_dce, v_9.pos};
+  return v_10;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.fxc.hlsl
index 7ad82d3..c8430dc 100644
--- a/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/8449ec.wgsl.expected.fxc.hlsl
@@ -8,10 +8,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  int4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -29,10 +34,15 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  int4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
@@ -60,24 +70,29 @@
   uint2 arg_1 = (1u).xx;
   uint arg_2 = 1u;
   int arg_3 = int(1);
-  uint v = arg_2;
-  int v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int4 res = arg_0.Load(int3(v_2, int(v)), v_1);
+  uint2 v = arg_1;
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int2 v_5 = int2(v);
+  int3 v_6 = int3(v_5, int(v_1));
+  int4 res = arg_0.Load(v_6, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_8449ec();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_7 = (VertexOutput)0;
+  v_7.pos = (0.0f).xxxx;
+  v_7.prevent_dce = textureLoad_8449ec();
+  VertexOutput v_8 = v_7;
+  return v_8;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_9 = vertex_main_inner();
+  vertex_main_outputs v_10 = {v_9.prevent_dce, v_9.pos};
+  return v_10;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.dxc.hlsl
index 98cd4d6..23b4e7a 100644
--- a/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.dxc.hlsl
@@ -9,8 +9,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -29,8 +34,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -59,22 +69,27 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_856602();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_856602();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.fxc.hlsl
index 98cd4d6..23b4e7a 100644
--- a/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/856602.wgsl.expected.fxc.hlsl
@@ -9,8 +9,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -29,8 +34,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -59,22 +69,27 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_856602();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_856602();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.dxc.hlsl
index 4926162..c8e8eff 100644
--- a/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.dxc.hlsl
@@ -9,10 +9,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  uint4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  uint4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -31,10 +33,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  uint4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  uint4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -63,24 +67,26 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  uint4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  uint4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_4 = (VertexOutput)0;
-  v_4.pos = (0.0f).xxxx;
-  v_4.prevent_dce = textureLoad_87162c();
-  VertexOutput v_5 = v_4;
-  return v_5;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_87162c();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_6 = vertex_main_inner();
-  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
-  return v_7;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.fxc.hlsl
index 4926162..c8e8eff 100644
--- a/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/87162c.wgsl.expected.fxc.hlsl
@@ -9,10 +9,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  uint4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  uint4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -31,10 +33,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  uint4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  uint4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -63,24 +67,26 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  uint4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  uint4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_4 = (VertexOutput)0;
-  v_4.pos = (0.0f).xxxx;
-  v_4.prevent_dce = textureLoad_87162c();
-  VertexOutput v_5 = v_4;
-  return v_5;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_87162c();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_6 = vertex_main_inner();
-  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
-  return v_7;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.dxc.hlsl
index 2b4676b..eb6a9cc 100644
--- a/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.dxc.hlsl
@@ -9,9 +9,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_948f58();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_948f58();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.fxc.hlsl
index 2b4676b..eb6a9cc 100644
--- a/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/948f58.wgsl.expected.fxc.hlsl
@@ -9,9 +9,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_948f58();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_948f58();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.dxc.hlsl
index 17148e6..af9f488 100644
--- a/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.dxc.hlsl
@@ -8,9 +8,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -28,9 +30,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -58,23 +62,25 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_98aa29();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_98aa29();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.fxc.hlsl
index 17148e6..af9f488 100644
--- a/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/98aa29.wgsl.expected.fxc.hlsl
@@ -8,9 +8,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -28,9 +30,11 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
@@ -58,23 +62,25 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   uint arg_3 = 1u;
-  uint v = arg_3;
-  int3 v_1 = int3(arg_1, arg_2);
-  uint4 res = arg_0.Load(v_1, int(v));
+  uint4 v = (0u).xxxx;
+  arg_0.GetDimensions(v.x, v.y, v.z, v.w);
+  uint v_1 = min(arg_3, (v.w - 1u));
+  int3 v_2 = int3(arg_1, arg_2);
+  uint4 res = arg_0.Load(v_2, int(v_1));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_98aa29();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_98aa29();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.dxc.hlsl
index 9755481..20c35af 100644
--- a/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.dxc.hlsl
@@ -8,9 +8,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -28,9 +33,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -58,23 +68,28 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_9d104c();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_9d104c();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.fxc.hlsl
index 9755481..20c35af 100644
--- a/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/9d104c.wgsl.expected.fxc.hlsl
@@ -8,9 +8,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -28,9 +33,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -58,23 +68,28 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  uint4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  uint4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_9d104c();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_9d104c();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.dxc.hlsl
index deb0808..fe7c8a5 100644
--- a/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.dxc.hlsl
@@ -7,7 +7,11 @@
 float4 textureLoad_a583c9() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -24,7 +28,11 @@
 float4 textureLoad_a583c9() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -51,21 +59,25 @@
 float4 textureLoad_a583c9() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_a583c9();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_a583c9();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.fxc.hlsl
index deb0808..fe7c8a5 100644
--- a/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/a583c9.wgsl.expected.fxc.hlsl
@@ -7,7 +7,11 @@
 float4 textureLoad_a583c9() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -24,7 +28,11 @@
 float4 textureLoad_a583c9() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -51,21 +59,25 @@
 float4 textureLoad_a583c9() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  float4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  float4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_a583c9();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_a583c9();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl
index a71af54..c1573e7 100644
--- a/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.dxc.hlsl
@@ -9,9 +9,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_a6ef6a();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_a6ef6a();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl
index a71af54..c1573e7 100644
--- a/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/a6ef6a.wgsl.expected.fxc.hlsl
@@ -9,9 +9,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_a6ef6a();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_a6ef6a();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.dxc.hlsl
index a032069..9751230 100644
--- a/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.dxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_b75d4a();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_b75d4a();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.fxc.hlsl
index a032069..9751230 100644
--- a/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/b75d4a.wgsl.expected.fxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  float4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  float4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_b75d4a();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_b75d4a();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.dxc.hlsl
index 1cf1265..d422d5e 100644
--- a/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.dxc.hlsl
@@ -9,9 +9,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_bc4795();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_bc4795();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.fxc.hlsl
index 1cf1265..d422d5e 100644
--- a/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/bc4795.wgsl.expected.fxc.hlsl
@@ -9,9 +9,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  float4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  float4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_bc4795();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_bc4795();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.dxc.hlsl
index 8229b90..bcea283 100644
--- a/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.dxc.hlsl
@@ -9,9 +9,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_bec8ec();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_bec8ec();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.fxc.hlsl
index 8229b90..bcea283 100644
--- a/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/bec8ec.wgsl.expected.fxc.hlsl
@@ -9,9 +9,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   int2 v = arg_1;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(v, int(arg_2));
-  int4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(v, int(arg_2));
+  int4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_bec8ec();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_bec8ec();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.dxc.hlsl
index c5e86da..b350192 100644
--- a/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.dxc.hlsl
@@ -9,8 +9,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -29,8 +34,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -59,22 +69,27 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_bed119();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_bed119();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.fxc.hlsl
index c5e86da..b350192 100644
--- a/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/bed119.wgsl.expected.fxc.hlsl
@@ -9,8 +9,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -29,8 +34,13 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -59,22 +69,27 @@
   uint arg_2 = 1u;
   int arg_3 = int(1);
   int2 v = arg_1;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(v, int(arg_2)), v_1);
+  uint v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, int(v_1));
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_bed119();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_bed119();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.dxc.hlsl
index 6a115e9..4a3ea25 100644
--- a/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.dxc.hlsl
@@ -7,7 +7,11 @@
 uint4 textureLoad_c378ee() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  uint4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -24,7 +28,11 @@
 uint4 textureLoad_c378ee() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  uint4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -51,21 +59,25 @@
 uint4 textureLoad_c378ee() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  uint4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c378ee();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_c378ee();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.fxc.hlsl
index 6a115e9..4a3ea25 100644
--- a/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/c378ee.wgsl.expected.fxc.hlsl
@@ -7,7 +7,11 @@
 uint4 textureLoad_c378ee() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  uint4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -24,7 +28,11 @@
 uint4 textureLoad_c378ee() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  uint4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -51,21 +59,25 @@
 uint4 textureLoad_c378ee() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  uint4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_c378ee();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_c378ee();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.dxc.hlsl
index 7ceeba0..2a25ced 100644
--- a/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.dxc.hlsl
@@ -8,9 +8,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -28,9 +33,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -58,23 +68,28 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_c4854a();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_c4854a();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.fxc.hlsl
index 7ceeba0..2a25ced 100644
--- a/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/c4854a.wgsl.expected.fxc.hlsl
@@ -8,9 +8,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -28,9 +33,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -58,23 +68,28 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  float4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_c4854a();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_c4854a();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.dxc.hlsl
index 46962a7..bf58505 100644
--- a/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.dxc.hlsl
@@ -9,9 +9,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_c87030();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_c87030();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.fxc.hlsl
index 46962a7..bf58505 100644
--- a/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/c87030.wgsl.expected.fxc.hlsl
@@ -9,9 +9,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -30,9 +32,11 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
@@ -61,23 +65,25 @@
   int arg_2 = int(1);
   uint arg_3 = 1u;
   int v = arg_2;
-  uint v_1 = arg_3;
-  int3 v_2 = int3(int2(arg_1), v);
-  uint4 res = arg_0.Load(v_2, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int3 v_3 = int3(int2(arg_1), v);
+  uint4 res = arg_0.Load(v_3, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_3 = (VertexOutput)0;
-  v_3.pos = (0.0f).xxxx;
-  v_3.prevent_dce = textureLoad_c87030();
-  VertexOutput v_4 = v_3;
-  return v_4;
+  VertexOutput v_4 = (VertexOutput)0;
+  v_4.pos = (0.0f).xxxx;
+  v_4.prevent_dce = textureLoad_c87030();
+  VertexOutput v_5 = v_4;
+  return v_5;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_5 = vertex_main_inner();
-  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
-  return v_6;
+  VertexOutput v_6 = vertex_main_inner();
+  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
+  return v_7;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.dxc.hlsl
index 52a9cb6..e3f24d4 100644
--- a/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.dxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  uint4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  uint4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  uint4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_cad5f2();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_cad5f2();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.fxc.hlsl
index 52a9cb6..e3f24d4 100644
--- a/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/cad5f2.wgsl.expected.fxc.hlsl
@@ -8,7 +8,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  uint4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -26,7 +28,9 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  uint4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
@@ -54,21 +58,23 @@
   int2 arg_1 = (int(1)).xx;
   uint arg_2 = 1u;
   int2 v = arg_1;
-  uint4 res = arg_0.Load(v, int(arg_2));
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint4 res = arg_0.Load(v, int(min(arg_2, (v_1.z - 1u))));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_cad5f2();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_2 = (VertexOutput)0;
+  v_2.pos = (0.0f).xxxx;
+  v_2.prevent_dce = textureLoad_cad5f2();
+  VertexOutput v_3 = v_2;
+  return v_3;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_4 = vertex_main_inner();
+  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
+  return v_5;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl
index e3dc4d9..4580391 100644
--- a/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.dxc.hlsl
@@ -8,8 +8,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  float4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -27,8 +33,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  float4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -56,22 +68,28 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  float4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_dd4f2a();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_dd4f2a();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl
index e3dc4d9..4580391 100644
--- a/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/dd4f2a.wgsl.expected.fxc.hlsl
@@ -8,8 +8,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  float4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -27,8 +33,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  float4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -56,22 +68,28 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  float4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  float4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_dd4f2a();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_dd4f2a();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl
index e9320b0..d2ac4a7 100644
--- a/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.dxc.hlsl
@@ -7,7 +7,11 @@
 int4 textureLoad_e3d2cc() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  int4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  int4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -24,7 +28,11 @@
 int4 textureLoad_e3d2cc() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  int4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  int4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -51,21 +59,25 @@
 int4 textureLoad_e3d2cc() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  int4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  int4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_e3d2cc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_e3d2cc();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl
index e9320b0..d2ac4a7 100644
--- a/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/e3d2cc.wgsl.expected.fxc.hlsl
@@ -7,7 +7,11 @@
 int4 textureLoad_e3d2cc() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  int4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  int4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -24,7 +28,11 @@
 int4 textureLoad_e3d2cc() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  int4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  int4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
@@ -51,21 +59,25 @@
 int4 textureLoad_e3d2cc() {
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
-  int4 res = arg_0.Load(arg_1, arg_2);
+  int2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  int4 res = arg_0.Load(v, int(min(uint(arg_2), v_2)));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v = (VertexOutput)0;
-  v.pos = (0.0f).xxxx;
-  v.prevent_dce = textureLoad_e3d2cc();
-  VertexOutput v_1 = v;
-  return v_1;
+  VertexOutput v_3 = (VertexOutput)0;
+  v_3.pos = (0.0f).xxxx;
+  v_3.prevent_dce = textureLoad_e3d2cc();
+  VertexOutput v_4 = v_3;
+  return v_4;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_2 = vertex_main_inner();
-  vertex_main_outputs v_3 = {v_2.prevent_dce, v_2.pos};
-  return v_3;
+  VertexOutput v_5 = vertex_main_inner();
+  vertex_main_outputs v_6 = {v_5.prevent_dce, v_5.pos};
+  return v_6;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.dxc.hlsl
index 11f1921..f00ee07 100644
--- a/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.dxc.hlsl
@@ -8,8 +8,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  int4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -27,8 +33,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  int4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -56,22 +68,28 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  int4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_eceba4();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_eceba4();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.fxc.hlsl
index 11f1921..f00ee07 100644
--- a/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/eceba4.wgsl.expected.fxc.hlsl
@@ -8,8 +8,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  int4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -27,8 +33,14 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  int4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -56,22 +68,28 @@
   int2 arg_1 = (int(1)).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_3;
-  int4 res = arg_0.Load(int3(arg_1, arg_2), v);
+  int2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(v, v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_eceba4();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_eceba4();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.dxc.hlsl
index 9b0a991..b4cb0cc 100644
--- a/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.dxc.hlsl
@@ -7,8 +7,13 @@
 float4 textureLoad_f0abad() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -25,8 +30,13 @@
 float4 textureLoad_f0abad() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -53,22 +63,27 @@
 float4 textureLoad_f0abad() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_f0abad();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_f0abad();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.fxc.hlsl
index 9b0a991..b4cb0cc 100644
--- a/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/f0abad.wgsl.expected.fxc.hlsl
@@ -7,8 +7,13 @@
 float4 textureLoad_f0abad() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -25,8 +30,13 @@
 float4 textureLoad_f0abad() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -53,22 +63,27 @@
 float4 textureLoad_f0abad() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_f0abad();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_f0abad();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.dxc.hlsl
index bdbbd1a..8788a8d 100644
--- a/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.dxc.hlsl
@@ -8,9 +8,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -28,9 +33,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -58,23 +68,28 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_f7136f();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_f7136f();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.fxc.hlsl
index bdbbd1a..8788a8d 100644
--- a/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/f7136f.wgsl.expected.fxc.hlsl
@@ -8,9 +8,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -28,9 +33,14 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
@@ -58,23 +68,28 @@
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
   int arg_3 = int(1);
-  int v = arg_2;
-  int v_1 = arg_3;
-  int4 res = arg_0.Load(int3(int2(arg_1), v), v_1);
+  uint2 v = arg_1;
+  int v_1 = arg_2;
+  uint4 v_2 = (0u).xxxx;
+  arg_0.GetDimensions(v_2.x, v_2.y, v_2.z, v_2.w);
+  uint v_3 = (v_2.w - 1u);
+  uint v_4 = min(uint(arg_3), v_3);
+  int3 v_5 = int3(int2(v), v_1);
+  int4 res = arg_0.Load(v_5, int(v_4));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_2 = (VertexOutput)0;
-  v_2.pos = (0.0f).xxxx;
-  v_2.prevent_dce = textureLoad_f7136f();
-  VertexOutput v_3 = v_2;
-  return v_3;
+  VertexOutput v_6 = (VertexOutput)0;
+  v_6.pos = (0.0f).xxxx;
+  v_6.prevent_dce = textureLoad_f7136f();
+  VertexOutput v_7 = v_6;
+  return v_7;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_4 = vertex_main_inner();
-  vertex_main_outputs v_5 = {v_4.prevent_dce, v_4.pos};
-  return v_5;
+  VertexOutput v_8 = vertex_main_inner();
+  vertex_main_outputs v_9 = {v_8.prevent_dce, v_8.pos};
+  return v_9;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.dxc.hlsl
index d3820f2..377a391 100644
--- a/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.dxc.hlsl
@@ -7,8 +7,13 @@
 float textureLoad_fcd23d() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float res = arg_0.Load(int2(arg_1), v).x;
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float res = arg_0.Load(v_4, int(v_3)).x;
   return res;
 }
 
@@ -25,8 +30,13 @@
 float textureLoad_fcd23d() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float res = arg_0.Load(int2(arg_1), v).x;
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float res = arg_0.Load(v_4, int(v_3)).x;
   return res;
 }
 
@@ -53,22 +63,27 @@
 float textureLoad_fcd23d() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float res = arg_0.Load(int2(arg_1), v).x;
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float res = arg_0.Load(v_4, int(v_3)).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_fcd23d();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_fcd23d();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.fxc.hlsl
index d3820f2..377a391 100644
--- a/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/fcd23d.wgsl.expected.fxc.hlsl
@@ -7,8 +7,13 @@
 float textureLoad_fcd23d() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float res = arg_0.Load(int2(arg_1), v).x;
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float res = arg_0.Load(v_4, int(v_3)).x;
   return res;
 }
 
@@ -25,8 +30,13 @@
 float textureLoad_fcd23d() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float res = arg_0.Load(int2(arg_1), v).x;
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float res = arg_0.Load(v_4, int(v_3)).x;
   return res;
 }
 
@@ -53,22 +63,27 @@
 float textureLoad_fcd23d() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  float res = arg_0.Load(int2(arg_1), v).x;
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  float res = arg_0.Load(v_4, int(v_3)).x;
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_fcd23d();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_fcd23d();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.dxc.hlsl
index 25258ea..2ea820f 100644
--- a/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.dxc.hlsl
@@ -7,8 +7,13 @@
 uint4 textureLoad_fe0565() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  uint4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  uint4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -25,8 +30,13 @@
 uint4 textureLoad_fe0565() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  uint4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  uint4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -53,22 +63,27 @@
 uint4 textureLoad_fe0565() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  uint4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  uint4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_fe0565();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_fe0565();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.fxc.hlsl
index 25258ea..2ea820f 100644
--- a/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/fe0565.wgsl.expected.fxc.hlsl
@@ -7,8 +7,13 @@
 uint4 textureLoad_fe0565() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  uint4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  uint4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -25,8 +30,13 @@
 uint4 textureLoad_fe0565() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  uint4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  uint4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
@@ -53,22 +63,27 @@
 uint4 textureLoad_fe0565() {
   uint2 arg_1 = (1u).xx;
   int arg_2 = int(1);
-  int v = arg_2;
-  uint4 res = arg_0.Load(int2(arg_1), v);
+  uint2 v = arg_1;
+  uint3 v_1 = (0u).xxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z);
+  uint v_2 = (v_1.z - 1u);
+  uint v_3 = min(uint(arg_2), v_2);
+  int2 v_4 = int2(v);
+  uint4 res = arg_0.Load(v_4, int(v_3));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_1 = (VertexOutput)0;
-  v_1.pos = (0.0f).xxxx;
-  v_1.prevent_dce = textureLoad_fe0565();
-  VertexOutput v_2 = v_1;
-  return v_2;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_fe0565();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_3 = vertex_main_inner();
-  vertex_main_outputs v_4 = {v_3.prevent_dce, v_3.pos};
-  return v_4;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.dxc.hlsl
index 88734bf..7a48ca2 100644
--- a/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.dxc.hlsl
@@ -9,10 +9,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  int4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  int4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -31,10 +33,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  int4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  int4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -63,24 +67,26 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  int4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  int4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_4 = (VertexOutput)0;
-  v_4.pos = (0.0f).xxxx;
-  v_4.prevent_dce = textureLoad_fef2ed();
-  VertexOutput v_5 = v_4;
-  return v_5;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_fef2ed();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_6 = vertex_main_inner();
-  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
-  return v_7;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }
 
diff --git a/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.fxc.hlsl
index 88734bf..7a48ca2 100644
--- a/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureLoad/fef2ed.wgsl.expected.fxc.hlsl
@@ -9,10 +9,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  int4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  int4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -31,10 +33,12 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  int4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  int4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
@@ -63,24 +67,26 @@
   uint arg_2 = 1u;
   uint arg_3 = 1u;
   uint v = arg_2;
-  uint v_1 = arg_3;
-  int2 v_2 = int2(arg_1);
-  int3 v_3 = int3(v_2, int(v));
-  int4 res = arg_0.Load(v_3, int(v_1));
+  uint4 v_1 = (0u).xxxx;
+  arg_0.GetDimensions(v_1.x, v_1.y, v_1.z, v_1.w);
+  uint v_2 = min(arg_3, (v_1.w - 1u));
+  int2 v_3 = int2(arg_1);
+  int3 v_4 = int3(v_3, int(v));
+  int4 res = arg_0.Load(v_4, int(v_2));
   return res;
 }
 
 VertexOutput vertex_main_inner() {
-  VertexOutput v_4 = (VertexOutput)0;
-  v_4.pos = (0.0f).xxxx;
-  v_4.prevent_dce = textureLoad_fef2ed();
-  VertexOutput v_5 = v_4;
-  return v_5;
+  VertexOutput v_5 = (VertexOutput)0;
+  v_5.pos = (0.0f).xxxx;
+  v_5.prevent_dce = textureLoad_fef2ed();
+  VertexOutput v_6 = v_5;
+  return v_6;
 }
 
 vertex_main_outputs vertex_main() {
-  VertexOutput v_6 = vertex_main_inner();
-  vertex_main_outputs v_7 = {v_6.prevent_dce, v_6.pos};
-  return v_7;
+  VertexOutput v_7 = vertex_main_inner();
+  vertex_main_outputs v_8 = {v_7.prevent_dce, v_7.pos};
+  return v_8;
 }