[tint] MSL texture array negative integer clamp

Bug:356415014
Change-Id: I9f9f80b286670fe31bef94f6b81d20f57d82e0ce
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/202355
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/dawn/tests/end2end/TextureViewTests.cpp b/src/dawn/tests/end2end/TextureViewTests.cpp
index 2d4803d..af00dab 100644
--- a/src/dawn/tests/end2end/TextureViewTests.cpp
+++ b/src/dawn/tests/end2end/TextureViewTests.cpp
@@ -27,6 +27,7 @@
 
 #include <algorithm>
 #include <array>
+#include <cstdint>
 #include <string>
 #include <vector>
 
@@ -303,7 +304,8 @@
         Verify(textureView, fragmentShader, expected);
     }
 
-    std::string CreateFragmentShaderForCubeMapFace(uint32_t layer, bool isCubeMapArray) {
+    template <typename T>
+    std::string CreateFragmentShaderForCubeMapFace(T layer, bool isCubeMapArray) {
         // Reference: https://en.wikipedia.org/wiki/Cube_mapping
         const std::array<std::string, 6> kCoordsToCubeMapFace = {{
             " 1.,  tc, -sc",  // Positive X
@@ -315,8 +317,9 @@
         }};
 
         const std::string textureType = isCubeMapArray ? "texture_cube_array" : "texture_cube";
-        const uint32_t cubeMapArrayIndex = layer / 6;
-        const std::string coordToCubeMapFace = kCoordsToCubeMapFace[layer % 6];
+        const T cubeMapArrayIndex = layer / 6;
+        // We clamp here to avoid invalid negative indices for signed type T.
+        const std::string coordToCubeMapFace = kCoordsToCubeMapFace[std::max(T(0), (layer % 6))];
 
         std::ostringstream stream;
         stream << R"(
@@ -412,6 +415,73 @@
     Verify(textureView, fragmentShader, expected);
 }
 
+// Test sampling a 2D array with negative signed array index.
+TEST_P(TextureViewSamplingTest, 2DArrayTextureSignedNegativeIndex) {
+    // TODO(cwallez@chromium.org) understand what the issue is
+    DAWN_SUPPRESS_TEST_IF(IsVulkan() && IsNvidia());
+    constexpr int32_t kIntentionalInvalidNegativeIndex = -1;
+    constexpr uint32_t kLayers = 3;
+    for (int32_t array_idx = kIntentionalInvalidNegativeIndex;
+         array_idx < static_cast<int32_t>(kLayers); array_idx++) {
+        constexpr uint32_t kMipLevels = 1;
+        InitTexture(kLayers, kMipLevels);
+
+        wgpu::TextureViewDescriptor descriptor;
+        // (Off-topic) spot-test for defaulting of .aspect.
+        descriptor.aspect = wgpu::TextureAspect::Undefined;
+        descriptor.dimension = wgpu::TextureViewDimension::e2DArray;
+        wgpu::TextureView textureView = mTexture.CreateView(&descriptor);
+
+        std::ostringstream fragmentShader;
+        fragmentShader << R"(
+            @group(0) @binding(0) var sampler0 : sampler;
+            @group(0) @binding(1) var texture0 : texture_2d_array<f32>;
+
+            @fragment
+            fn main(@location(0) texCoord : vec2f) -> @location(0) vec4f {
+                let array_idx : i32 =  )"
+                       << array_idx << R"(;
+                return textureSample(texture0, sampler0, texCoord, array_idx);
+            }
+        )";
+
+        const int expected =
+            GenerateTestPixelValue(std::clamp(array_idx, 0, static_cast<int32_t>(kLayers - 1)), 0);
+        Verify(textureView, fragmentShader.str().c_str(), expected);
+    }
+}
+
+// Test sampling cube array with negative signed array index.
+TEST_P(TextureViewSamplingTest, CubeArrayTextureSignedNegativeIndex) {
+    // TODO(cwallez@chromium.org) understand what the issue is
+    DAWN_SUPPRESS_TEST_IF(IsVulkan() && IsNvidia());
+    // Cube map arrays are unsupported in Compatbility mode.
+    DAWN_TEST_UNSUPPORTED_IF(IsCompatibilityMode());
+    constexpr bool kIsCubeMapArray = true;
+    constexpr uint32_t kTextureViewLayerCount = 12;
+    constexpr uint32_t kTextureArrayLayers = kTextureViewLayerCount;
+
+    ASSERT_TRUE(kTextureViewLayerCount % 6 == 0);
+    wgpu::TextureViewDimension dimension = wgpu::TextureViewDimension::CubeArray;
+    constexpr uint32_t kMipLevels = 1u;
+    InitTexture(kTextureArrayLayers, kMipLevels, dimension);
+
+    wgpu::TextureViewDescriptor descriptor = mDefaultTextureViewDescriptor;
+    descriptor.dimension = dimension;
+    descriptor.arrayLayerCount = kTextureViewLayerCount;
+    wgpu::TextureView cubeMapTextureView = mTexture.CreateView(&descriptor);
+
+    // Check the data in the every face of the cube map (array) texture view.
+    constexpr int kIntentionalInvalidNegativeIndex = -kTextureViewLayerCount;
+    for (int layer = kIntentionalInvalidNegativeIndex;
+         layer < static_cast<int>(kTextureArrayLayers); ++layer) {
+        const std::string& fragmentShader =
+            CreateFragmentShaderForCubeMapFace(layer, kIsCubeMapArray);
+        int expected = GenerateTestPixelValue(std::max(0, layer), 0);
+        Verify(cubeMapTextureView, fragmentShader.c_str(), expected);
+    }
+}
+
 // Test sampling from a 2D texture view created on a 2D array texture.
 TEST_P(TextureViewSamplingTest, Texture2DViewOn2DArrayTexture) {
     DAWN_TEST_UNSUPPORTED_IF(IsCompatibilityMode());
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 2d343ec1..78d4dcb 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -1333,23 +1333,27 @@
     }
 
     bool lod_param_is_named = true;
-
+    bool is_gather_or_sample = false;
     switch (builtin->Fn()) {
         case wgsl::BuiltinFn::kTextureSample:
         case wgsl::BuiltinFn::kTextureSampleBias:
         case wgsl::BuiltinFn::kTextureSampleLevel:
         case wgsl::BuiltinFn::kTextureSampleGrad:
             out << ".sample(";
+            is_gather_or_sample = true;
             break;
         case wgsl::BuiltinFn::kTextureSampleCompare:
         case wgsl::BuiltinFn::kTextureSampleCompareLevel:
             out << ".sample_compare(";
+            is_gather_or_sample = true;
             break;
         case wgsl::BuiltinFn::kTextureGather:
             out << ".gather(";
+            is_gather_or_sample = true;
             break;
         case wgsl::BuiltinFn::kTextureGatherCompare:
             out << ".gather_compare(";
+            is_gather_or_sample = true;
             break;
         case wgsl::BuiltinFn::kTextureLoad:
             out << ".read(";
@@ -1376,9 +1380,9 @@
             maybe_write_comma();
 
             // Cast the coordinates to unsigned integers if necessary.
-            bool casted = false;
+            bool inside_params = false;
             if (usage == Usage::kCoords && e->Type()->UnwrapRef()->is_integer_scalar_or_vector()) {
-                casted = true;
+                inside_params = true;
                 switch (texture_type->dim()) {
                     case core::type::TextureDimension::k1d:
                         out << "uint(";
@@ -1389,17 +1393,24 @@
                         break;
                     case core::type::TextureDimension::k3d:
                         out << "uint3(";
+
                         break;
                     default:
                         TINT_ICE() << "unhandled texture dimensionality";
                 }
+            } else if (usage == Usage::kArrayIndex &&
+                       e->Type()->UnwrapRef()->is_signed_integer_scalar() && is_gather_or_sample) {
+                // Array index access for signed integers is zero lower bound clamped to emulate the
+                // behavior of other platforms. See crbug.com/202355.
+                out << "max(0, ";
+                inside_params = true;
             }
 
             if (!EmitExpression(out, e->Declaration())) {
                 return false;
             }
 
-            if (casted) {
+            if (inside_params) {
                 out << ")";
             }
         }
diff --git a/src/tint/lang/msl/writer/ast_printer/builtin_texture_test.cc b/src/tint/lang/msl/writer/ast_printer/builtin_texture_test.cc
index df0e583..8213b90 100644
--- a/src/tint/lang/msl/writer/ast_printer/builtin_texture_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/builtin_texture_test.cc
@@ -71,7 +71,7 @@
         case ValidTextureOverload::kGather2dOffsetF32:
             return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), int2(3, 4), component::x))";
         case ValidTextureOverload::kGather2dArrayF32:
-            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3, int2(0), component::x))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), max(0, 3), int2(0), component::x))";
         case ValidTextureOverload::kGather2dArrayOffsetF32:
             return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3u, int2(4, 5), component::x))";
         case ValidTextureOverload::kGatherCubeF32:
@@ -85,7 +85,7 @@
         case ValidTextureOverload::kGatherDepth2dArrayF32:
             return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3u))";
         case ValidTextureOverload::kGatherDepth2dArrayOffsetF32:
-            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3, int2(4, 5)))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), max(0, 3), int2(4, 5)))";
         case ValidTextureOverload::kGatherDepthCubeF32:
             return R"(Texture.gather(Sampler, float3(1.0f, 2.0f, 3.0f)))";
         case ValidTextureOverload::kGatherDepthCubeArrayF32:
@@ -95,9 +95,9 @@
         case ValidTextureOverload::kGatherCompareDepth2dOffsetF32:
             return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
         case ValidTextureOverload::kGatherCompareDepth2dArrayF32:
-            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f))";
+            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), max(0, 3), 4.0f))";
         case ValidTextureOverload::kGatherCompareDepth2dArrayOffsetF32:
-            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f, int2(5, 6)))";
+            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), max(0, 3), 4.0f, int2(5, 6)))";
         case ValidTextureOverload::kGatherCompareDepthCubeF32:
             return R"(Texture.gather_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
         case ValidTextureOverload::kGatherCompareDepthCubeArrayF32:
@@ -128,7 +128,7 @@
         case ValidTextureOverload::kSample2dOffsetF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), int2(3, 4)))";
         case ValidTextureOverload::kSample2dArrayF32:
-            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), max(0, 3)))";
         case ValidTextureOverload::kSample2dArrayOffsetF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3u, int2(4, 5)))";
         case ValidTextureOverload::kSample3dF32:
@@ -138,15 +138,15 @@
         case ValidTextureOverload::kSampleCubeF32:
             return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f)))";
         case ValidTextureOverload::kSampleCubeArrayF32:
-            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), max(0, 4)))";
         case ValidTextureOverload::kSampleDepth2dF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f)))";
         case ValidTextureOverload::kSampleDepth2dOffsetF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), int2(3, 4)))";
         case ValidTextureOverload::kSampleDepth2dArrayF32:
-            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), max(0, 3)))";
         case ValidTextureOverload::kSampleDepth2dArrayOffsetF32:
-            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, int2(4, 5)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), max(0, 3), int2(4, 5)))";
         case ValidTextureOverload::kSampleDepthCubeF32:
             return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f)))";
         case ValidTextureOverload::kSampleDepthCubeArrayF32:
@@ -158,7 +158,7 @@
         case ValidTextureOverload::kSampleBias2dArrayF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 4u, bias(3.0f)))";
         case ValidTextureOverload::kSampleBias2dArrayOffsetF32:
-            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, bias(4.0f), int2(5, 6)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), max(0, 3), bias(4.0f), int2(5, 6)))";
         case ValidTextureOverload::kSampleBias3dF32:
             return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f)))";
         case ValidTextureOverload::kSampleBias3dOffsetF32:
@@ -166,15 +166,15 @@
         case ValidTextureOverload::kSampleBiasCubeF32:
             return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f)))";
         case ValidTextureOverload::kSampleBiasCubeArrayF32:
-            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 3, bias(4.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), max(0, 3), bias(4.0f)))";
         case ValidTextureOverload::kSampleLevel2dF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), level(3.0f)))";
         case ValidTextureOverload::kSampleLevel2dOffsetF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), level(3.0f), int2(4, 5)))";
         case ValidTextureOverload::kSampleLevel2dArrayF32:
-            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, level(4.0f)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), max(0, 3), level(4.0f)))";
         case ValidTextureOverload::kSampleLevel2dArrayOffsetF32:
-            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, level(4.0f), int2(5, 6)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), max(0, 3), level(4.0f), int2(5, 6)))";
         case ValidTextureOverload::kSampleLevel3dF32:
             return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f)))";
         case ValidTextureOverload::kSampleLevel3dOffsetF32:
@@ -182,7 +182,7 @@
         case ValidTextureOverload::kSampleLevelCubeF32:
             return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f)))";
         case ValidTextureOverload::kSampleLevelCubeArrayF32:
-            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4, level(5.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), max(0, 4), level(5.0f)))";
         case ValidTextureOverload::kSampleLevelDepth2dF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), level(3u)))";
         case ValidTextureOverload::kSampleLevelDepth2dOffsetF32:
@@ -194,13 +194,13 @@
         case ValidTextureOverload::kSampleLevelDepthCubeF32:
             return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), level(4)))";
         case ValidTextureOverload::kSampleLevelDepthCubeArrayF32:
-            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4, level(5)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), max(0, 4), level(5)))";
         case ValidTextureOverload::kSampleGrad2dF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), gradient2d(float2(3.0f, 4.0f), float2(5.0f, 6.0f))))";
         case ValidTextureOverload::kSampleGrad2dOffsetF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), gradient2d(float2(3.0f, 4.0f), float2(5.0f, 6.0f)), int2(7)))";
         case ValidTextureOverload::kSampleGrad2dArrayF32:
-            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, gradient2d(float2(4.0f, 5.0f), float2(6.0f, 7.0f))))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), max(0, 3), gradient2d(float2(4.0f, 5.0f), float2(6.0f, 7.0f))))";
         case ValidTextureOverload::kSampleGrad2dArrayOffsetF32:
             return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3u, gradient2d(float2(4.0f, 5.0f), float2(6.0f, 7.0f)), int2(6, 7)))";
         case ValidTextureOverload::kSampleGrad3dF32:
@@ -216,25 +216,25 @@
         case ValidTextureOverload::kSampleCompareDepth2dOffsetF32:
             return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
         case ValidTextureOverload::kSampleCompareDepth2dArrayF32:
-            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 4, 3.0f))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), max(0, 4), 3.0f))";
         case ValidTextureOverload::kSampleCompareDepth2dArrayOffsetF32:
             return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 4u, 3.0f, int2(5, 6)))";
         case ValidTextureOverload::kSampleCompareDepthCubeF32:
             return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
         case ValidTextureOverload::kSampleCompareDepthCubeArrayF32:
-            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f))";
+            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), max(0, 4), 5.0f))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dF32:
             return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3.0f, level(0)))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dOffsetF32:
             return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3.0f, level(0), int2(4, 5)))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dArrayF32:
-            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f, level(0)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), max(0, 3), 4.0f, level(0)))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dArrayOffsetF32:
-            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f, level(0), int2(5, 6)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), max(0, 3), 4.0f, level(0), int2(5, 6)))";
         case ValidTextureOverload::kSampleCompareLevelDepthCubeF32:
             return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4.0f, level(0)))";
         case ValidTextureOverload::kSampleCompareLevelDepthCubeArrayF32:
-            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f, level(0)))";
+            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), max(0, 4), 5.0f, level(0)))";
         case ValidTextureOverload::kLoad1dLevelF32:
             return R"(Texture.read(uint(1u), 0))";
         case ValidTextureOverload::kLoad1dLevelU32:
diff --git a/src/tint/lang/msl/writer/raise/builtin_polyfill.cc b/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
index 4c183f4..cbcf92b 100644
--- a/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
@@ -630,6 +630,7 @@
         auto* call = b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
             builtin->DetachResult(), msl::BuiltinFn::kGather, tex, std::move(args));
         call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
@@ -642,6 +643,7 @@
             builtin->DetachResult(), msl::BuiltinFn::kGatherCompare, builtin->Args()[0],
             std::move(args));
         call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
@@ -696,6 +698,26 @@
         builtin->Destroy();
     }
 
+    /// Replace texture sample call signed integer array argument with clamped code.
+    /// @param builtin the builtin call instruction
+    void TextureSampleClampArrayIndexHelper(msl::ir::MemberBuiltinCall* builtin) {
+        // The MSL intrinsic is a member function, so we split the first argument off as the
+        // object.
+        b.InsertBefore(builtin, [&] {
+            auto* tex = builtin->Object();
+            auto* tex_type = tex->Type()->As<core::type::Texture>();
+            if (IsTextureArray(tex_type->dim())) {
+                const uint32_t kArrayIndex = 2;
+                auto* index_arg = builtin->Args()[kArrayIndex];
+                if (index_arg->Type()->is_signed_integer_scalar()) {
+                    builtin->SetArg(kArrayIndex, b.Call(ty.i32(), core::BuiltinFn::kMax, index_arg,
+                                                        b.Zero<i32>())
+                                                     ->Result(0));
+                }
+            }
+        });
+    }
+
     /// Replace a textureNumLayers call with the equivalent MSL intrinsic.
     /// @param builtin the builtin call instruction
     void TextureNumLayers(core::ir::CoreBuiltinCall* builtin) {
@@ -722,6 +744,7 @@
         auto* call = b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
             builtin->DetachResult(), msl::BuiltinFn::kSample, builtin->Args()[0], std::move(args));
         call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
@@ -741,11 +764,12 @@
                 bias_idx = 3;
             }
             args[bias_idx] = b.Construct(ty.Get<msl::type::Bias>(), args[bias_idx])->Result(0);
-
-            // Call the `sample()` member function.
-            b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
-                builtin->DetachResult(), msl::BuiltinFn::kSample, tex, std::move(args));
         });
+        // Call the `sample()` member function.
+        auto* call = b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
+            builtin->DetachResult(), msl::BuiltinFn::kSample, tex, std::move(args));
+        call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
@@ -758,6 +782,7 @@
             builtin->DetachResult(), msl::BuiltinFn::kSampleCompare, builtin->Args()[0],
             std::move(args));
         call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
@@ -780,11 +805,12 @@
             } else {
                 args.Push(lod);
             }
-
-            // Call the `sample_compare()` member function.
-            b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
-                builtin->DetachResult(), msl::BuiltinFn::kSampleCompare, tex, std::move(args));
         });
+        // Call the `sample_compare()` member function.
+        auto* call = b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
+            builtin->DetachResult(), msl::BuiltinFn::kSampleCompare, tex, std::move(args));
+        call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
@@ -833,11 +859,12 @@
                 args[args.Length() - 2] = args.Back();
             }
             args.Resize(args.Length() - 1);
-
-            // Call the `sample()` member function.
-            b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
-                builtin->DetachResult(), msl::BuiltinFn::kSample, tex, std::move(args));
         });
+        // Call the `sample()` member function.
+        auto* call = b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
+            builtin->DetachResult(), msl::BuiltinFn::kSample, tex, std::move(args));
+        call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
@@ -857,11 +884,12 @@
                 lod_idx = 3;
             }
             args[lod_idx] = b.Construct(ty.Get<msl::type::Level>(), args[lod_idx])->Result(0);
-
-            // Call the `sample()` member function.
-            b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
-                builtin->DetachResult(), msl::BuiltinFn::kSample, tex, std::move(args));
         });
+        // Call the `sample()` member function.
+        auto* call = b.MemberCallWithResult<msl::ir::MemberBuiltinCall>(
+            builtin->DetachResult(), msl::BuiltinFn::kSample, tex, std::move(args));
+        call->InsertBefore(builtin);
+        TextureSampleClampArrayIndexHelper(call);
         builtin->Destroy();
     }
 
diff --git a/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc
index d7c7dfe..a2701e4 100644
--- a/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc
@@ -2753,6 +2753,44 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(MslWriter_BuiltinPolyfillTest, TextureGather_2dArray) {
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
+    auto* s = b.FunctionParam("s", ty.sampler());
+    auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
+    auto* index = b.FunctionParam("index", ty.i32());
+    auto* func = b.Function("foo", ty.vec4<f32>());
+    func->SetParams({t, s, coords, index});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call<vec4<f32>>(core::BuiltinFn::kTextureGather, 0_u, t, s, coords, index);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %index:i32):vec4<f32> {
+  $B1: {
+    %6:vec4<f32> = textureGather 0u, %t, %s, %coords, %index
+    ret %6
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %index:i32):vec4<f32> {
+  $B1: {
+    %6:i32 = max %index, 0i
+    %7:vec4<f32> = %t.gather %s, %coords, %6, vec2<i32>(0i), 0u
+    ret %7
+  }
+}
+)";
+
+    Run(BuiltinPolyfill);
+
+    EXPECT_EQ(expect, str());
+}
+
 TEST_F(MslWriter_BuiltinPolyfillTest, TextureSampleGrad_2dArray) {
     auto* t = b.FunctionParam(
         "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
@@ -2783,8 +2821,9 @@
 %foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %index:i32, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> {
   $B1: {
     %8:msl.gradient2d = construct %ddx, %ddy
-    %9:vec4<f32> = %t.sample %s, %coords, %index, %8
-    ret %9
+    %9:i32 = max %index, 0i
+    %10:vec4<f32> = %t.sample %s, %coords, %9, %8
+    ret %10
   }
 }
 )";
diff --git a/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.ir.msl
index aac3332..7302683 100644
--- a/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_22e930(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(0), component::y);
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.msl
index 99c51b6..b7b2a05 100644
--- a/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/22e930.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_22e930(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(0), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.ir.msl
index 2699328..7e4b868 100644
--- a/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_24b0bd(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(0), component::y);
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.msl
index 953b125..21ab1f2 100644
--- a/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/24b0bd.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_24b0bd(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(0), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.ir.msl
index f2a6e1d..8c4b35a 100644
--- a/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 uint4 textureGather_2cc066(tint_module_vars_struct tint_module_vars) {
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(0), component::y);
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.msl
index ea5080e..912b774 100644
--- a/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/2cc066.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 uint4 textureGather_2cc066(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(0), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.ir.msl
index 90f27fd..4a6b6fe 100644
--- a/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_43025d(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, float3(1.0f), 1);
+  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, float3(1.0f), max(1, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.msl
index 4f5b6e3..3cac8bd 100644
--- a/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_43025d(depthcube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), 1);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), max(0, 1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.ir.msl
index e3f3fc2..6894496 100644
--- a/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 int4 textureGather_445793(tint_module_vars_struct tint_module_vars) {
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(0), component::y);
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.msl
index a047edf..eabd570 100644
--- a/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/445793.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 int4 textureGather_445793(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(0), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.ir.msl
index 2298816..7ac623b 100644
--- a/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_4b8103(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(1), component::y);
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.msl
index d7170d6..12be0d3 100644
--- a/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/4b8103.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_4b8103(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(1), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.ir.msl
index f8a20b6..1f07a02 100644
--- a/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_751f8a(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), 1, component::y);
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), max(1, 0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.msl
index c0c4bd0..b5a7b69 100644
--- a/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/751f8a.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_751f8a(texturecube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), 1, component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), max(0, 1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.ir.msl
index 0fbc4a2..8bb2634 100644
--- a/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_831549(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(1), component::y);
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.msl
index 56145ae..69e0673 100644
--- a/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/831549.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_831549(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(1), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.ir.msl
index d26eb67..07fff32 100644
--- a/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 int4 textureGather_8b754c(tint_module_vars_struct tint_module_vars) {
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(0), component::y);
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.msl
index 94b4f04..cadee86 100644
--- a/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/8b754c.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 int4 textureGather_8b754c(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(0), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.ir.msl
index acac446..ea152e3 100644
--- a/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 uint4 textureGather_92ea47(tint_module_vars_struct tint_module_vars) {
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(0), component::y);
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.msl
index 5ef2eb7..6edeca3 100644
--- a/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/92ea47.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 uint4 textureGather_92ea47(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(0), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.ir.msl
index 5f4988d..9d63631 100644
--- a/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_9a6358(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, float2(1.0f), 1, int2(0));
+  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, float2(1.0f), max(1, 0), int2(0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.msl
index 43a8578..5725bb5 100644
--- a/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_9a6358(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.ir.msl
index 899c136..bb29747 100644
--- a/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 int4 textureGather_9ab41e(tint_module_vars_struct tint_module_vars) {
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(1), component::y);
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.msl
index c1e8189..e10efe8 100644
--- a/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/9ab41e.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 int4 textureGather_9ab41e(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(1), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.ir.msl
index 055e284..7308303 100644
--- a/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 int4 textureGather_aaf6bd(tint_module_vars_struct tint_module_vars) {
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), 1, component::y);
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), max(1, 0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.msl
index cf074a6..3d1be9b 100644
--- a/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/aaf6bd.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 int4 textureGather_aaf6bd(texturecube_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  int4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), 1, component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), max(0, 1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.ir.msl
index 6dcd33a..0888244 100644
--- a/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 int4 textureGather_c0640c(tint_module_vars_struct tint_module_vars) {
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), 1, component::y);
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), max(1, 0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.msl
index e56170b..dd5b3f7 100644
--- a/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/c0640c.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 int4 textureGather_c0640c(texturecube_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  int4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), 1, component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), max(0, 1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.ir.msl
index 1bab229..8319cd9 100644
--- a/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 uint4 textureGather_d1f187(tint_module_vars_struct tint_module_vars) {
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(1), component::y);
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.msl
index 5ce95d1..7e8b741 100644
--- a/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d1f187.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 uint4 textureGather_d1f187(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(1), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.ir.msl
index 5a37b1d..6438a4f 100644
--- a/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 uint4 textureGather_d4b5c6(tint_module_vars_struct tint_module_vars) {
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), 1, component::y);
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), max(1, 0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.msl
index 4aa1e06..a690cbc 100644
--- a/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d4b5c6.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 uint4 textureGather_d4b5c6(texturecube_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), 1, component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), max(0, 1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.ir.msl
index 7e98f14..2631bab 100644
--- a/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_d90605(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, float2(1.0f), 1, int2(1));
+  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, float2(1.0f), max(1, 0), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.msl
index 29f54a7..0619ed8 100644
--- a/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d90605.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_d90605(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(1));
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.ir.msl
index 7b8ce61..dfd2f82 100644
--- a/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGather_d98d59(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), 1, component::y);
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), max(1, 0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.msl
index ee73cbc..7878f37 100644
--- a/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/d98d59.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGather_d98d59(texturecube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), 1, component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), max(0, 1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.ir.msl
index 39bd5ed..a176e6d 100644
--- a/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 uint4 textureGather_e3165f(tint_module_vars_struct tint_module_vars) {
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(1), component::y);
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.msl
index 5877370..3ec4d90 100644
--- a/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/e3165f.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 uint4 textureGather_e3165f(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(1), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.ir.msl
index 7c28b6c..af2e896 100644
--- a/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 int4 textureGather_e9d390(tint_module_vars_struct tint_module_vars) {
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), 1, int2(1), component::y);
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float2(1.0f), max(1, 0), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.msl
index f7fc434..376c286 100644
--- a/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/e9d390.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 int4 textureGather_e9d390(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), 1, int2(1), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, float2(1.0f), max(0, 1), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.ir.msl
index 8c534b6..1a36511 100644
--- a/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 uint4 textureGather_f2c6e3(tint_module_vars_struct tint_module_vars) {
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), 1, component::y);
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, float3(1.0f), max(1, 0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.msl
index a14ed65..d933e76 100644
--- a/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGather/f2c6e3.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 uint4 textureGather_f2c6e3(texturecube_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), 1, component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, float3(1.0f), max(0, 1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.ir.msl
index eac614b..21bff52 100644
--- a/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGatherCompare_60d2d1(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, float3(1.0f), 1, 1.0f);
+  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, float3(1.0f), max(1, 0), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.msl
index 4793204..22d05fb 100644
--- a/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGatherCompare_60d2d1(depthcube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, float3(1.0f), 1, 1.0f);
+  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, float3(1.0f), max(0, 1), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.ir.msl
index be5b3dd..29cc278 100644
--- a/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGatherCompare_783e65(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, float2(1.0f), 1, 1.0f);
+  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, float2(1.0f), max(1, 0), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.msl
index 0a3ce1d..8e328c4 100644
--- a/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGatherCompare_783e65(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, float2(1.0f), 1, 1.0f);
+  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, float2(1.0f), max(0, 1), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.ir.msl
index e19bff1..9821c2e 100644
--- a/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.ir.msl
@@ -18,7 +18,7 @@
 };
 
 float4 textureGatherCompare_f585cc(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, float2(1.0f), 1, 1.0f, int2(1));
+  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, float2(1.0f), max(1, 0), 1.0f, int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.msl
index a11df2c..cc5b6d4 100644
--- a/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/f585cc.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureGatherCompare_f585cc(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, float2(1.0f), 1, 1.0f, int2(1));
+  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, float2(1.0f), max(0, 1), 1.0f, int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.ir.msl
index 6a5d8df..85d6047 100644
--- a/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float4 textureSample_17e988(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, int2(1));
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), max(1, 0), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.msl
index adf23ed..b785597 100644
--- a/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSample/17e988.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSample_17e988(texture2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), 1, int2(1));
+  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), max(0, 1), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.ir.msl
index 4f21ef0..4fbca40 100644
--- a/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float4 textureSample_4dd1bf(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), 1);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), max(1, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.msl
index c996f2f..510b408 100644
--- a/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSample_4dd1bf(texturecube_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float4 res = tint_symbol.sample(tint_symbol_1, float3(1.0f), 1);
+  float4 res = tint_symbol.sample(tint_symbol_1, float3(1.0f), max(0, 1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.ir.msl
index e0a8675..6029611 100644
--- a/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float textureSample_60bf45(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, int2(1));
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), max(1, 0), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.msl
index 1eeb31d..059c590 100644
--- a/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSample/60bf45.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSample_60bf45(depth2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float res = tint_symbol.sample(tint_symbol_1, float2(1.0f), 1, int2(1));
+  float res = tint_symbol.sample(tint_symbol_1, float2(1.0f), max(0, 1), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.ir.msl
index 64ea246..d51c8af 100644
--- a/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float4 textureSample_6717ca(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), max(1, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.msl
index 5bc9911..a86ac01 100644
--- a/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSample_6717ca(texture2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), 1);
+  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), max(0, 1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.ir.msl
index 26a587d..d3e423c 100644
--- a/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float textureSample_7e9ffd(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), max(1, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.msl
index 8fac828..23ae591 100644
--- a/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSample_7e9ffd(depth2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float res = tint_symbol.sample(tint_symbol_1, float2(1.0f), 1);
+  float res = tint_symbol.sample(tint_symbol_1, float2(1.0f), max(0, 1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.ir.msl
index 5eb2efc..e6c9a16 100644
--- a/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float textureSample_c2f4e8(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), 1);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), max(1, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.msl
index f393799..c0137c9 100644
--- a/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSample_c2f4e8(depthcube_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float res = tint_symbol.sample(tint_symbol_1, float3(1.0f), 1);
+  float res = tint_symbol.sample(tint_symbol_1, float3(1.0f), max(0, 1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.ir.msl
index 75883a3..7ef023b 100644
--- a/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.ir.msl
@@ -8,7 +8,8 @@
 };
 
 float4 textureSampleBias_80e579(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, bias(1.0f));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, bias(1.0f));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.msl
index e212cc4..193fe81 100644
--- a/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleBias_80e579(texture2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), 1, bias(1.0f));
+  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), max(0, 1), bias(1.0f));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.ir.msl
index d0e58d7..3b41a41 100644
--- a/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.ir.msl
@@ -8,7 +8,8 @@
 };
 
 float4 textureSampleBias_9dbb51(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, bias(1.0f), int2(1));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, bias(1.0f), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.msl
index a4dcd7a..0765b10 100644
--- a/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleBias/9dbb51.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleBias_9dbb51(texture2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), 1, bias(1.0f), int2(1));
+  float4 res = tint_symbol.sample(tint_symbol_1, float2(1.0f), max(0, 1), bias(1.0f), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.ir.msl
index 9daaa19..a791299 100644
--- a/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.ir.msl
@@ -8,7 +8,8 @@
 };
 
 float4 textureSampleBias_eed7c4(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), 1, bias(1.0f));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), v, bias(1.0f));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.msl
index 574ae96..2c773ad 100644
--- a/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleBias_eed7c4(texturecube_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float4 res = tint_symbol.sample(tint_symbol_1, float3(1.0f), 1, bias(1.0f));
+  float4 res = tint_symbol.sample(tint_symbol_1, float3(1.0f), max(0, 1), bias(1.0f));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl
index d852f04..d278dac 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float textureSampleCompare_a3ca7e(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float3(1.0f), 1, 1.0f);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float3(1.0f), max(1, 0), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.msl
index 696d23f..be2132c 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleCompare_a3ca7e(depthcube_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float res = tint_symbol.sample_compare(tint_symbol_1, float3(1.0f), 1, 1.0f);
+  float res = tint_symbol.sample_compare(tint_symbol_1, float3(1.0f), max(0, 1), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.ir.msl
index 6354072..d85d161 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float textureSampleCompare_af1051(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), 1, 1.0f, int2(1));
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), max(1, 0), 1.0f, int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.msl
index 3f4c1e3..6ea1652 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/af1051.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleCompare_af1051(depth2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float res = tint_symbol.sample_compare(tint_symbol_1, float2(1.0f), 1, 1.0f, int2(1));
+  float res = tint_symbol.sample_compare(tint_symbol_1, float2(1.0f), max(0, 1), 1.0f, int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.ir.msl
index de7b936..60a33b8 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.ir.msl
@@ -8,7 +8,7 @@
 };
 
 float textureSampleCompare_dd431d(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), 1, 1.0f);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), max(1, 0), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.msl
index 9ae9215..61b9cb6 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleCompare_dd431d(depth2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
-  float res = tint_symbol.sample_compare(tint_symbol_1, float2(1.0f), 1, 1.0f);
+  float res = tint_symbol.sample_compare(tint_symbol_1, float2(1.0f), max(0, 1), 1.0f);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl
index c2d7778..f0ff71f 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleCompareLevel_1116ed(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), 1, 1.0f, level(0u));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), v, 1.0f, level(0u));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.msl
index 69c5469..d124244 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleCompareLevel_1116ed(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample_compare(tint_symbol_2, float2(1.0f), 1, 1.0f, level(0));
+  float res = tint_symbol_1.sample_compare(tint_symbol_2, float2(1.0f), max(0, 1), 1.0f, level(0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl
index fa252d2..41e918d 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleCompareLevel_4cf3a2(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float3(1.0f), 1, 1.0f, level(0u));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float3(1.0f), v, 1.0f, level(0u));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depthcube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
index 560521f..4529363 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleCompareLevel_4cf3a2(depthcube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample_compare(tint_symbol_2, float3(1.0f), 1, 1.0f, level(0));
+  float res = tint_symbol_1.sample_compare(tint_symbol_2, float3(1.0f), max(0, 1), 1.0f, level(0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl
index c2cb4d6..194c2d1 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleCompareLevel_b6e47c(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), 1, 1.0f, level(0u), int2(1));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, float2(1.0f), v, 1.0f, level(0u), int2(1));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.msl
index ff0b9ea..ac3ade8 100644
--- a/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/b6e47c.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleCompareLevel_b6e47c(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample_compare(tint_symbol_2, float2(1.0f), 1, 1.0f, level(0), int2(1));
+  float res = tint_symbol_1.sample_compare(tint_symbol_2, float2(1.0f), max(0, 1), 1.0f, level(0), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl
index 8e2cb64..8212c1f 100644
--- a/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float4 textureSampleGrad_2ecd8f(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, gradient2d(float2(1.0f), float2(1.0f)));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, gradient2d(float2(1.0f), float2(1.0f)));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.msl
index 2490b40..9728820 100644
--- a/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleGrad_2ecd8f(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, gradient2d(float2(1.0f), float2(1.0f)));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), gradient2d(float2(1.0f), float2(1.0f)));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.ir.msl
index ac6a132..0d3db39 100644
--- a/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float4 textureSampleGrad_d65515(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, gradient2d(float2(1.0f), float2(1.0f)), int2(1));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, gradient2d(float2(1.0f), float2(1.0f)), int2(1));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.msl
index 6750471..efb4842 100644
--- a/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/d65515.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleGrad_d65515(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, gradient2d(float2(1.0f), float2(1.0f)), int2(1));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), gradient2d(float2(1.0f), float2(1.0f)), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.ir.msl
index 7592358..cb9670c 100644
--- a/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float4 textureSampleGrad_e383db(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), 1, gradientcube(float3(1.0f), float3(1.0f)));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), v, gradientcube(float3(1.0f), float3(1.0f)));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.msl
index a5a4c71..a7beb44 100644
--- a/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleGrad_e383db(texturecube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), 1, gradientcube(float3(1.0f), float3(1.0f)));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), max(0, 1), gradientcube(float3(1.0f), float3(1.0f)));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl
index 6e8f730..b775340 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float4 textureSampleLevel_0bdd9a(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), 1, level(1.0f));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), v, level(1.0f));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.msl
index b0b37b3..775b025 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleLevel_0bdd9a(texturecube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), 1, level(1.0f));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), max(0, 1), level(1.0f));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.ir.msl
index 5b4527e2..58d8a05 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleLevel_1bf73e(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, level(1));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, level(1));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.msl
index 2fd6b6c..3b6b13d 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleLevel_1bf73e(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, level(1));
+  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), level(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.ir.msl
index 3db2ccc..5a0bcef 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleLevel_2974eb(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, level(1u));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, level(1u));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.msl
index 06253ef..938547a 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/2974eb.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleLevel_2974eb(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, level(1u));
+  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), level(1u));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.ir.msl
index 9759e41..201bdd9 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float4 textureSampleLevel_302be4(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, level(1.0f));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, level(1.0f));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.msl
index da5210a..d2d2346 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleLevel_302be4(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, level(1.0f));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), level(1.0f));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.ir.msl
index 19fd422..af202e6 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleLevel_36780e(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, level(1), int2(1));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, level(1), int2(1));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.msl
index 4b1a5b7..537767e 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/36780e.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleLevel_36780e(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, level(1), int2(1));
+  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), level(1), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.ir.msl
index 99a9955..2314109 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleLevel_36f0d3(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, level(1u), int2(1));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, level(1u), int2(1));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.msl
index 2cd6db0..99276a5 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/36f0d3.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleLevel_36f0d3(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, level(1u), int2(1));
+  float res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), level(1u), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.ir.msl
index 24b1c62..1b98327 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleLevel_a12142(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), 1, level(1u));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), v, level(1u));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depthcube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.msl
index 867b707..f667c98 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/a12142.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleLevel_a12142(depthcube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), 1, level(1u));
+  float res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), max(0, 1), level(1u));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.ir.msl
index c299dfe..4a60915 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float textureSampleLevel_ae5e39(tint_module_vars_struct tint_module_vars) {
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), 1, level(1));
+  int const v = max(1, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float3(1.0f), v, level(1));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(depthcube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.msl
index a11ee81..f2d70a0 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float textureSampleLevel_ae5e39(depthcube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), 1, level(1));
+  float res = tint_symbol_1.sample(tint_symbol_2, float3(1.0f), max(0, 1), level(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.ir.msl
index b436f05..f63c2e6 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.ir.msl
@@ -18,7 +18,8 @@
 };
 
 float4 textureSampleLevel_b7c55c(tint_module_vars_struct tint_module_vars) {
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), 1, level(1.0f), int2(1));
+  int const v = max(1, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, float2(1.0f), v, level(1.0f), int2(1));
   return res;
 }
 
@@ -41,6 +42,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.msl
index b08c2d9..d33b359 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/b7c55c.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float4 textureSampleLevel_b7c55c(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
-  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), 1, level(1.0f), int2(1));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, float2(1.0f), max(0, 1), level(1.0f), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.ir.msl
index 2b8e7ff..0440fb7 100644
--- a/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_22e930(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(0), component::y);
+  float2 const v = arg_3;
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.msl
index 39bd512..c220fb3 100644
--- a/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/22e930.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_22e930(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(0), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.ir.msl
index 54ab3ff..8779116 100644
--- a/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_24b0bd(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(0), component::y);
+  float2 const v = arg_3;
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.msl
index 29f55af..74be0e0 100644
--- a/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/24b0bd.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_24b0bd(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(0), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.ir.msl
index 3862593..1145c54 100644
--- a/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 uint4 textureGather_2cc066(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(0), component::y);
+  float2 const v = arg_3;
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<uint, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.msl
index bbaed5f..240444f 100644
--- a/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/2cc066.wgsl.expected.msl
@@ -4,7 +4,7 @@
 uint4 textureGather_2cc066(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(0), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.ir.msl
index bb92945..e9061ad 100644
--- a/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_43025d(tint_module_vars_struct tint_module_vars) {
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
-  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, arg_2, arg_3);
+  float3 const v = arg_2;
+  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, v, max(arg_3, 0));
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(depthcube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.msl
index 9d6ffe1..9e61bdd 100644
--- a/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/43025d.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_43025d(depthcube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_2, arg_3);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_2, max(0, arg_3));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.ir.msl
index ef23895..01b2fee 100644
--- a/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 int4 textureGather_445793(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(0), component::y);
+  float2 const v = arg_3;
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<int, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.msl
index ea01e10..f5520d9 100644
--- a/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/445793.wgsl.expected.msl
@@ -4,7 +4,7 @@
 int4 textureGather_445793(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(0), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.ir.msl
index a9b38ec..a3fa55b 100644
--- a/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_4b8103(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(1), component::y);
+  float2 const v = arg_3;
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(1), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.msl
index d04706f..64052f1 100644
--- a/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/4b8103.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_4b8103(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(1), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.ir.msl
index 3726b9d..af91a09 100644
--- a/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_751f8a(tint_module_vars_struct tint_module_vars) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, component::y);
+  float3 const v = arg_3;
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.msl
index 7eb8ffa..a9f43ef 100644
--- a/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/751f8a.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_751f8a(texturecube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.ir.msl
index 6e45514..c51ce9b 100644
--- a/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_831549(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(1), component::y);
+  float2 const v = arg_3;
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(1), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.msl
index e980ed0..19d2f51 100644
--- a/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/831549.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_831549(texture2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(1), component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.ir.msl
index 5e9adaa..b9a59a5 100644
--- a/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 int4 textureGather_8b754c(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(0), component::y);
+  float2 const v = arg_3;
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<int, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.msl
index f236747..76bf039 100644
--- a/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/8b754c.wgsl.expected.msl
@@ -4,7 +4,7 @@
 int4 textureGather_8b754c(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(0), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.ir.msl
index a2563f9..62514d2 100644
--- a/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 uint4 textureGather_92ea47(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(0), component::y);
+  float2 const v = arg_3;
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<uint, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.msl
index 3668f89..166382b 100644
--- a/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/92ea47.wgsl.expected.msl
@@ -4,7 +4,7 @@
 uint4 textureGather_92ea47(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(0), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(0), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.ir.msl
index cdda74a..3e9fece 100644
--- a/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_9a6358(tint_module_vars_struct tint_module_vars) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, arg_2, arg_3, int2(0));
+  float2 const v = arg_2;
+  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, v, max(arg_3, 0), int2(0));
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.msl
index 7115281..72aa4a2 100644
--- a/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/9a6358.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_9a6358(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_2, arg_3);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_2, max(0, arg_3));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.ir.msl
index 59b0571..53b6a40 100644
--- a/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 int4 textureGather_9ab41e(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(1), component::y);
+  float2 const v = arg_3;
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(1), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<int, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.msl
index f93f335..db36a7f 100644
--- a/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/9ab41e.wgsl.expected.msl
@@ -4,7 +4,7 @@
 int4 textureGather_9ab41e(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(1), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.ir.msl
index 4b0b02b..0757983 100644
--- a/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 int4 textureGather_aaf6bd(tint_module_vars_struct tint_module_vars) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, component::y);
+  float3 const v = arg_3;
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<int, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.msl
index 6579150..0011204 100644
--- a/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/aaf6bd.wgsl.expected.msl
@@ -4,7 +4,7 @@
 int4 textureGather_aaf6bd(texturecube_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.ir.msl
index 7b721be..ba8564e 100644
--- a/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 int4 textureGather_c0640c(tint_module_vars_struct tint_module_vars) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, component::y);
+  float3 const v = arg_3;
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<int, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.msl
index 9f83975..741fe94 100644
--- a/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/c0640c.wgsl.expected.msl
@@ -4,7 +4,7 @@
 int4 textureGather_c0640c(texturecube_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.ir.msl
index 5a6300d..1fdd65c 100644
--- a/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 uint4 textureGather_d1f187(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(1), component::y);
+  float2 const v = arg_3;
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(1), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<uint, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.msl
index 59afc42..c803d00 100644
--- a/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/d1f187.wgsl.expected.msl
@@ -4,7 +4,7 @@
 uint4 textureGather_d1f187(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(1), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.ir.msl
index c54bce1..db1c52d 100644
--- a/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 uint4 textureGather_d4b5c6(tint_module_vars_struct tint_module_vars) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, component::y);
+  float3 const v = arg_3;
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<uint, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.msl
index f7d95fa..e18ed18 100644
--- a/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/d4b5c6.wgsl.expected.msl
@@ -4,7 +4,7 @@
 uint4 textureGather_d4b5c6(texturecube_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.ir.msl
index 9b3276f..efbf4fa 100644
--- a/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_d90605(tint_module_vars_struct tint_module_vars) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, arg_2, arg_3, int2(1));
+  float2 const v = arg_2;
+  float4 res = tint_module_vars.arg_0.gather(tint_module_vars.arg_1, v, max(arg_3, 0), int2(1));
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.msl
index 974c40e..8fdc41e 100644
--- a/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/d90605.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_d90605(depth2d_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_2, arg_3, int2(1));
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_2, max(0, arg_3), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.ir.msl
index f6e376c..80840db 100644
--- a/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 float4 textureGather_d98d59(tint_module_vars_struct tint_module_vars) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, component::y);
+  float3 const v = arg_3;
+  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.msl
index b3b4660..0996259 100644
--- a/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/d98d59.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureGather_d98d59(texturecube_array<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, component::y);
+  float4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.ir.msl
index 43750ef..55a7429 100644
--- a/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 uint4 textureGather_e3165f(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(1), component::y);
+  float2 const v = arg_3;
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(1), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<uint, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.msl
index fcc3aef..0151eb3 100644
--- a/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/e3165f.wgsl.expected.msl
@@ -4,7 +4,7 @@
 uint4 textureGather_e3165f(texture2d_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(1), component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.ir.msl
index c096219..971cc05 100644
--- a/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 int4 textureGather_e9d390(tint_module_vars_struct tint_module_vars) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, int2(1), component::y);
+  float2 const v = arg_3;
+  int4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), int2(1), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<int, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.msl
index cbc29c1..b463471 100644
--- a/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/e9d390.wgsl.expected.msl
@@ -4,7 +4,7 @@
 int4 textureGather_e9d390(texture2d_array<int, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float2 arg_3 = float2(1.0f);
   int arg_4 = 1;
-  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, int2(1), component::y);
+  int4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), int2(1), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.ir.msl
index 32de59e..03454eb 100644
--- a/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.ir.msl
@@ -20,7 +20,8 @@
 uint4 textureGather_f2c6e3(tint_module_vars_struct tint_module_vars) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, component::y);
+  float3 const v = arg_3;
+  uint4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, v, max(arg_4, 0), component::y);
   return res;
 }
 
@@ -43,6 +44,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<uint, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_1 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_1.pos, .VertexOutput_prevent_dce=v_1.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.msl
index f0e6380..03a2e4a 100644
--- a/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGather/f2c6e3.wgsl.expected.msl
@@ -4,7 +4,7 @@
 uint4 textureGather_f2c6e3(texturecube_array<uint, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   float3 arg_3 = float3(1.0f);
   int arg_4 = 1;
-  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, arg_4, component::y);
+  uint4 res = tint_symbol_1.gather(tint_symbol_2, arg_3, max(0, arg_4), component::y);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.ir.msl
index 07f16fb..72f0ec5 100644
--- a/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.ir.msl
@@ -21,7 +21,9 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, arg_2, arg_3, arg_4);
+  float3 const v = arg_2;
+  float const v_1 = arg_4;
+  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, v, max(arg_3, 0), v_1);
   return res;
 }
 
@@ -44,6 +46,6 @@
 
 vertex vertex_main_outputs vertex_main(depthcube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.msl
index 7ff5257..e2a753e 100644
--- a/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGatherCompare/60d2d1.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, arg_2, arg_3, arg_4);
+  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, arg_2, max(0, arg_3), arg_4);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.ir.msl
index ccd80bd..5e5551c 100644
--- a/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.ir.msl
@@ -21,7 +21,9 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, arg_2, arg_3, arg_4);
+  float2 const v = arg_2;
+  float const v_1 = arg_4;
+  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, v, max(arg_3, 0), v_1);
   return res;
 }
 
@@ -44,6 +46,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.msl
index f4a1d6e..155d949 100644
--- a/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGatherCompare/783e65.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, arg_2, arg_3, arg_4);
+  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, arg_2, max(0, arg_3), arg_4);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.ir.msl
index 2072969..059db85 100644
--- a/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.ir.msl
@@ -21,7 +21,9 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, arg_2, arg_3, arg_4, int2(1));
+  float2 const v = arg_2;
+  float const v_1 = arg_4;
+  float4 res = tint_module_vars.arg_0.gather_compare(tint_module_vars.arg_1, v, max(arg_3, 0), v_1, int2(1));
   return res;
 }
 
@@ -44,6 +46,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
+  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.msl b/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.msl
index 03b1db5..fbaa667 100644
--- a/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureGatherCompare/f585cc.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, arg_2, arg_3, arg_4, int2(1));
+  float4 res = tint_symbol_1.gather_compare(tint_symbol_2, arg_2, max(0, arg_3), arg_4, int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.ir.msl
index aa91b45..57fb724 100644
--- a/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.ir.msl
@@ -10,7 +10,8 @@
 float4 textureSample_17e988(tint_module_vars_struct tint_module_vars) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, arg_2, arg_3, int2(1));
+  float2 const v = arg_2;
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, max(arg_3, 0), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.msl
index cc225e4..f29b181 100644
--- a/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSample/17e988.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureSample_17e988(texture2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3, int2(1));
+  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.ir.msl
index 7497d50..3a6ed74 100644
--- a/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.ir.msl
@@ -10,7 +10,8 @@
 float4 textureSample_4dd1bf(tint_module_vars_struct tint_module_vars) {
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, arg_2, arg_3);
+  float3 const v = arg_2;
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, max(arg_3, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.msl
index 7672ce1..1b70bc8 100644
--- a/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSample/4dd1bf.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureSample_4dd1bf(texturecube_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
-  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3);
+  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.ir.msl
index da34e88..0051c40 100644
--- a/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.ir.msl
@@ -10,7 +10,8 @@
 float textureSample_60bf45(tint_module_vars_struct tint_module_vars) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, arg_2, arg_3, int2(1));
+  float2 const v = arg_2;
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, max(arg_3, 0), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.msl
index 03feeab..a81ff6a 100644
--- a/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSample/60bf45.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float textureSample_60bf45(depth2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3, int2(1));
+  float res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.ir.msl
index 5d4f0c7..0bc76f2 100644
--- a/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.ir.msl
@@ -10,7 +10,8 @@
 float4 textureSample_6717ca(tint_module_vars_struct tint_module_vars) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, arg_2, arg_3);
+  float2 const v = arg_2;
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, max(arg_3, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.msl
index 3d655d5..f689559 100644
--- a/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSample/6717ca.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float4 textureSample_6717ca(texture2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3);
+  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.ir.msl
index 4b29c08..20171b1 100644
--- a/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.ir.msl
@@ -10,7 +10,8 @@
 float textureSample_7e9ffd(tint_module_vars_struct tint_module_vars) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, arg_2, arg_3);
+  float2 const v = arg_2;
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, max(arg_3, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.msl
index 7d1ccdc..53bee20 100644
--- a/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSample/7e9ffd.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float textureSample_7e9ffd(depth2d_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
-  float res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3);
+  float res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.ir.msl
index af5fd2c..a62f881 100644
--- a/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.ir.msl
@@ -10,7 +10,8 @@
 float textureSample_c2f4e8(tint_module_vars_struct tint_module_vars) {
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, arg_2, arg_3);
+  float3 const v = arg_2;
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, max(arg_3, 0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.msl
index 4671a97..dea931b 100644
--- a/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSample/c2f4e8.wgsl.expected.msl
@@ -4,7 +4,7 @@
 float textureSample_c2f4e8(depthcube_array<float, access::sample> tint_symbol, sampler tint_symbol_1) {
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
-  float res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3);
+  float res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.ir.msl
index 79bf641..655309f 100644
--- a/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.ir.msl
@@ -12,8 +12,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, bias(arg_4));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, bias(v_1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.msl
index e9b06da..5331aee 100644
--- a/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleBias/80e579.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3, bias(arg_4));
+  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3), bias(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.ir.msl
index ab540ae..f5de147 100644
--- a/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.ir.msl
@@ -12,8 +12,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, bias(arg_4), int2(1));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, bias(v_1), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.msl
index 2e21ad0..536e8a8 100644
--- a/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleBias/9dbb51.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3, bias(arg_4), int2(1));
+  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3), bias(arg_4), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.ir.msl
index 5f87461..2c47079 100644
--- a/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.ir.msl
@@ -12,8 +12,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float3 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, bias(arg_4));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, bias(v_1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.msl
index 1afa267..344637b 100644
--- a/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleBias/eed7c4.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, arg_3, bias(arg_4));
+  float4 res = tint_symbol.sample(tint_symbol_1, arg_2, max(0, arg_3), bias(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl
index fae0ad9..bf27600 100644
--- a/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.ir.msl
@@ -11,7 +11,9 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, arg_2, arg_3, arg_4);
+  float3 const v = arg_2;
+  float const v_1 = arg_4;
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, max(arg_3, 0), v_1);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.msl
index ff4ab86..2188699 100644
--- a/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompare/a3ca7e.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_symbol.sample_compare(tint_symbol_1, arg_2, arg_3, arg_4);
+  float res = tint_symbol.sample_compare(tint_symbol_1, arg_2, max(0, arg_3), arg_4);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.ir.msl
index 5cdb57e..2951fd5 100644
--- a/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.ir.msl
@@ -11,7 +11,9 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, arg_2, arg_3, arg_4, int2(1));
+  float2 const v = arg_2;
+  float const v_1 = arg_4;
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, max(arg_3, 0), v_1, int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.msl
index 6e7b670..1f15a23 100644
--- a/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompare/af1051.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_symbol.sample_compare(tint_symbol_1, arg_2, arg_3, arg_4, int2(1));
+  float res = tint_symbol.sample_compare(tint_symbol_1, arg_2, max(0, arg_3), arg_4, int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.ir.msl
index 680526d..f795d83 100644
--- a/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.ir.msl
@@ -11,7 +11,9 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, arg_2, arg_3, arg_4);
+  float2 const v = arg_2;
+  float const v_1 = arg_4;
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, max(arg_3, 0), v_1);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.msl
index bc6fe9f..1c71a7e 100644
--- a/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompare/dd431d.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_symbol.sample_compare(tint_symbol_1, arg_2, arg_3, arg_4);
+  float res = tint_symbol.sample_compare(tint_symbol_1, arg_2, max(0, arg_3), arg_4);
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl
index 523b58d..620253e 100644
--- a/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.ir.msl
@@ -22,9 +22,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float const v_2 = arg_4;
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, v_1, v_2, level(0u));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, v_2, v_1, level(0u));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.msl
index 50c96fc..ed14939 100644
--- a/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompareLevel/1116ed.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_symbol_1.sample_compare(tint_symbol_2, arg_2, arg_3, arg_4, level(0));
+  float res = tint_symbol_1.sample_compare(tint_symbol_2, arg_2, max(0, arg_3), arg_4, level(0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl
index 59094aa..5ac1bc1 100644
--- a/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.ir.msl
@@ -22,9 +22,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float3 const v = arg_2;
-  int const v_1 = arg_3;
-  float const v_2 = arg_4;
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, v_1, v_2, level(0u));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, v_2, v_1, level(0u));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
index 508fd29..fb72d19 100644
--- a/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_symbol_1.sample_compare(tint_symbol_2, arg_2, arg_3, arg_4, level(0));
+  float res = tint_symbol_1.sample_compare(tint_symbol_2, arg_2, max(0, arg_3), arg_4, level(0));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl
index 549d6a7..87be381 100644
--- a/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.ir.msl
@@ -22,9 +22,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float const v_2 = arg_4;
-  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, v_1, v_2, level(0u), int2(1));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, v_2, v_1, level(0u), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.msl
index 1131156..7162566 100644
--- a/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompareLevel/b6e47c.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float res = tint_symbol_1.sample_compare(tint_symbol_2, arg_2, arg_3, arg_4, level(0), int2(1));
+  float res = tint_symbol_1.sample_compare(tint_symbol_2, arg_2, max(0, arg_3), arg_4, level(0), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl
index cf60369..bcb88b5 100644
--- a/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.ir.msl
@@ -23,8 +23,10 @@
   float2 arg_4 = float2(1.0f);
   float2 arg_5 = float2(1.0f);
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, gradient2d(arg_4, arg_5));
+  float2 const v_1 = arg_4;
+  float2 const v_2 = arg_5;
+  int const v_3 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_3, gradient2d(v_1, v_2));
   return res;
 }
 
@@ -47,6 +49,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_4 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_4.pos, .VertexOutput_prevent_dce=v_4.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.msl
index 88957e1..c3beb78 100644
--- a/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleGrad/2ecd8f.wgsl.expected.msl
@@ -6,7 +6,7 @@
   int arg_3 = 1;
   float2 arg_4 = float2(1.0f);
   float2 arg_5 = float2(1.0f);
-  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, gradient2d(arg_4, arg_5));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), gradient2d(arg_4, arg_5));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.ir.msl
index 6919b66..0f72063 100644
--- a/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.ir.msl
@@ -23,8 +23,10 @@
   float2 arg_4 = float2(1.0f);
   float2 arg_5 = float2(1.0f);
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, gradient2d(arg_4, arg_5), int2(1));
+  float2 const v_1 = arg_4;
+  float2 const v_2 = arg_5;
+  int const v_3 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_3, gradient2d(v_1, v_2), int2(1));
   return res;
 }
 
@@ -47,6 +49,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_4 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_4.pos, .VertexOutput_prevent_dce=v_4.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.msl
index 4e5abbd..168f5d6 100644
--- a/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleGrad/d65515.wgsl.expected.msl
@@ -6,7 +6,7 @@
   int arg_3 = 1;
   float2 arg_4 = float2(1.0f);
   float2 arg_5 = float2(1.0f);
-  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, gradient2d(arg_4, arg_5), int2(1));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), gradient2d(arg_4, arg_5), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.ir.msl
index adb7f99..a3b3dff 100644
--- a/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.ir.msl
@@ -23,8 +23,10 @@
   float3 arg_4 = float3(1.0f);
   float3 arg_5 = float3(1.0f);
   float3 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, gradientcube(arg_4, arg_5));
+  float3 const v_1 = arg_4;
+  float3 const v_2 = arg_5;
+  int const v_3 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_3, gradientcube(v_1, v_2));
   return res;
 }
 
@@ -47,6 +49,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_4 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_4.pos, .VertexOutput_prevent_dce=v_4.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.msl
index 124d75d..aa8319d 100644
--- a/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleGrad/e383db.wgsl.expected.msl
@@ -6,7 +6,7 @@
   int arg_3 = 1;
   float3 arg_4 = float3(1.0f);
   float3 arg_5 = float3(1.0f);
-  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, gradientcube(arg_4, arg_5));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), gradientcube(arg_4, arg_5));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl
index 5cd60cf..6a54f81 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float3 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(texturecube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.msl
index ae769b0..cc781d6 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/0bdd9a.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.ir.msl
index 5006dcc..0854d5a 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   int arg_4 = 1;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4));
+  int const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.msl
index 83d0adf..90f4ac4 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/1bf73e.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   int arg_4 = 1;
-  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4));
+  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.ir.msl
index e517d93..88a1627 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   uint arg_4 = 1u;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4));
+  uint const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.msl
index 9307550..c269b62 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/2974eb.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   uint arg_4 = 1u;
-  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4));
+  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.ir.msl
index 62425d1..6e4bbba 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.msl
index cce22ea..77360bc 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/302be4.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.ir.msl
index 5d3dca9..0fcba23 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   int arg_4 = 1;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4), int2(1));
+  int const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1), int2(1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.msl
index 6cc47a5..5ed2a1d 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/36780e.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   int arg_4 = 1;
-  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4), int2(1));
+  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.ir.msl
index df5de67..41c72c2 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   uint arg_4 = 1u;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4), int2(1));
+  uint const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1), int2(1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(depth2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.msl
index 65a3003..68226b0 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/36f0d3.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   uint arg_4 = 1u;
-  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4), int2(1));
+  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4), int2(1));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.ir.msl
index 6d82e71..25528c7 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   uint arg_4 = 1u;
   float3 const v = arg_2;
-  int const v_1 = arg_3;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4));
+  uint const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(depthcube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.msl
index 3ae2168..0067554 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/a12142.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   uint arg_4 = 1u;
-  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4));
+  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.ir.msl
index 9ec01a8..db55e54 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   int arg_4 = 1;
   float3 const v = arg_2;
-  int const v_1 = arg_3;
-  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4));
+  int const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(depthcube_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.msl
index 9edc416..961761a 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/ae5e39.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float3 arg_2 = float3(1.0f);
   int arg_3 = 1;
   int arg_4 = 1;
-  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4));
+  float res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4));
   return res;
 }
 
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.ir.msl
index ce79e74..301b77b 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.ir.msl
@@ -22,8 +22,9 @@
   int arg_3 = 1;
   float arg_4 = 1.0f;
   float2 const v = arg_2;
-  int const v_1 = arg_3;
-  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_1, level(arg_4), int2(1));
+  float const v_1 = arg_4;
+  int const v_2 = max(arg_3, 0);
+  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v, v_2, level(v_1), int2(1));
   return res;
 }
 
@@ -46,6 +47,6 @@
 
 vertex vertex_main_outputs vertex_main(texture2d_array<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
-  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
-  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
+  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
 }
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.msl
index cd06a01..fc346b5 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/b7c55c.wgsl.expected.msl
@@ -5,7 +5,7 @@
   float2 arg_2 = float2(1.0f);
   int arg_3 = 1;
   float arg_4 = 1.0f;
-  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, arg_3, level(arg_4), int2(1));
+  float4 res = tint_symbol_1.sample(tint_symbol_2, arg_2, max(0, arg_3), level(arg_4), int2(1));
   return res;
 }