[tint] Signed integer polyfill for IR

Bug: 426999765
Change-Id: Ifd354a8f5a8099bc0ef4aee5d487401688b371c2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/249135
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
diff --git a/src/tint/lang/core/ir/transform/BUILD.bazel b/src/tint/lang/core/ir/transform/BUILD.bazel
index 94705ce..7fef8ac 100644
--- a/src/tint/lang/core/ir/transform/BUILD.bazel
+++ b/src/tint/lang/core/ir/transform/BUILD.bazel
@@ -61,6 +61,7 @@
     "rename_conflicts.cc",
     "robustness.cc",
     "shader_io.cc",
+    "signed_integer_polyfill.cc",
     "single_entry_point.cc",
     "std140.cc",
     "substitute_overrides.cc",
@@ -93,6 +94,7 @@
     "rename_conflicts.h",
     "robustness.h",
     "shader_io.h",
+    "signed_integer_polyfill.h",
     "single_entry_point.h",
     "std140.h",
     "substitute_overrides.h",
@@ -151,6 +153,7 @@
     "remove_terminator_args_test.cc",
     "rename_conflicts_test.cc",
     "robustness_test.cc",
+    "signed_integer_polyfill_test.cc",
     "single_entry_point_test.cc",
     "std140_test.cc",
     "substitute_overrides_test.cc",
diff --git a/src/tint/lang/core/ir/transform/BUILD.cmake b/src/tint/lang/core/ir/transform/BUILD.cmake
index c0cb68a..38c4c0a 100644
--- a/src/tint/lang/core/ir/transform/BUILD.cmake
+++ b/src/tint/lang/core/ir/transform/BUILD.cmake
@@ -84,6 +84,8 @@
   lang/core/ir/transform/robustness.h
   lang/core/ir/transform/shader_io.cc
   lang/core/ir/transform/shader_io.h
+  lang/core/ir/transform/signed_integer_polyfill.cc
+  lang/core/ir/transform/signed_integer_polyfill.h
   lang/core/ir/transform/single_entry_point.cc
   lang/core/ir/transform/single_entry_point.h
   lang/core/ir/transform/std140.cc
@@ -152,6 +154,7 @@
   lang/core/ir/transform/remove_terminator_args_test.cc
   lang/core/ir/transform/rename_conflicts_test.cc
   lang/core/ir/transform/robustness_test.cc
+  lang/core/ir/transform/signed_integer_polyfill_test.cc
   lang/core/ir/transform/single_entry_point_test.cc
   lang/core/ir/transform/std140_test.cc
   lang/core/ir/transform/substitute_overrides_test.cc
diff --git a/src/tint/lang/core/ir/transform/BUILD.gn b/src/tint/lang/core/ir/transform/BUILD.gn
index 9e89f0a..da17ea9 100644
--- a/src/tint/lang/core/ir/transform/BUILD.gn
+++ b/src/tint/lang/core/ir/transform/BUILD.gn
@@ -90,6 +90,8 @@
     "robustness.h",
     "shader_io.cc",
     "shader_io.h",
+    "signed_integer_polyfill.cc",
+    "signed_integer_polyfill.h",
     "single_entry_point.cc",
     "single_entry_point.h",
     "std140.cc",
@@ -152,6 +154,7 @@
       "remove_terminator_args_test.cc",
       "rename_conflicts_test.cc",
       "robustness_test.cc",
+      "signed_integer_polyfill_test.cc",
       "single_entry_point_test.cc",
       "std140_test.cc",
       "substitute_overrides_test.cc",
diff --git a/src/tint/lang/core/ir/transform/signed_integer_polyfill.cc b/src/tint/lang/core/ir/transform/signed_integer_polyfill.cc
new file mode 100644
index 0000000..e8bb1ce
--- /dev/null
+++ b/src/tint/lang/core/ir/transform/signed_integer_polyfill.cc
@@ -0,0 +1,174 @@
+// Copyright 2025 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "src/tint/lang/core/ir/transform/signed_integer_polyfill.h"
+
+#include "src/tint/lang/core/ir/builder.h"
+#include "src/tint/lang/core/ir/core_binary.h"
+#include "src/tint/lang/core/ir/module.h"
+#include "src/tint/lang/core/ir/validator.h"
+
+using namespace tint::core::fluent_types;  // NOLINT
+
+namespace tint::core::ir::transform {
+namespace {
+
+/// PIMPL state for the transform.
+struct State {
+    core::ir::Module& ir;
+    SignedIntegerPolyfillConfig cfg;
+    core::ir::Builder b{ir};
+
+    /// The type manager.
+    core::type::Manager& ty{ir.Types()};
+
+    /// Process the module.
+    void Process() {
+        Vector<core::ir::Unary*, 4> signed_int_negate_worklist;
+        Vector<core::ir::CoreBinary*, 4> signed_integer_arithmetic_worklist;
+        Vector<core::ir::CoreBinary*, 4> signed_integer_leftshift_worklist;
+        for (auto* inst : ir.Instructions()) {
+            if (auto* unary = inst->As<core::ir::Unary>()) {
+                auto op = unary->Op();
+                auto* type = unary->Val()->Type();
+                if (cfg.signed_negation && op == core::UnaryOp::kNegation &&
+                    type->IsSignedIntegerScalarOrVector()) {
+                    signed_int_negate_worklist.Push(unary);
+                }
+            } else if (auto* binary = inst->As<core::ir::CoreBinary>()) {
+                auto op = binary->Op();
+                auto* lhs_type = binary->LHS()->Type();
+                if (cfg.signed_arithmetic &&
+                    (op == core::BinaryOp::kAdd || op == core::BinaryOp::kMultiply ||
+                     op == core::BinaryOp::kSubtract) &&
+                    lhs_type->IsSignedIntegerScalarOrVector()) {
+                    signed_integer_arithmetic_worklist.Push(binary);
+                } else if (cfg.signed_shiftleft && op == core::BinaryOp::kShiftLeft &&
+                           lhs_type->IsSignedIntegerScalarOrVector()) {
+                    signed_integer_leftshift_worklist.Push(binary);
+                }
+            }
+        }
+
+        // Replace the instructions that we found.
+        for (auto* signed_int_negate : signed_int_negate_worklist) {
+            SignedIntegerNegation(signed_int_negate);
+        }
+        for (auto* signed_arith : signed_integer_arithmetic_worklist) {
+            SignedIntegerArithmetic(signed_arith);
+        }
+        for (auto* signed_shift_left : signed_integer_leftshift_worklist) {
+            SignedIntegerShiftLeft(signed_shift_left);
+        }
+    }
+
+    /// Replace a signed integer negation to avoid undefined behavior.
+    /// @param unary the unary instruction
+    void SignedIntegerNegation(core::ir::Unary* unary) {
+        // Replace `-x` with `bitcast<int>((~bitcast<uint>(x)) + 1)`.
+        auto* signed_type = unary->Result()->Type();
+        auto* unsigned_type = ty.MatchWidth(ty.u32(), signed_type);
+        b.InsertBefore(unary, [&] {
+            auto* unsigned_value = b.Bitcast(unsigned_type, unary->Val());
+            auto* complement = b.Complement(unsigned_type, unsigned_value);
+            auto* plus_one = b.Add(unsigned_type, complement, b.MatchWidth(u32(1), unsigned_type));
+            auto* result = b.Bitcast(signed_type, plus_one);
+            unary->Result()->ReplaceAllUsesWith(result->Result());
+        });
+        unary->Destroy();
+    }
+
+    /// Replace a signed integer arithmetic instruction.
+    /// @param binary the signed integer arithmetic instruction
+    void SignedIntegerArithmetic(core::ir::CoreBinary* binary) {
+        // MSL (HLSL/SPIR-V) does not define the behavior of signed integer overflow, so bitcast the
+        // operands to unsigned integers, perform the operation, and then bitcast the result back to
+        // a signed integer.
+        auto* signed_result_ty = binary->Result()->Type();
+        auto* unsigned_result_ty = ty.MatchWidth(ty.u32(), signed_result_ty);
+        auto* unsigned_lhs_ty = ty.MatchWidth(ty.u32(), binary->LHS()->Type());
+        auto* unsigned_rhs_ty = ty.MatchWidth(ty.u32(), binary->RHS()->Type());
+        b.InsertBefore(binary, [&] {
+            auto* uint_lhs = b.Bitcast(unsigned_lhs_ty, binary->LHS());
+            auto* uint_rhs = b.Bitcast(unsigned_rhs_ty, binary->RHS());
+            auto* uint_binary = b.Binary(binary->Op(), unsigned_result_ty, uint_lhs, uint_rhs);
+            auto* bitcast = b.Bitcast(signed_result_ty, uint_binary);
+            binary->Result()->ReplaceAllUsesWith(bitcast->Result());
+        });
+        binary->Destroy();
+    }
+
+    /// Replace a signed integer shift left instruction.
+    /// @param binary the signed integer shift left instruction
+    void SignedIntegerShiftLeft(core::ir::CoreBinary* binary) {
+        // Left-shifting a negative integer is undefined behavior in C++14 and therefore potentially
+        // in MSL (HLSL/SPRI-V) too, so we bitcast to an unsigned integer, perform the shift, and
+        // bitcast the result back to a signed integer.
+        auto* signed_ty = binary->Result()->Type();
+        auto* unsigned_ty = ty.MatchWidth(ty.u32(), signed_ty);
+        b.InsertBefore(binary, [&] {
+            auto* unsigned_lhs = b.Bitcast(unsigned_ty, binary->LHS());
+            auto* unsigned_binary =
+                b.Binary(binary->Op(), unsigned_ty, unsigned_lhs, binary->RHS());
+            auto* bitcast = b.Bitcast(signed_ty, unsigned_binary);
+            binary->Result()->ReplaceAllUsesWith(bitcast->Result());
+        });
+        binary->Destroy();
+    }
+};
+
+}  // namespace
+
+Result<SuccessType> SignedIntegerPolyfill(core::ir::Module& ir,
+                                          const SignedIntegerPolyfillConfig& cfg) {
+    auto result =
+        ValidateAndDumpIfNeeded(ir, "ir.SignedIntegerPolyfill",
+                                core::ir::Capabilities{
+                                    core::ir::Capability::kAllowPointersAndHandlesInStructures,
+                                    core::ir::Capability::kAllowDuplicateBindings,
+                                    core::ir::Capability::kAllow8BitIntegers,
+                                    core::ir::Capability::kAllow64BitIntegers,
+                                    core::ir::Capability::kAllowVectorElementPointer,
+                                    core::ir::Capability::kAllowHandleVarsWithoutBindings,
+                                    core::ir::Capability::kAllowClipDistancesOnF32,
+                                    core::ir::Capability::kAllowPrivateVarsInFunctions,
+                                    core::ir::Capability::kAllowAnyLetType,
+                                    core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint,
+                                    core::ir::Capability::kAllowModuleScopeLets,
+                                    core::ir::Capability::kAllowAnyInputAttachmentIndexType,
+                                    core::ir::Capability::kAllowNonCoreTypes,
+                                });
+    if (result != Success) {
+        return result.Failure();
+    }
+
+    State{ir, cfg}.Process();
+
+    return Success;
+}
+
+}  // namespace tint::core::ir::transform
diff --git a/src/tint/lang/core/ir/transform/signed_integer_polyfill.h b/src/tint/lang/core/ir/transform/signed_integer_polyfill.h
new file mode 100644
index 0000000..2cd5f0f
--- /dev/null
+++ b/src/tint/lang/core/ir/transform/signed_integer_polyfill.h
@@ -0,0 +1,65 @@
+// Copyright 2025 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_SIGNED_INTEGER_POLYFILL_H_
+#define SRC_TINT_LANG_CORE_IR_TRANSFORM_SIGNED_INTEGER_POLYFILL_H_
+
+#include "src/tint/lang/core/ir/validator.h"
+#include "src/tint/utils/reflection.h"
+#include "src/tint/utils/result.h"
+
+// Forward declarations.
+namespace tint::core::ir {
+class Module;
+}  // namespace tint::core::ir
+
+namespace tint::core::ir::transform {
+
+/// The set of polyfills that should be applied.
+struct SignedIntegerPolyfillConfig {
+    /// Should signed negation be polyfilled to avoid integer overflow?
+    bool signed_negation = false;
+
+    /// Should signed arithmetic be polyfilled to avoid integer overflow?
+    bool signed_arithmetic = false;
+
+    /// Should signed shiftleft be polyfilled to avoid integer overflow?
+    bool signed_shiftleft = false;
+
+    /// Reflection for this class
+    TINT_REFLECT(SignedIntegerPolyfillConfig, signed_negation, signed_arithmetic, signed_shiftleft);
+};
+
+/// SignedIntegerPolyfill is a transform that replaces signed integer instructions with polyfills.
+/// @param module the module to transform
+/// @returns success or failure
+Result<SuccessType> SignedIntegerPolyfill(core::ir::Module& module,
+                                          const SignedIntegerPolyfillConfig& cfg);
+
+}  // namespace tint::core::ir::transform
+
+#endif  // SRC_TINT_LANG_CORE_IR_TRANSFORM_SIGNED_INTEGER_POLYFILL_H_
diff --git a/src/tint/lang/core/ir/transform/signed_integer_polyfill_test.cc b/src/tint/lang/core/ir/transform/signed_integer_polyfill_test.cc
new file mode 100644
index 0000000..2138882
--- /dev/null
+++ b/src/tint/lang/core/ir/transform/signed_integer_polyfill_test.cc
@@ -0,0 +1,712 @@
+// Copyright 2025 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "src/tint/lang/core/ir/transform/signed_integer_polyfill.h"
+
+#include <utility>
+
+#include "gtest/gtest.h"
+#include "src/tint/lang/core/fluent_types.h"
+#include "src/tint/lang/core/ir/transform/helper_test.h"
+
+using namespace tint::core::fluent_types;     // NOLINT
+using namespace tint::core::number_suffixes;  // NOLINT
+
+namespace tint::core::ir::transform {
+namespace {
+
+using IR_SignedIntegerPolyfillTest = core::ir::transform::TransformTest;
+
+TEST_F(IR_SignedIntegerPolyfillTest, Negation_F32) {
+    auto* value = b.FunctionParam<f32>("value");
+    auto* func = b.Function("foo", ty.f32());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Negation<f32>(value);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%value:f32):f32 {
+  $B1: {
+    %3:f32 = negation %value
+    ret %3
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{.signed_negation = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Negation_I32_Scalar) {
+    auto* value = b.FunctionParam<i32>("value");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Negation<i32>(value);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%value:i32):i32 {
+  $B1: {
+    %3:i32 = negation %value
+    ret %3
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%value:i32):i32 {
+  $B1: {
+    %3:u32 = bitcast %value
+    %4:u32 = complement %3
+    %5:u32 = add %4, 1u
+    %6:i32 = bitcast %5
+    ret %6
+  }
+}
+)";
+    SignedIntegerPolyfillConfig cfg{.signed_negation = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_Negation_I32_Scalar) {
+    auto* value = b.FunctionParam<i32>("value");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Negation<i32>(value);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%value:i32):i32 {
+  $B1: {
+    %3:i32 = negation %value
+    ret %3
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Negation_I32_Vector) {
+    auto* value = b.FunctionParam<vec4<i32>>("value");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Negation<vec4<i32>>(value);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%value:vec4<i32>):vec4<i32> {
+  $B1: {
+    %3:vec4<i32> = negation %value
+    ret %3
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%value:vec4<i32>):vec4<i32> {
+  $B1: {
+    %3:vec4<u32> = bitcast %value
+    %4:vec4<u32> = complement %3
+    %5:vec4<u32> = add %4, vec4<u32>(1u)
+    %6:vec4<i32> = bitcast %5
+    ret %6
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_negation = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_Negation_I32_Vector) {
+    auto* value = b.FunctionParam<vec4<i32>>("value");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Negation<vec4<i32>>(value);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%value:vec4<i32>):vec4<i32> {
+  $B1: {
+    %3:vec4<i32> = negation %value
+    ret %3
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntAdd_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:i32 = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:u32 = bitcast %lhs
+    %5:u32 = bitcast %rhs
+    %6:u32 = add %4, %5
+    %7:i32 = bitcast %6
+    ret %7
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_arithmetic = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntAdd_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:i32 = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntMul_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Multiply<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:i32 = mul %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:u32 = bitcast %lhs
+    %5:u32 = bitcast %rhs
+    %6:u32 = mul %4, %5
+    %7:i32 = bitcast %6
+    ret %7
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_arithmetic = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntMul_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Multiply<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:i32 = mul %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntSub_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Subtract<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:i32 = sub %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:u32 = bitcast %lhs
+    %5:u32 = bitcast %rhs
+    %6:u32 = sub %4, %5
+    %7:i32 = bitcast %6
+    ret %7
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_arithmetic = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntSub_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Subtract<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
+    %4:i32 = sub %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntAdd_Vector) {
+    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
+    auto* rhs = b.FunctionParam<vec4<i32>>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
+    %4:vec4<u32> = bitcast %lhs
+    %5:vec4<u32> = bitcast %rhs
+    %6:vec4<u32> = add %4, %5
+    %7:vec4<i32> = bitcast %6
+    ret %7
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_arithmetic = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntAdd_Vector) {
+    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
+    auto* rhs = b.FunctionParam<vec4<i32>>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntAdd_ScalarVector) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<vec4<i32>>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
+    %4:u32 = bitcast %lhs
+    %5:vec4<u32> = bitcast %rhs
+    %6:vec4<u32> = add %4, %5
+    %7:vec4<i32> = bitcast %6
+    ret %7
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_arithmetic = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntAdd_ScalarVector) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<vec4<i32>>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntAdd_VectorScalar) {
+    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
+  $B1: {
+    %4:vec4<u32> = bitcast %lhs
+    %5:u32 = bitcast %rhs
+    %6:vec4<u32> = add %4, %5
+    %7:vec4<i32> = bitcast %6
+    ret %7
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_arithmetic = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntAdd_VectorScalar) {
+    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
+    auto* rhs = b.FunctionParam<i32>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Add<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = add %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntShift_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<u32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.ShiftLeft<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
+    %4:i32 = shl %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
+    %4:u32 = bitcast %lhs
+    %5:u32 = shl %4, %rhs
+    %6:i32 = bitcast %5
+    ret %6
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_shiftleft = true};
+    Run(SignedIntegerPolyfill, cfg);
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntShift_Scalar) {
+    auto* lhs = b.FunctionParam<i32>("lhs");
+    auto* rhs = b.FunctionParam<u32>("rhs");
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.ShiftLeft<i32>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
+    %4:i32 = shl %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, IntShift_Vector) {
+    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
+    auto* rhs = b.FunctionParam<vec4<u32>>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.ShiftLeft<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:vec4<u32>):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = shl %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:vec4<u32>):vec4<i32> {
+  $B1: {
+    %4:vec4<u32> = bitcast %lhs
+    %5:vec4<u32> = shl %4, %rhs
+    %6:vec4<i32> = bitcast %5
+    ret %6
+  }
+}
+)";
+
+    SignedIntegerPolyfillConfig cfg{.signed_shiftleft = true};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(IR_SignedIntegerPolyfillTest, Disabled_IntShift_Vector) {
+    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
+    auto* rhs = b.FunctionParam<vec4<u32>>("rhs");
+    auto* func = b.Function("foo", ty.vec4<i32>());
+    func->SetParams({lhs, rhs});
+    b.Append(func->Block(), [&] {
+        auto* result = b.ShiftLeft<vec4<i32>>(lhs, rhs);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%lhs:vec4<i32>, %rhs:vec4<u32>):vec4<i32> {
+  $B1: {
+    %4:vec4<i32> = shl %lhs, %rhs
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+    SignedIntegerPolyfillConfig cfg{};
+    Run(SignedIntegerPolyfill, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
+}  // namespace
+}  // namespace tint::core::ir::transform
diff --git a/src/tint/lang/glsl/writer/access_test.cc b/src/tint/lang/glsl/writer/access_test.cc
index 1b647cc..dd874d4 100644
--- a/src/tint/lang/glsl/writer/access_test.cc
+++ b/src/tint/lang/glsl/writer/access_test.cc
@@ -2354,9 +2354,10 @@
 }
 void foo() {
   int arr[4] = int[4](0, 0, 0, 0);
-  uint v = min(uint((f() + 1)), 3u);
+  uint v = uint(f());
+  uint v_1 = min(uint(int((v + uint(1)))), 3u);
   int y = g();
-  int x = arr[v];
+  int x = arr[v_1];
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/src/tint/lang/glsl/writer/builtin_test.cc b/src/tint/lang/glsl/writer/builtin_test.cc
index 15a0364..d4f5b12 100644
--- a/src/tint/lang/glsl/writer/builtin_test.cc
+++ b/src/tint/lang/glsl/writer/builtin_test.cc
@@ -325,7 +325,7 @@
     atomicExchange(v.b, 0u);
   }
   barrier();
-  int x = atomicAdd(v.a, -(123));
+  int x = atomicAdd(v.a, int((~(uint(123)) + 1u)));
   uint y = atomicAdd(v.b, -(123u));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -1492,7 +1492,20 @@
 precision highp int;
 
 int tint_int_dot(ivec4 x, ivec4 y) {
-  return ((((x.x * y.x) + (x.y * y.y)) + (x.z * y.z)) + (x.w * y.w));
+  uint v = uint(x.x);
+  int v_1 = int((v * uint(y.x)));
+  uint v_2 = uint(x.y);
+  int v_3 = int((v_2 * uint(y.y)));
+  uint v_4 = uint(v_1);
+  int v_5 = int((v_4 + uint(v_3)));
+  uint v_6 = uint(x.z);
+  int v_7 = int((v_6 * uint(y.z)));
+  uint v_8 = uint(v_5);
+  int v_9 = int((v_8 + uint(v_7)));
+  uint v_10 = uint(x.w);
+  int v_11 = int((v_10 * uint(y.w)));
+  uint v_12 = uint(v_9);
+  return int((v_12 + uint(v_11)));
 }
 void main() {
   ivec4 x = ivec4(2);
diff --git a/src/tint/lang/glsl/writer/raise/raise.cc b/src/tint/lang/glsl/writer/raise/raise.cc
index 2baba12..f92a744 100644
--- a/src/tint/lang/glsl/writer/raise/raise.cc
+++ b/src/tint/lang/glsl/writer/raise/raise.cc
@@ -46,6 +46,7 @@
 #include "src/tint/lang/core/ir/transform/remove_terminator_args.h"
 #include "src/tint/lang/core/ir/transform/rename_conflicts.h"
 #include "src/tint/lang/core/ir/transform/robustness.h"
+#include "src/tint/lang/core/ir/transform/signed_integer_polyfill.h"
 #include "src/tint/lang/core/ir/transform/std140.h"
 #include "src/tint/lang/core/ir/transform/value_to_let.h"
 #include "src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h"
@@ -195,6 +196,11 @@
         RUN_TRANSFORM(raise::TexturePolyfill, module, tex_config);
     }
 
+    // must come before 'BitcastPolyfill' as this adds bitcasts
+    core::ir::transform::SignedIntegerPolyfillConfig signed_integer_cfg{
+        .signed_negation = true, .signed_arithmetic = true, .signed_shiftleft = true};
+    RUN_TRANSFORM(core::ir::transform::SignedIntegerPolyfill, module, signed_integer_cfg);
+
     // Must come after BuiltinPolyfill as builtins can add bitcasts
     RUN_TRANSFORM(raise::BitcastPolyfill, module);
 
diff --git a/src/tint/lang/glsl/writer/unary_test.cc b/src/tint/lang/glsl/writer/unary_test.cc
index f3e1a29..14bb73b 100644
--- a/src/tint/lang/glsl/writer/unary_test.cc
+++ b/src/tint/lang/glsl/writer/unary_test.cc
@@ -106,7 +106,7 @@
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   int left = 1;
-  int val = -(left);
+  int val = int((~(uint(left)) + 1u));
 }
 )");
 }
diff --git a/src/tint/lang/hlsl/writer/raise/raise.cc b/src/tint/lang/hlsl/writer/raise/raise.cc
index 773b938..e263f2c 100644
--- a/src/tint/lang/hlsl/writer/raise/raise.cc
+++ b/src/tint/lang/hlsl/writer/raise/raise.cc
@@ -46,6 +46,7 @@
 #include "src/tint/lang/core/ir/transform/remove_terminator_args.h"
 #include "src/tint/lang/core/ir/transform/rename_conflicts.h"
 #include "src/tint/lang/core/ir/transform/robustness.h"
+#include "src/tint/lang/core/ir/transform/signed_integer_polyfill.h"
 #include "src/tint/lang/core/ir/transform/value_to_let.h"
 #include "src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h"
 #include "src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h"
@@ -248,6 +249,15 @@
     }
 
     RUN_TRANSFORM(raise::BinaryPolyfill, module);
+
+    // TODO(crbug.com/429211395): Resolve unsigned/signed casting issues with DXC.
+    constexpr bool kEnableSignedIntegerPolyfill = false;
+    if (kEnableSignedIntegerPolyfill) {
+        core::ir::transform::SignedIntegerPolyfillConfig signed_integer_cfg{
+            .signed_negation = true, .signed_arithmetic = true, .signed_shiftleft = true};
+        RUN_TRANSFORM(core::ir::transform::SignedIntegerPolyfill, module, signed_integer_cfg);
+    }
+
     // BuiltinPolyfill must come after BinaryPolyfill and DecomposeStorageAccess as they add
     // builtins
     RUN_TRANSFORM(raise::BuiltinPolyfill, module);
diff --git a/src/tint/lang/msl/writer/raise/BUILD.bazel b/src/tint/lang/msl/writer/raise/BUILD.bazel
index 0359e14..1507ef9 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.bazel
+++ b/src/tint/lang/msl/writer/raise/BUILD.bazel
@@ -48,7 +48,6 @@
     "raise.cc",
     "shader_io.cc",
     "simd_ballot.cc",
-    "unary_polyfill.cc",
   ],
   hdrs = [
     "argument_buffers.h",
@@ -60,7 +59,6 @@
     "raise.h",
     "shader_io.h",
     "simd_ballot.h",
-    "unary_polyfill.h",
   ],
   deps = [
     "//src/tint/api/common",
@@ -106,7 +104,6 @@
     "packed_vec3_test.cc",
     "shader_io_test.cc",
     "simd_ballot_test.cc",
-    "unary_polyfill_test.cc",
   ],
   deps = [
     "//src/tint/api/common",
diff --git a/src/tint/lang/msl/writer/raise/BUILD.cmake b/src/tint/lang/msl/writer/raise/BUILD.cmake
index 0045e2c..d1d9bcd 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.cmake
+++ b/src/tint/lang/msl/writer/raise/BUILD.cmake
@@ -59,8 +59,6 @@
   lang/msl/writer/raise/shader_io.h
   lang/msl/writer/raise/simd_ballot.cc
   lang/msl/writer/raise/simd_ballot.h
-  lang/msl/writer/raise/unary_polyfill.cc
-  lang/msl/writer/raise/unary_polyfill.h
 )
 
 tint_target_add_dependencies(tint_lang_msl_writer_raise lib
@@ -113,7 +111,6 @@
   lang/msl/writer/raise/packed_vec3_test.cc
   lang/msl/writer/raise/shader_io_test.cc
   lang/msl/writer/raise/simd_ballot_test.cc
-  lang/msl/writer/raise/unary_polyfill_test.cc
 )
 
 tint_target_add_dependencies(tint_lang_msl_writer_raise_test test
diff --git a/src/tint/lang/msl/writer/raise/BUILD.gn b/src/tint/lang/msl/writer/raise/BUILD.gn
index b065074d0..71c53fc 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.gn
+++ b/src/tint/lang/msl/writer/raise/BUILD.gn
@@ -63,8 +63,6 @@
       "shader_io.h",
       "simd_ballot.cc",
       "simd_ballot.h",
-      "unary_polyfill.cc",
-      "unary_polyfill.h",
     ]
     deps = [
       "${dawn_root}/src/utils:utils",
@@ -108,7 +106,6 @@
         "packed_vec3_test.cc",
         "shader_io_test.cc",
         "simd_ballot_test.cc",
-        "unary_polyfill_test.cc",
       ]
       deps = [
         "${dawn_root}/src/utils:utils",
diff --git a/src/tint/lang/msl/writer/raise/binary_polyfill.cc b/src/tint/lang/msl/writer/raise/binary_polyfill.cc
index 3844a78..28081a6 100644
--- a/src/tint/lang/msl/writer/raise/binary_polyfill.cc
+++ b/src/tint/lang/msl/writer/raise/binary_polyfill.cc
@@ -50,8 +50,7 @@
         // Find the binary operators that need replacing.
         Vector<core::ir::CoreBinary*, 4> fmod_worklist;
         Vector<core::ir::CoreBinary*, 4> logical_bool_worklist;
-        Vector<core::ir::CoreBinary*, 4> signed_integer_arithmetic_worklist;
-        Vector<core::ir::CoreBinary*, 4> signed_integer_leftshift_worklist;
+
         for (auto* inst : ir.Instructions()) {
             if (auto* binary = inst->As<core::ir::CoreBinary>()) {
                 auto op = binary->Op();
@@ -61,13 +60,6 @@
                 } else if ((op == core::BinaryOp::kAnd || op == core::BinaryOp::kOr) &&
                            lhs_type->IsBoolScalarOrVector()) {
                     logical_bool_worklist.Push(binary);
-                } else if ((op == core::BinaryOp::kAdd || op == core::BinaryOp::kMultiply ||
-                            op == core::BinaryOp::kSubtract) &&
-                           lhs_type->IsSignedIntegerScalarOrVector()) {
-                    signed_integer_arithmetic_worklist.Push(binary);
-                } else if (op == core::BinaryOp::kShiftLeft &&
-                           lhs_type->IsSignedIntegerScalarOrVector()) {
-                    signed_integer_leftshift_worklist.Push(binary);
                 }
             }
         }
@@ -79,12 +71,6 @@
         for (auto* logical_bool : logical_bool_worklist) {
             LogicalBool(logical_bool);
         }
-        for (auto* signed_arith : signed_integer_arithmetic_worklist) {
-            SignedIntegerArithmetic(signed_arith);
-        }
-        for (auto* signed_shift_left : signed_integer_leftshift_worklist) {
-            SignedIntegerShiftLeft(signed_shift_left);
-        }
     }
 
     /// Replace a floating point modulo binary instruction with the equivalent MSL intrinsic.
@@ -112,44 +98,6 @@
         });
         binary->Destroy();
     }
-
-    /// Replace a signed integer arithmetic instruction.
-    /// @param binary the signed integer arithmetic instruction
-    void SignedIntegerArithmetic(core::ir::CoreBinary* binary) {
-        // MSL does not define the behavior of signed integer overflow, so bitcast the operands to
-        // unsigned integers, perform the operation, and then bitcast the result back to a signed
-        // integer.
-        auto* signed_result_ty = binary->Result()->Type();
-        auto* unsigned_result_ty = ty.MatchWidth(ty.u32(), signed_result_ty);
-        auto* unsigned_lhs_ty = ty.MatchWidth(ty.u32(), binary->LHS()->Type());
-        auto* unsigned_rhs_ty = ty.MatchWidth(ty.u32(), binary->RHS()->Type());
-        b.InsertBefore(binary, [&] {
-            auto* uint_lhs = b.Bitcast(unsigned_lhs_ty, binary->LHS());
-            auto* uint_rhs = b.Bitcast(unsigned_rhs_ty, binary->RHS());
-            auto* uint_binary = b.Binary(binary->Op(), unsigned_result_ty, uint_lhs, uint_rhs);
-            auto* bitcast = b.Bitcast(signed_result_ty, uint_binary);
-            binary->Result()->ReplaceAllUsesWith(bitcast->Result());
-        });
-        binary->Destroy();
-    }
-
-    /// Replace a signed integer shift left instruction.
-    /// @param binary the signed integer shift left instruction
-    void SignedIntegerShiftLeft(core::ir::CoreBinary* binary) {
-        // Left-shifting a negative integer is undefined behavior in C++14 and therefore potentially
-        // in MSL too, so we bitcast to an unsigned integer, perform the shift, and bitcast the
-        // result back to a signed integer.
-        auto* signed_ty = binary->Result()->Type();
-        auto* unsigned_ty = ty.MatchWidth(ty.u32(), signed_ty);
-        b.InsertBefore(binary, [&] {
-            auto* unsigned_lhs = b.Bitcast(unsigned_ty, binary->LHS());
-            auto* unsigned_binary =
-                b.Binary(binary->Op(), unsigned_ty, unsigned_lhs, binary->RHS());
-            auto* bitcast = b.Bitcast(signed_ty, unsigned_binary);
-            binary->Result()->ReplaceAllUsesWith(bitcast->Result());
-        });
-        binary->Destroy();
-    }
 };
 
 }  // namespace
diff --git a/src/tint/lang/msl/writer/raise/binary_polyfill_test.cc b/src/tint/lang/msl/writer/raise/binary_polyfill_test.cc
index 5de21bf..20ceaaf 100644
--- a/src/tint/lang/msl/writer/raise/binary_polyfill_test.cc
+++ b/src/tint/lang/msl/writer/raise/binary_polyfill_test.cc
@@ -285,299 +285,5 @@
     EXPECT_EQ(expect, str());
 }
 
-TEST_F(MslWriter_BinaryPolyfillTest, IntAdd_Scalar) {
-    auto* lhs = b.FunctionParam<i32>("lhs");
-    auto* rhs = b.FunctionParam<i32>("rhs");
-    auto* func = b.Function("foo", ty.i32());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Add<i32>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 {
-  $B1: {
-    %4:i32 = add %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 {
-  $B1: {
-    %4:u32 = bitcast %lhs
-    %5:u32 = bitcast %rhs
-    %6:u32 = add %4, %5
-    %7:i32 = bitcast %6
-    ret %7
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_BinaryPolyfillTest, IntMul_Scalar) {
-    auto* lhs = b.FunctionParam<i32>("lhs");
-    auto* rhs = b.FunctionParam<i32>("rhs");
-    auto* func = b.Function("foo", ty.i32());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Multiply<i32>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 {
-  $B1: {
-    %4:i32 = mul %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 {
-  $B1: {
-    %4:u32 = bitcast %lhs
-    %5:u32 = bitcast %rhs
-    %6:u32 = mul %4, %5
-    %7:i32 = bitcast %6
-    ret %7
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_BinaryPolyfillTest, IntSub_Scalar) {
-    auto* lhs = b.FunctionParam<i32>("lhs");
-    auto* rhs = b.FunctionParam<i32>("rhs");
-    auto* func = b.Function("foo", ty.i32());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Subtract<i32>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 {
-  $B1: {
-    %4:i32 = sub %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 {
-  $B1: {
-    %4:u32 = bitcast %lhs
-    %5:u32 = bitcast %rhs
-    %6:u32 = sub %4, %5
-    %7:i32 = bitcast %6
-    ret %7
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_BinaryPolyfillTest, IntAdd_Vector) {
-    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
-    auto* rhs = b.FunctionParam<vec4<i32>>("rhs");
-    auto* func = b.Function("foo", ty.vec4<i32>());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Add<vec4<i32>>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:vec4<i32>):vec4<i32> {
-  $B1: {
-    %4:vec4<i32> = add %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:vec4<i32>):vec4<i32> {
-  $B1: {
-    %4:vec4<u32> = bitcast %lhs
-    %5:vec4<u32> = bitcast %rhs
-    %6:vec4<u32> = add %4, %5
-    %7:vec4<i32> = bitcast %6
-    ret %7
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_BinaryPolyfillTest, IntAdd_ScalarVector) {
-    auto* lhs = b.FunctionParam<i32>("lhs");
-    auto* rhs = b.FunctionParam<vec4<i32>>("rhs");
-    auto* func = b.Function("foo", ty.vec4<i32>());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Add<vec4<i32>>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
-  $B1: {
-    %4:vec4<i32> = add %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
-  $B1: {
-    %4:u32 = bitcast %lhs
-    %5:vec4<u32> = bitcast %rhs
-    %6:vec4<u32> = add %4, %5
-    %7:vec4<i32> = bitcast %6
-    ret %7
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_BinaryPolyfillTest, IntAdd_VectorScalar) {
-    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
-    auto* rhs = b.FunctionParam<i32>("rhs");
-    auto* func = b.Function("foo", ty.vec4<i32>());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Add<vec4<i32>>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
-  $B1: {
-    %4:vec4<i32> = add %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
-  $B1: {
-    %4:vec4<u32> = bitcast %lhs
-    %5:u32 = bitcast %rhs
-    %6:vec4<u32> = add %4, %5
-    %7:vec4<i32> = bitcast %6
-    ret %7
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_BinaryPolyfillTest, IntShift_Scalar) {
-    auto* lhs = b.FunctionParam<i32>("lhs");
-    auto* rhs = b.FunctionParam<u32>("rhs");
-    auto* func = b.Function("foo", ty.i32());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.ShiftLeft<i32>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 {
-  $B1: {
-    %4:i32 = shl %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 {
-  $B1: {
-    %4:u32 = bitcast %lhs
-    %5:u32 = shl %4, %rhs
-    %6:i32 = bitcast %5
-    ret %6
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_BinaryPolyfillTest, IntShift_Vector) {
-    auto* lhs = b.FunctionParam<vec4<i32>>("lhs");
-    auto* rhs = b.FunctionParam<vec4<u32>>("rhs");
-    auto* func = b.Function("foo", ty.vec4<i32>());
-    func->SetParams({lhs, rhs});
-    b.Append(func->Block(), [&] {
-        auto* result = b.ShiftLeft<vec4<i32>>(lhs, rhs);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:vec4<u32>):vec4<i32> {
-  $B1: {
-    %4:vec4<i32> = shl %lhs, %rhs
-    ret %4
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:vec4<u32>):vec4<i32> {
-  $B1: {
-    %4:vec4<u32> = bitcast %lhs
-    %5:vec4<u32> = shl %4, %rhs
-    %6:vec4<i32> = bitcast %5
-    ret %6
-  }
-}
-)";
-
-    Run(BinaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
 }  // namespace
 }  // namespace tint::msl::writer::raise
diff --git a/src/tint/lang/msl/writer/raise/raise.cc b/src/tint/lang/msl/writer/raise/raise.cc
index aead774..004d8ae 100644
--- a/src/tint/lang/msl/writer/raise/raise.cc
+++ b/src/tint/lang/msl/writer/raise/raise.cc
@@ -42,6 +42,7 @@
 #include "src/tint/lang/core/ir/transform/remove_terminator_args.h"
 #include "src/tint/lang/core/ir/transform/rename_conflicts.h"
 #include "src/tint/lang/core/ir/transform/robustness.h"
+#include "src/tint/lang/core/ir/transform/signed_integer_polyfill.h"
 #include "src/tint/lang/core/ir/transform/value_to_let.h"
 #include "src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h"
 #include "src/tint/lang/core/ir/transform/vertex_pulling.h"
@@ -55,7 +56,6 @@
 #include "src/tint/lang/msl/writer/raise/packed_vec3.h"
 #include "src/tint/lang/msl/writer/raise/shader_io.h"
 #include "src/tint/lang/msl/writer/raise/simd_ballot.h"
-#include "src/tint/lang/msl/writer/raise/unary_polyfill.h"
 
 namespace tint::msl::writer {
 
@@ -157,9 +157,12 @@
     }
     RUN_TRANSFORM(raise::ModuleScopeVars, module);
 
-    RUN_TRANSFORM(raise::UnaryPolyfill, module);
     RUN_TRANSFORM(raise::BinaryPolyfill, module);
     RUN_TRANSFORM(raise::BuiltinPolyfill, module);
+    // After 'BuiltinPolyfill' as that transform can introduce signed dot products.
+    core::ir::transform::SignedIntegerPolyfillConfig signed_integer_cfg{
+        .signed_negation = true, .signed_arithmetic = true, .signed_shiftleft = true};
+    RUN_TRANSFORM(core::ir::transform::SignedIntegerPolyfill, module, signed_integer_cfg);
 
     core::ir::transform::BuiltinScalarizeConfig scalarize_config{
         .scalarize_clamp = options.scalarize_max_min_clamp,
diff --git a/src/tint/lang/msl/writer/raise/unary_polyfill.cc b/src/tint/lang/msl/writer/raise/unary_polyfill.cc
deleted file mode 100644
index 2261207..0000000
--- a/src/tint/lang/msl/writer/raise/unary_polyfill.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2024 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include "src/tint/lang/msl/writer/raise/unary_polyfill.h"
-
-#include "src/tint/lang/core/ir/builder.h"
-#include "src/tint/lang/core/ir/validator.h"
-
-using namespace tint::core::fluent_types;  // NOLINT
-
-namespace tint::msl::writer::raise {
-namespace {
-
-/// PIMPL state for the transform.
-struct State {
-    /// The IR module.
-    core::ir::Module& ir;
-
-    /// The IR builder.
-    core::ir::Builder b{ir};
-
-    /// The type manager.
-    core::type::Manager& ty{ir.Types()};
-
-    /// Process the module.
-    void Process() {
-        // Find the unary operators that need replacing.
-        Vector<core::ir::Unary*, 4> signed_int_negate_worklist;
-        for (auto* inst : ir.Instructions()) {
-            if (auto* unary = inst->As<core::ir::Unary>()) {
-                auto op = unary->Op();
-                auto* type = unary->Val()->Type();
-                if (op == core::UnaryOp::kNegation && type->IsSignedIntegerScalarOrVector()) {
-                    signed_int_negate_worklist.Push(unary);
-                }
-            }
-        }
-
-        // Replace the instructions that we found.
-        for (auto* signed_int_negate : signed_int_negate_worklist) {
-            SignedIntegerNegation(signed_int_negate);
-        }
-    }
-
-    /// Replace a signed integer negation to avoid undefined behavior.
-    /// @param unary the unary instruction
-    void SignedIntegerNegation(core::ir::Unary* unary) {
-        // Replace `-x` with `as_type<int>((~as_type<uint>(x)) + 1)`.
-        auto* signed_type = unary->Result()->Type();
-        auto* unsigned_type = ty.MatchWidth(ty.u32(), signed_type);
-        b.InsertBefore(unary, [&] {
-            auto* unsigned_value = b.Bitcast(unsigned_type, unary->Val());
-            auto* complement = b.Complement(unsigned_type, unsigned_value);
-            auto* plus_one = b.Add(unsigned_type, complement, b.MatchWidth(u32(1), unsigned_type));
-            auto* result = b.Bitcast(signed_type, plus_one);
-            unary->Result()->ReplaceAllUsesWith(result->Result());
-        });
-        unary->Destroy();
-    }
-};
-
-}  // namespace
-
-Result<SuccessType> UnaryPolyfill(core::ir::Module& ir) {
-    auto result =
-        ValidateAndDumpIfNeeded(ir, "msl.UnaryPolyfill",
-                                core::ir::Capabilities{
-                                    core::ir::Capability::kAllowPointersAndHandlesInStructures,
-                                    core::ir::Capability::kAllowPrivateVarsInFunctions,
-                                    core::ir::Capability::kAllowAnyLetType,
-                                    core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint,
-                                });
-    if (result != Success) {
-        return result.Failure();
-    }
-
-    State{ir}.Process();
-
-    return Success;
-}
-
-}  // namespace tint::msl::writer::raise
diff --git a/src/tint/lang/msl/writer/raise/unary_polyfill.h b/src/tint/lang/msl/writer/raise/unary_polyfill.h
deleted file mode 100644
index 6d2820a..0000000
--- a/src/tint/lang/msl/writer/raise/unary_polyfill.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2024 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef SRC_TINT_LANG_MSL_WRITER_RAISE_UNARY_POLYFILL_H_
-#define SRC_TINT_LANG_MSL_WRITER_RAISE_UNARY_POLYFILL_H_
-
-#include "src/tint/utils/result.h"
-
-// Forward declarations.
-namespace tint::core::ir {
-class Module;
-}  // namespace tint::core::ir
-
-namespace tint::msl::writer::raise {
-
-/// UnaryPolyfill is a transform that replaces unary instructions with polyfills and calls to MSL
-/// backend intrinsic functions.
-/// @param module the module to transform
-/// @returns success or failure
-Result<SuccessType> UnaryPolyfill(core::ir::Module& module);
-
-}  // namespace tint::msl::writer::raise
-
-#endif  // SRC_TINT_LANG_MSL_WRITER_RAISE_UNARY_POLYFILL_H_
diff --git a/src/tint/lang/msl/writer/raise/unary_polyfill_test.cc b/src/tint/lang/msl/writer/raise/unary_polyfill_test.cc
deleted file mode 100644
index 11088d1..0000000
--- a/src/tint/lang/msl/writer/raise/unary_polyfill_test.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2024 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include "src/tint/lang/msl/writer/raise/unary_polyfill.h"
-
-#include <utility>
-
-#include "gtest/gtest.h"
-#include "src/tint/lang/core/fluent_types.h"
-#include "src/tint/lang/core/ir/transform/helper_test.h"
-
-using namespace tint::core::fluent_types;     // NOLINT
-using namespace tint::core::number_suffixes;  // NOLINT
-
-namespace tint::msl::writer::raise {
-namespace {
-
-using MslWriter_UnaryPolyfillTest = core::ir::transform::TransformTest;
-
-TEST_F(MslWriter_UnaryPolyfillTest, Negation_F32) {
-    auto* value = b.FunctionParam<f32>("value");
-    auto* func = b.Function("foo", ty.f32());
-    func->SetParams({value});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Negation<f32>(value);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%value:f32):f32 {
-  $B1: {
-    %3:f32 = negation %value
-    ret %3
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = src;
-
-    Run(UnaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_UnaryPolyfillTest, Negation_I32_Scalar) {
-    auto* value = b.FunctionParam<i32>("value");
-    auto* func = b.Function("foo", ty.i32());
-    func->SetParams({value});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Negation<i32>(value);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%value:i32):i32 {
-  $B1: {
-    %3:i32 = negation %value
-    ret %3
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%value:i32):i32 {
-  $B1: {
-    %3:u32 = bitcast %value
-    %4:u32 = complement %3
-    %5:u32 = add %4, 1u
-    %6:i32 = bitcast %5
-    ret %6
-  }
-}
-)";
-
-    Run(UnaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-TEST_F(MslWriter_UnaryPolyfillTest, Negation_I32_Vector) {
-    auto* value = b.FunctionParam<vec4<i32>>("value");
-    auto* func = b.Function("foo", ty.vec4<i32>());
-    func->SetParams({value});
-    b.Append(func->Block(), [&] {
-        auto* result = b.Negation<vec4<i32>>(value);
-        b.Return(func, result);
-    });
-
-    auto* src = R"(
-%foo = func(%value:vec4<i32>):vec4<i32> {
-  $B1: {
-    %3:vec4<i32> = negation %value
-    ret %3
-  }
-}
-)";
-    EXPECT_EQ(src, str());
-
-    auto* expect = R"(
-%foo = func(%value:vec4<i32>):vec4<i32> {
-  $B1: {
-    %3:vec4<u32> = bitcast %value
-    %4:vec4<u32> = complement %3
-    %5:vec4<u32> = add %4, vec4<u32>(1u)
-    %6:vec4<i32> = bitcast %5
-    ret %6
-  }
-}
-)";
-
-    Run(UnaryPolyfill);
-
-    EXPECT_EQ(expect, str());
-}
-
-}  // namespace
-}  // namespace tint::msl::writer::raise
diff --git a/src/tint/lang/spirv/writer/binary_test.cc b/src/tint/lang/spirv/writer/binary_test.cc
index a14b39b..489f952 100644
--- a/src/tint/lang/spirv/writer/binary_test.cc
+++ b/src/tint/lang/spirv/writer/binary_test.cc
@@ -110,14 +110,9 @@
 INSTANTIATE_TEST_SUITE_P(
     SpirvWriterTest_Binary_I32,
     Arithmetic_Bitwise,
-    testing::Values(BinaryTestCase{kI32, core::BinaryOp::kAdd, "OpIAdd", "int"},
-                    BinaryTestCase{kI32, core::BinaryOp::kSubtract, "OpISub", "int"},
-                    BinaryTestCase{kI32, core::BinaryOp::kMultiply, "OpIMul", "int"},
-                    BinaryTestCase{kI32, core::BinaryOp::kAnd, "OpBitwiseAnd", "int"},
+    testing::Values(BinaryTestCase{kI32, core::BinaryOp::kAnd, "OpBitwiseAnd", "int"},
                     BinaryTestCase{kI32, core::BinaryOp::kOr, "OpBitwiseOr", "int"},
                     BinaryTestCase{kI32, core::BinaryOp::kXor, "OpBitwiseXor", "int"},
-                    BinaryTestCase{kI32, kI32, kU32, core::BinaryOp::kShiftLeft,
-                                   "OpShiftLeftLogical", "int"},
                     BinaryTestCase{kI32, kI32, kU32, core::BinaryOp::kShiftRight,
                                    "OpShiftRightArithmetic", "int"}));
 INSTANTIATE_TEST_SUITE_P(
@@ -349,8 +344,10 @@
     });
 
     ASSERT_TRUE(Generate()) << Error() << output_;
-    EXPECT_INST("%sub = OpISub %int %int_1 %int_2");
-    EXPECT_INST("%add = OpIAdd %int %sub %sub");
+    EXPECT_INST("OpBitcast %uint %int_1");
+    EXPECT_INST("OpBitcast %uint %int_2");
+    EXPECT_INST("OpISub %uint %6 %9");
+    EXPECT_INST("OpIAdd %uint %13 %14");
 }
 
 TEST_F(SpirvWriterTest, Divide_u32_u32) {
@@ -550,7 +547,6 @@
                OpFunctionEnd
 )");
 }
-
 TEST_F(SpirvWriterTest, Modulo_i32_i32) {
     Vector<core::ir::FunctionParam*, 4> args;
     args.Push(b.FunctionParam("lhs", ty.i32()));
@@ -586,10 +582,219 @@
          %20 = OpLogicalOr %bool %12 %19
          %21 = OpSelect %int %20 %int_1 %rhs_0
          %23 = OpSDiv %int %lhs_0 %21
-         %24 = OpIMul %int %23 %21
-         %25 = OpISub %int %lhs_0 %24
-               OpReturnValue %25
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %21
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %lhs_0
+         %30 = OpBitcast %uint %28
+         %31 = OpISub %uint %29 %30
+         %32 = OpBitcast %int %31
+               OpReturnValue %32
                OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %35
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+)");
+}
+
+TEST_F(SpirvWriterTest, Add_i32_i32) {
+    Vector<core::ir::FunctionParam*, 4> args;
+    args.Push(b.FunctionParam("lhs", ty.i32()));
+    args.Push(b.FunctionParam("rhs", ty.i32()));
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams(args);
+    b.Append(func->Block(), [&] {
+        auto* result = b.Binary(core::BinaryOp::kAdd, ty.i32(), args[0], args[1]);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST(R"(
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+
+               ; Debug Information
+               OpName %foo "foo"                    ; id %1
+               OpName %lhs "lhs"                    ; id %3
+               OpName %rhs "rhs"                    ; id %4
+               OpName %unused_entry_point "unused_entry_point"  ; id %12
+
+               ; Types, variables and constants
+        %int = OpTypeInt 32 1
+          %5 = OpTypeFunction %int %int %int
+       %uint = OpTypeInt 32 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+
+               ; Function foo
+        %foo = OpFunction %int None %5
+        %lhs = OpFunctionParameter %int
+        %rhs = OpFunctionParameter %int
+          %6 = OpLabel
+          %8 = OpBitcast %uint %lhs
+          %9 = OpBitcast %uint %rhs
+         %10 = OpIAdd %uint %8 %9
+         %11 = OpBitcast %int %10
+               OpReturnValue %11
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %14
+         %15 = OpLabel
+)");
+}
+
+TEST_F(SpirvWriterTest, Sub_i32_i32) {
+    Vector<core::ir::FunctionParam*, 4> args;
+    args.Push(b.FunctionParam("lhs", ty.i32()));
+    args.Push(b.FunctionParam("rhs", ty.i32()));
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams(args);
+    b.Append(func->Block(), [&] {
+        auto* result = b.Binary(core::BinaryOp::kSubtract, ty.i32(), args[0], args[1]);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST(R"(
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+
+               ; Debug Information
+               OpName %foo "foo"                    ; id %1
+               OpName %lhs "lhs"                    ; id %3
+               OpName %rhs "rhs"                    ; id %4
+               OpName %unused_entry_point "unused_entry_point"  ; id %12
+
+               ; Types, variables and constants
+        %int = OpTypeInt 32 1
+          %5 = OpTypeFunction %int %int %int
+       %uint = OpTypeInt 32 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+
+               ; Function foo
+        %foo = OpFunction %int None %5
+        %lhs = OpFunctionParameter %int
+        %rhs = OpFunctionParameter %int
+          %6 = OpLabel
+          %8 = OpBitcast %uint %lhs
+          %9 = OpBitcast %uint %rhs
+         %10 = OpISub %uint %8 %9
+         %11 = OpBitcast %int %10
+               OpReturnValue %11
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %14
+         %15 = OpLabel
+)");
+}
+
+TEST_F(SpirvWriterTest, Mul_i32_i32) {
+    Vector<core::ir::FunctionParam*, 4> args;
+    args.Push(b.FunctionParam("lhs", ty.i32()));
+    args.Push(b.FunctionParam("rhs", ty.i32()));
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams(args);
+    b.Append(func->Block(), [&] {
+        auto* result = b.Binary(core::BinaryOp::kMultiply, ty.i32(), args[0], args[1]);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST(R"(
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+
+               ; Debug Information
+               OpName %foo "foo"                    ; id %1
+               OpName %lhs "lhs"                    ; id %3
+               OpName %rhs "rhs"                    ; id %4
+               OpName %unused_entry_point "unused_entry_point"  ; id %12
+
+               ; Types, variables and constants
+        %int = OpTypeInt 32 1
+          %5 = OpTypeFunction %int %int %int
+       %uint = OpTypeInt 32 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+
+               ; Function foo
+        %foo = OpFunction %int None %5
+        %lhs = OpFunctionParameter %int
+        %rhs = OpFunctionParameter %int
+          %6 = OpLabel
+          %8 = OpBitcast %uint %lhs
+          %9 = OpBitcast %uint %rhs
+         %10 = OpIMul %uint %8 %9
+         %11 = OpBitcast %int %10
+               OpReturnValue %11
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %14
+         %15 = OpLabel
+)");
+}
+
+TEST_F(SpirvWriterTest, ShiftLeft_i32_u32) {
+    Vector<core::ir::FunctionParam*, 4> args;
+    args.Push(b.FunctionParam("lhs", ty.i32()));
+    args.Push(b.FunctionParam("rhs", ty.u32()));
+    auto* func = b.Function("foo", ty.i32());
+    func->SetParams(args);
+    b.Append(func->Block(), [&] {
+        auto* result = b.Binary(core::BinaryOp::kShiftLeft, ty.i32(), args[0], args[1]);
+        b.Return(func, result);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST(R"(
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+
+               ; Debug Information
+               OpName %foo "foo"                    ; id %1
+               OpName %lhs "lhs"                    ; id %3
+               OpName %rhs "rhs"                    ; id %5
+               OpName %unused_entry_point "unused_entry_point"  ; id %13
+
+               ; Types, variables and constants
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+          %6 = OpTypeFunction %int %int %uint
+    %uint_31 = OpConstant %uint 31
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+
+               ; Function foo
+        %foo = OpFunction %int None %6
+        %lhs = OpFunctionParameter %int
+        %rhs = OpFunctionParameter %uint
+          %7 = OpLabel
+          %8 = OpBitwiseAnd %uint %rhs %uint_31
+         %10 = OpBitcast %uint %lhs
+         %11 = OpShiftLeftLogical %uint %10 %8
+         %12 = OpBitcast %int %11
+               OpReturnValue %12
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %15
+         %16 = OpLabel
 )");
 }
 
@@ -630,9 +835,21 @@
          %26 = OpLogicalOr %v4bool %15 %25
          %27 = OpSelect %v4int %26 %28 %rhs_0
          %30 = OpSDiv %v4int %lhs_0 %27
-         %31 = OpIMul %v4int %30 %27
-         %32 = OpISub %v4int %lhs_0 %31
-               OpReturnValue %32
+         %33 = OpBitcast %v4uint %30
+         %34 = OpBitcast %v4uint %27
+         %35 = OpIMul %v4uint %33 %34
+         %36 = OpBitcast %v4int %35
+         %37 = OpBitcast %v4uint %lhs_0
+         %38 = OpBitcast %v4uint %36
+         %39 = OpISub %v4uint %37 %38
+         %40 = OpBitcast %v4int %39
+               OpReturnValue %40
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %43
+         %44 = OpLabel
+               OpReturn
                OpFunctionEnd
 )");
 }
@@ -674,9 +891,21 @@
          %26 = OpLogicalOr %v4bool %15 %25
          %27 = OpSelect %v4int %26 %28 %rhs_0
          %30 = OpSDiv %v4int %lhs_0 %27
-         %31 = OpIMul %v4int %30 %27
-         %32 = OpISub %v4int %lhs_0 %31
-               OpReturnValue %32
+         %33 = OpBitcast %v4uint %30
+         %34 = OpBitcast %v4uint %27
+         %35 = OpIMul %v4uint %33 %34
+         %36 = OpBitcast %v4int %35
+         %37 = OpBitcast %v4uint %lhs_0
+         %38 = OpBitcast %v4uint %36
+         %39 = OpISub %v4uint %37 %38
+         %40 = OpBitcast %v4int %39
+               OpReturnValue %40
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %43
+         %44 = OpLabel
+               OpReturn
                OpFunctionEnd
 )");
 }
diff --git a/src/tint/lang/spirv/writer/builtin_test.cc b/src/tint/lang/spirv/writer/builtin_test.cc
index b799b74..f0965c5 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -1287,11 +1287,20 @@
     EXPECT_INST(R"(
           %8 = OpCompositeExtract %int %arg1 0
           %9 = OpCompositeExtract %int %arg2 0
-         %10 = OpIMul %int %8 %9
-         %11 = OpCompositeExtract %int %arg1 1
-         %12 = OpCompositeExtract %int %arg2 1
-         %13 = OpIMul %int %11 %12
-     %result = OpIAdd %int %10 %13
+         %11 = OpBitcast %uint %8
+         %12 = OpBitcast %uint %9
+         %13 = OpIMul %uint %11 %12
+         %14 = OpBitcast %int %13
+         %15 = OpCompositeExtract %int %arg1 1
+         %16 = OpCompositeExtract %int %arg2 1
+         %17 = OpBitcast %uint %15
+         %18 = OpBitcast %uint %16
+         %19 = OpIMul %uint %17 %18
+         %20 = OpBitcast %int %19
+         %21 = OpBitcast %uint %14
+         %22 = OpBitcast %uint %20
+         %23 = OpIAdd %uint %21 %22
+         %24 = OpBitcast %int %23
 )");
 }
 
diff --git a/src/tint/lang/spirv/writer/function_test.cc b/src/tint/lang/spirv/writer/function_test.cc
index 8a9deae..bda26a9 100644
--- a/src/tint/lang/spirv/writer/function_test.cc
+++ b/src/tint/lang/spirv/writer/function_test.cc
@@ -241,16 +241,26 @@
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST(R"(
           %5 = OpTypeFunction %int %int %int
+       %uint = OpTypeInt 32 0
        %void = OpTypeVoid
-         %10 = OpTypeFunction %void
+         %14 = OpTypeFunction %void
 
                ; Function foo
         %foo = OpFunction %int None %5
           %x = OpFunctionParameter %int
           %y = OpFunctionParameter %int
           %6 = OpLabel
-          %7 = OpIAdd %int %x %y
-               OpReturnValue %7
+          %8 = OpBitcast %uint %x
+          %9 = OpBitcast %uint %y
+         %10 = OpIAdd %uint %8 %9
+         %11 = OpBitcast %int %10
+               OpReturnValue %11
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %14
+         %15 = OpLabel
+               OpReturn
                OpFunctionEnd
 )");
 }
diff --git a/src/tint/lang/spirv/writer/if_test.cc b/src/tint/lang/spirv/writer/if_test.cc
index d9eae1e..641f748 100644
--- a/src/tint/lang/spirv/writer/if_test.cc
+++ b/src/tint/lang/spirv/writer/if_test.cc
@@ -78,7 +78,10 @@
                OpSelectionMerge %5 None
                OpBranchConditional %true %6 %5
           %6 = OpLabel
-          %9 = OpIAdd %int %int_1 %int_1
+         %10 = OpBitcast %uint %int_1
+         %13 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %10 %13
+         %15 = OpBitcast %int %14
                OpBranch %5
           %5 = OpLabel
                OpReturn
@@ -106,7 +109,10 @@
                OpSelectionMerge %5 None
                OpBranchConditional %true %5 %6
           %6 = OpLabel
-          %9 = OpIAdd %int %int_1 %int_1
+         %10 = OpBitcast %uint %int_1
+         %13 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %10 %13
+         %15 = OpBitcast %int %14
                OpBranch %5
           %5 = OpLabel
                OpReturn
diff --git a/src/tint/lang/spirv/writer/loop_test.cc b/src/tint/lang/spirv/writer/loop_test.cc
index d4627ae..c3d3d7b 100644
--- a/src/tint/lang/spirv/writer/loop_test.cc
+++ b/src/tint/lang/spirv/writer/loop_test.cc
@@ -594,12 +594,15 @@
                OpLoopMerge %9 %7 None
                OpBranch %6
           %6 = OpLabel
-         %14 = OpIAdd %int %11 %int_1
+         %16 = OpBitcast %uint %11
+         %17 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %16 %17
+         %14 = OpBitcast %int %18
                OpBranch %7
           %7 = OpLabel
          %13 = OpPhi %int %14 %6
-         %15 = OpSGreaterThan %bool %13 %int_5
-               OpBranchConditional %15 %9 %8
+         %19 = OpSGreaterThan %bool %13 %int_5
+               OpBranchConditional %19 %9 %8
           %9 = OpLabel
                OpReturn
                OpFunctionEnd
@@ -649,14 +652,17 @@
                OpLoopMerge %9 %7 None
                OpBranch %6
           %6 = OpLabel
-         %18 = OpIAdd %int %11 %int_1
+         %21 = OpBitcast %uint %11
+         %22 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %21 %22
+         %18 = OpBitcast %int %23
                OpBranch %7
           %7 = OpLabel
          %13 = OpPhi %int %18 %6
          %19 = OpPhi %bool %15 %6
-         %20 = OpSGreaterThan %bool %13 %int_5
+         %24 = OpSGreaterThan %bool %13 %int_5
          %17 = OpLogicalNot %bool %19
-               OpBranchConditional %20 %9 %8
+               OpBranchConditional %24 %9 %8
           %9 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/src/tint/lang/spirv/writer/raise/raise.cc b/src/tint/lang/spirv/writer/raise/raise.cc
index 7506b7e..da2b0a8 100644
--- a/src/tint/lang/spirv/writer/raise/raise.cc
+++ b/src/tint/lang/spirv/writer/raise/raise.cc
@@ -44,6 +44,7 @@
 #include "src/tint/lang/core/ir/transform/preserve_padding.h"
 #include "src/tint/lang/core/ir/transform/prevent_infinite_loops.h"
 #include "src/tint/lang/core/ir/transform/robustness.h"
+#include "src/tint/lang/core/ir/transform/signed_integer_polyfill.h"
 #include "src/tint/lang/core/ir/transform/std140.h"
 #include "src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h"
 #include "src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h"
@@ -187,6 +188,10 @@
         .scalarize_min = options.scalarize_max_min_clamp};
     RUN_TRANSFORM(core::ir::transform::BuiltinScalarize, module, scalarize_config);
 
+    core::ir::transform::SignedIntegerPolyfillConfig signed_integer_cfg{
+        .signed_negation = true, .signed_arithmetic = true, .signed_shiftleft = true};
+    RUN_TRANSFORM(core::ir::transform::SignedIntegerPolyfill, module, signed_integer_cfg);
+
     // kAllowAnyInputAttachmentIndexType required after ExpandImplicitSplats
     RUN_TRANSFORM(raise::HandleMatrixArithmetic, module);
     RUN_TRANSFORM(raise::MergeReturn, module);
diff --git a/src/tint/lang/spirv/writer/unary_test.cc b/src/tint/lang/spirv/writer/unary_test.cc
index 43fb04e..0013c64 100644
--- a/src/tint/lang/spirv/writer/unary_test.cc
+++ b/src/tint/lang/spirv/writer/unary_test.cc
@@ -82,9 +82,74 @@
     Arithmetic,
     testing::Values(UnaryTestCase{kI32, core::UnaryOp::kComplement, "OpNot", "int"},
                     UnaryTestCase{kU32, core::UnaryOp::kComplement, "OpNot", "uint"},
-                    UnaryTestCase{kI32, core::UnaryOp::kNegation, "OpSNegate", "int"},
                     UnaryTestCase{kF32, core::UnaryOp::kNegation, "OpFNegate", "float"},
                     UnaryTestCase{kF16, core::UnaryOp::kNegation, "OpFNegate", "half"}));
 
+TEST_F(SpirvWriterTest, Unary_Negate_i32) {
+    auto* arg = b.FunctionParam("arg", MakeVectorType(kI32));
+    auto* func = b.Function("foo", ty.void_());
+    func->SetParams({arg});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Unary(core::UnaryOp::kNegation, MakeVectorType(kI32), arg);
+        b.Return(func);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST(R"(
+       %void = OpTypeVoid
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+          %6 = OpTypeFunction %void %v2int
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+     %uint_1 = OpConstant %uint 1
+         %13 = OpConstantComposite %v2uint %uint_1 %uint_1
+         %17 = OpTypeFunction %void
+
+               ; Function foo
+        %foo = OpFunction %void None %6
+        %arg = OpFunctionParameter %v2int
+          %7 = OpLabel
+         %10 = OpBitcast %v2uint %arg
+         %11 = OpNot %v2uint %10
+         %12 = OpIAdd %v2uint %11 %13
+         %15 = OpBitcast %v2int %12
+               OpReturn
+               OpFunctionEnd
+
+               ; Function unused_entry_point
+%unused_entry_point = OpFunction %void None %17
+         %18 = OpLabel
+               OpReturn
+               OpFunctionEnd
+)");
+}
+
+TEST_F(SpirvWriterTest, Unary_Negate_Vector_i32) {
+    auto* arg = b.FunctionParam("arg", MakeScalarType(kI32));
+    auto* func = b.Function("foo", ty.void_());
+    func->SetParams({arg});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Unary(core::UnaryOp::kNegation, MakeScalarType(kI32), arg);
+        b.Return(func);
+        mod.SetName(result, "result");
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST(R"(
+        %foo = OpFunction %void None %5
+        %arg = OpFunctionParameter %int
+          %6 = OpLabel
+          %8 = OpBitcast %uint %arg
+          %9 = OpNot %uint %8
+         %10 = OpIAdd %uint %9 %uint_1
+         %12 = OpBitcast %int %10
+               OpReturn
+               OpFunctionEnd
+
+    )");
+}
+
 }  // namespace
 }  // namespace tint::spirv::writer
diff --git a/src/tint/lang/spirv/writer/var_test.cc b/src/tint/lang/spirv/writer/var_test.cc
index 92ceba6..816d91d 100644
--- a/src/tint/lang/spirv/writer/var_test.cc
+++ b/src/tint/lang/spirv/writer/var_test.cc
@@ -148,7 +148,11 @@
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST("%v = OpVariable %_ptr_Private_int Private %int_42");
     EXPECT_INST("%load = OpLoad %int %v");
-    EXPECT_INST("OpStore %v %add");
+    EXPECT_INST("OpBitcast %uint %load");
+    EXPECT_INST("OpBitcast %uint %int_1");
+    EXPECT_INST("OpIAdd %uint %11 %12");
+    EXPECT_INST("OpBitcast %int %14");
+    EXPECT_INST("OpStore %v %15 None");
 }
 
 TEST_F(SpirvWriterTest, WorkgroupVar) {
@@ -174,7 +178,11 @@
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST("%v = OpVariable %_ptr_Workgroup_int Workgroup");
     EXPECT_INST("%load = OpLoad %int %v");
-    EXPECT_INST("OpStore %v %add");
+    EXPECT_INST("OpBitcast %uint %load");
+    EXPECT_INST("OpBitcast %uint %int_1");
+    EXPECT_INST("OpIAdd %uint %21 %22");
+    EXPECT_INST("OpBitcast %int %24");
+    EXPECT_INST("OpStore %v %25 None");
 }
 
 TEST_F(SpirvWriterTest, WorkgroupVar_ZeroInitializeWithExtension) {
@@ -232,9 +240,12 @@
     EXPECT_INST(R"(
           %9 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
        %load = OpLoad %int %9 None
-        %add = OpIAdd %int %load %int_1
-         %16 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %16 %add None
+         %14 = OpBitcast %uint %load
+         %15 = OpBitcast %uint %int_1
+         %17 = OpIAdd %uint %14 %15
+         %18 = OpBitcast %int %17
+         %19 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %19 %18 None
 )");
 }
 
@@ -270,7 +281,6 @@
                OpName %v_block "v_block"            ; id %3
                OpName %foo "foo"                    ; id %5
                OpName %load "load"                  ; id %13
-               OpName %add "add"                    ; id %14
 
                ; Annotations
                OpMemberDecorate %v_block 0 Offset 0
@@ -295,9 +305,12 @@
           %8 = OpLabel
           %9 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
        %load = OpLoad %int %9 NonPrivatePointer
-        %add = OpIAdd %int %load %int_1
-         %16 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %16 %add NonPrivatePointer
+         %14 = OpBitcast %uint %load
+         %15 = OpBitcast %uint %int_1
+         %17 = OpIAdd %uint %14 %15
+         %18 = OpBitcast %int %17
+         %19 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %19 %18 NonPrivatePointer
                OpReturn
                OpFunctionEnd)");
 }
@@ -334,8 +347,7 @@
                OpName %foo_inner "foo_inner"                                                ; id %7
                OpName %tint_local_index "tint_local_index"                                  ; id %9
                OpName %load "load"                                                          ; id %20
-               OpName %add "add"                                                            ; id %21
-               OpName %foo "foo"                                                            ; id %24
+               OpName %foo "foo"                                                            ; id %27
 
                ; Annotations
                OpDecorate %foo_local_invocation_index_Input BuiltIn LocalInvocationIndex
@@ -355,7 +367,7 @@
  %uint_24840 = OpConstant %uint 24840
       %int_1 = OpConstant %int 1
       %int_0 = OpConstant %int 0
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 
                ; Function foo_inner
   %foo_inner = OpFunction %void None %10
@@ -370,16 +382,19 @@
          %15 = OpLabel
                OpControlBarrier %uint_2 %uint_2 %uint_24840
        %load = OpLoad %int %v NonPrivatePointer
-        %add = OpIAdd %int %load %int_1
-               OpStore %v %add NonPrivatePointer
+         %21 = OpBitcast %uint %load
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %v %25 NonPrivatePointer
                OpReturn
                OpFunctionEnd
 
                ; Function foo
-        %foo = OpFunction %void None %25
-         %26 = OpLabel
-         %27 = OpLoad %uint %foo_local_invocation_index_Input None
-         %28 = OpFunctionCall %void %foo_inner %27
+        %foo = OpFunction %void None %28
+         %29 = OpLabel
+         %30 = OpLoad %uint %foo_local_invocation_index_Input None
+         %31 = OpFunctionCall %void %foo_inner %30
                OpReturn
                OpFunctionEnd)");
 }
diff --git a/test/tint/access/ptr.wgsl.expected.glsl b/test/tint/access/ptr.wgsl.expected.glsl
index a61bac6..d47e4a8 100644
--- a/test/tint/access/ptr.wgsl.expected.glsl
+++ b/test/tint/access/ptr.wgsl.expected.glsl
@@ -16,14 +16,20 @@
 }
 int accept_ptr_deref_call_func(inout int val) {
   int v_1 = val;
-  return (v_1 + accept_value(val));
+  int v_2 = accept_value(val);
+  uint v_3 = uint(v_1);
+  return int((v_3 + uint(v_2)));
 }
 int accept_ptr_deref_pass_through(inout int val) {
-  int v_2 = val;
-  return (v_2 + accept_ptr_deref_call_func(val));
+  int v_4 = val;
+  int v_5 = accept_ptr_deref_call_func(val);
+  uint v_6 = uint(v_4);
+  return int((v_6 + uint(v_5)));
 }
 int accept_ptr_to_struct_and_access(inout S val) {
-  return (val.a + val.b);
+  int v_7 = val.b;
+  uint v_8 = uint(val.a);
+  return int((v_8 + uint(v_7)));
 }
 int accept_ptr_to_struct_access_pass_ptr(inout S val) {
   val.a = 2;
@@ -48,12 +54,23 @@
   S v2 = S(0, 0);
   vec3 v4 = vec3(0.0f);
   int t1 = atomicOr(g1, 0);
-  int v_3 = accept_ptr_deref_pass_through(v1);
-  int v_4 = (v_3 + accept_ptr_to_struct_and_access(v2));
-  int v_5 = (v_4 + accept_ptr_to_struct_and_access(v2));
-  int v_6 = (v_5 + accept_ptr_vec_access_elements(v4));
-  int v_7 = (v_6 + accept_ptr_to_struct_access_pass_ptr(v2));
-  v.inner = ((v_7 + call_builtin_with_mod_scope_ptr()) + t1);
+  int v_9 = accept_ptr_deref_pass_through(v1);
+  int v_10 = accept_ptr_to_struct_and_access(v2);
+  uint v_11 = uint(v_9);
+  int v_12 = int((v_11 + uint(v_10)));
+  int v_13 = accept_ptr_to_struct_and_access(v2);
+  uint v_14 = uint(v_12);
+  int v_15 = int((v_14 + uint(v_13)));
+  int v_16 = accept_ptr_vec_access_elements(v4);
+  uint v_17 = uint(v_15);
+  int v_18 = int((v_17 + uint(v_16)));
+  int v_19 = accept_ptr_to_struct_access_pass_ptr(v2);
+  uint v_20 = uint(v_18);
+  int v_21 = int((v_20 + uint(v_19)));
+  int v_22 = call_builtin_with_mod_scope_ptr();
+  uint v_23 = uint(v_21);
+  uint v_24 = uint(int((v_23 + uint(v_22))));
+  v.inner = int((v_24 + uint(t1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/access/ptr.wgsl.expected.spvasm b/test/tint/access/ptr.wgsl.expected.spvasm
index 37b709f..bf9fbb4 100644
--- a/test/tint/access/ptr.wgsl.expected.spvasm
+++ b/test/tint/access/ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 116
+; Bound: 143
 ; Schema: 0
                OpCapability Shader
-         %58 = OpExtInstImport "GLSL.std.450"
+         %67 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main" %main_local_invocation_index_Input
                OpExecutionMode %main LocalSize 1 1 1
@@ -58,29 +58,29 @@
          %17 = OpTypeFunction %int %_ptr_Function_int
           %S = OpTypeStruct %int %int
 %_ptr_Function_S = OpTypePointer Function %S
-         %33 = OpTypeFunction %int %_ptr_Function_S
+         %39 = OpTypeFunction %int %_ptr_Function_S
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
       %int_2 = OpConstant %int 2
       %float = OpTypeFloat 32
     %v3float = OpTypeVector %float 3
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-         %53 = OpTypeFunction %int %_ptr_Function_v3float
+         %62 = OpTypeFunction %int %_ptr_Function_v3float
 %_ptr_Function_float = OpTypePointer Function %float
-         %67 = OpTypeFunction %int
+         %76 = OpTypeFunction %int
      %uint_2 = OpConstant %uint 2
        %void = OpTypeVoid
-         %74 = OpTypeFunction %void %uint
+         %83 = OpTypeFunction %void %uint
        %bool = OpTypeBool
    %uint_264 = OpConstant %uint 264
       %int_0 = OpConstant %int 0
-         %85 = OpConstantNull %S
-         %87 = OpConstantNull %v3float
+         %94 = OpConstantNull %S
+         %96 = OpConstantNull %v3float
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-        %105 = OpTypeFunction %int %float
+        %132 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %112 = OpTypeFunction %void
+        %139 = OpTypeFunction %void
 %accept_value = OpFunction %int None %12
         %val = OpFunctionParameter %int
          %13 = OpLabel
@@ -92,98 +92,125 @@
          %19 = OpLoad %int %val_root None
          %20 = OpLoad %int %val_root None
          %21 = OpFunctionCall %int %accept_value %20
-         %22 = OpIAdd %int %19 %21
-               OpReturnValue %22
+         %22 = OpBitcast %uint %19
+         %23 = OpBitcast %uint %21
+         %24 = OpIAdd %uint %22 %23
+         %25 = OpBitcast %int %24
+               OpReturnValue %25
                OpFunctionEnd
 %accept_ptr_deref_pass_through = OpFunction %int None %17
  %val_root_0 = OpFunctionParameter %_ptr_Function_int
-         %25 = OpLabel
-         %26 = OpLoad %int %val_root_0 None
-         %27 = OpFunctionCall %int %accept_ptr_deref_call_func %val_root_0
-         %28 = OpIAdd %int %26 %27
-               OpReturnValue %28
+         %28 = OpLabel
+         %29 = OpLoad %int %val_root_0 None
+         %30 = OpFunctionCall %int %accept_ptr_deref_call_func %val_root_0
+         %31 = OpBitcast %uint %29
+         %32 = OpBitcast %uint %30
+         %33 = OpIAdd %uint %31 %32
+         %34 = OpBitcast %int %33
+               OpReturnValue %34
                OpFunctionEnd
-%accept_ptr_to_struct_and_access = OpFunction %int None %33
+%accept_ptr_to_struct_and_access = OpFunction %int None %39
  %val_root_1 = OpFunctionParameter %_ptr_Function_S
-         %34 = OpLabel
-         %35 = OpAccessChain %_ptr_Function_int %val_root_1 %uint_0
-         %37 = OpLoad %int %35 None
-         %38 = OpAccessChain %_ptr_Function_int %val_root_1 %uint_1
-         %40 = OpLoad %int %38 None
-         %41 = OpIAdd %int %37 %40
-               OpReturnValue %41
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_Function_int %val_root_1 %uint_0
+         %43 = OpLoad %int %41 None
+         %44 = OpAccessChain %_ptr_Function_int %val_root_1 %uint_1
+         %46 = OpLoad %int %44 None
+         %47 = OpBitcast %uint %43
+         %48 = OpBitcast %uint %46
+         %49 = OpIAdd %uint %47 %48
+         %50 = OpBitcast %int %49
+               OpReturnValue %50
                OpFunctionEnd
-%accept_ptr_to_struct_access_pass_ptr = OpFunction %int None %33
+%accept_ptr_to_struct_access_pass_ptr = OpFunction %int None %39
  %val_root_2 = OpFunctionParameter %_ptr_Function_S
-         %44 = OpLabel
+         %53 = OpLabel
           %b = OpAccessChain %_ptr_Function_int %val_root_2 %uint_0
                OpStore %b %int_2 None
-         %47 = OpLoad %int %b None
-               OpReturnValue %47
+         %56 = OpLoad %int %b None
+               OpReturnValue %56
                OpFunctionEnd
-%accept_ptr_vec_access_elements = OpFunction %int None %53
+%accept_ptr_vec_access_elements = OpFunction %int None %62
     %v1_root = OpFunctionParameter %_ptr_Function_v3float
-         %54 = OpLabel
-         %55 = OpLoad %v3float %v1_root None
-         %56 = OpLoad %v3float %v1_root None
-         %57 = OpExtInst %v3float %58 Cross %55 %56
-         %59 = OpCompositeExtract %float %57 0
-         %60 = OpAccessChain %_ptr_Function_float %v1_root %uint_0
-               OpStore %60 %59 None
-         %62 = OpAccessChain %_ptr_Function_float %v1_root %uint_0
-         %63 = OpLoad %float %62 None
-         %64 = OpFunctionCall %int %tint_f32_to_i32 %63
-               OpReturnValue %64
+         %63 = OpLabel
+         %64 = OpLoad %v3float %v1_root None
+         %65 = OpLoad %v3float %v1_root None
+         %66 = OpExtInst %v3float %67 Cross %64 %65
+         %68 = OpCompositeExtract %float %66 0
+         %69 = OpAccessChain %_ptr_Function_float %v1_root %uint_0
+               OpStore %69 %68 None
+         %71 = OpAccessChain %_ptr_Function_float %v1_root %uint_0
+         %72 = OpLoad %float %71 None
+         %73 = OpFunctionCall %int %tint_f32_to_i32 %72
+               OpReturnValue %73
                OpFunctionEnd
-%call_builtin_with_mod_scope_ptr = OpFunction %int None %67
-         %68 = OpLabel
-         %69 = OpAtomicLoad %int %g1 %uint_2 %uint_0
-               OpReturnValue %69
+%call_builtin_with_mod_scope_ptr = OpFunction %int None %76
+         %77 = OpLabel
+         %78 = OpAtomicLoad %int %g1 %uint_2 %uint_0
+               OpReturnValue %78
                OpFunctionEnd
- %main_inner = OpFunction %void None %74
+ %main_inner = OpFunction %void None %83
 %tint_local_index = OpFunctionParameter %uint
-         %75 = OpLabel
+         %84 = OpLabel
          %v1 = OpVariable %_ptr_Function_int Function
          %v2 = OpVariable %_ptr_Function_S Function
          %v4 = OpVariable %_ptr_Function_v3float Function
-         %76 = OpULessThan %bool %tint_local_index %uint_1
-               OpSelectionMerge %78 None
-               OpBranchConditional %76 %79 %78
-         %79 = OpLabel
+         %85 = OpULessThan %bool %tint_local_index %uint_1
+               OpSelectionMerge %87 None
+               OpBranchConditional %85 %88 %87
+         %88 = OpLabel
                OpAtomicStore %g1 %uint_2 %uint_0 %int_0
-               OpBranch %78
-         %78 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
                OpControlBarrier %uint_2 %uint_2 %uint_264
                OpStore %v1 %int_0
-               OpStore %v2 %85
-               OpStore %v4 %87
+               OpStore %v2 %94
+               OpStore %v4 %96
          %t1 = OpAtomicLoad %int %g1 %uint_2 %uint_0
-         %89 = OpFunctionCall %int %accept_ptr_deref_pass_through %v1
-         %90 = OpFunctionCall %int %accept_ptr_to_struct_and_access %v2
-         %91 = OpIAdd %int %89 %90
-         %92 = OpFunctionCall %int %accept_ptr_to_struct_and_access %v2
-         %93 = OpIAdd %int %91 %92
-         %94 = OpFunctionCall %int %accept_ptr_vec_access_elements %v4
-         %95 = OpIAdd %int %93 %94
-         %96 = OpFunctionCall %int %accept_ptr_to_struct_access_pass_ptr %v2
-         %97 = OpIAdd %int %95 %96
-         %98 = OpFunctionCall %int %call_builtin_with_mod_scope_ptr
-         %99 = OpIAdd %int %97 %98
-        %100 = OpIAdd %int %99 %t1
-        %101 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %101 %100 None
+         %98 = OpFunctionCall %int %accept_ptr_deref_pass_through %v1
+         %99 = OpFunctionCall %int %accept_ptr_to_struct_and_access %v2
+        %100 = OpBitcast %uint %98
+        %101 = OpBitcast %uint %99
+        %102 = OpIAdd %uint %100 %101
+        %103 = OpBitcast %int %102
+        %104 = OpFunctionCall %int %accept_ptr_to_struct_and_access %v2
+        %105 = OpBitcast %uint %103
+        %106 = OpBitcast %uint %104
+        %107 = OpIAdd %uint %105 %106
+        %108 = OpBitcast %int %107
+        %109 = OpFunctionCall %int %accept_ptr_vec_access_elements %v4
+        %110 = OpBitcast %uint %108
+        %111 = OpBitcast %uint %109
+        %112 = OpIAdd %uint %110 %111
+        %113 = OpBitcast %int %112
+        %114 = OpFunctionCall %int %accept_ptr_to_struct_access_pass_ptr %v2
+        %115 = OpBitcast %uint %113
+        %116 = OpBitcast %uint %114
+        %117 = OpIAdd %uint %115 %116
+        %118 = OpBitcast %int %117
+        %119 = OpFunctionCall %int %call_builtin_with_mod_scope_ptr
+        %120 = OpBitcast %uint %118
+        %121 = OpBitcast %uint %119
+        %122 = OpIAdd %uint %120 %121
+        %123 = OpBitcast %int %122
+        %124 = OpBitcast %uint %123
+        %125 = OpBitcast %uint %t1
+        %126 = OpIAdd %uint %124 %125
+        %127 = OpBitcast %int %126
+        %128 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %128 %127 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %105
+%tint_f32_to_i32 = OpFunction %int None %132
       %value = OpFunctionParameter %float
-        %106 = OpLabel
-        %107 = OpExtInst %float %58 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %110 = OpConvertFToS %int %107
-               OpReturnValue %110
+        %133 = OpLabel
+        %134 = OpExtInst %float %67 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %137 = OpConvertFToS %int %134
+               OpReturnValue %137
                OpFunctionEnd
-       %main = OpFunction %void None %112
-        %113 = OpLabel
-        %114 = OpLoad %uint %main_local_invocation_index_Input None
-        %115 = OpFunctionCall %void %main_inner %114
+       %main = OpFunction %void None %139
+        %140 = OpLabel
+        %141 = OpLoad %uint %main_local_invocation_index_Input None
+        %142 = OpFunctionCall %void %main_inner %141
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/array/assign_to_subexpr.wgsl.expected.glsl b/test/tint/array/assign_to_subexpr.wgsl.expected.glsl
index 0aa0a19..513d1d1 100644
--- a/test/tint/array/assign_to_subexpr.wgsl.expected.glsl
+++ b/test/tint/array/assign_to_subexpr.wgsl.expected.glsl
@@ -19,7 +19,12 @@
   dst = src;
   dst_struct.arr = src;
   dst_array[0u] = src;
-  return ((dst[0u] + dst_struct.arr[0u]) + dst_array[0u][0u]);
+  int v_1 = dst_struct.arr[0u];
+  uint v_2 = uint(dst[0u]);
+  int v_3 = int((v_2 + uint(v_1)));
+  int v_4 = dst_array[0u][0u];
+  uint v_5 = uint(v_3);
+  return int((v_5 + uint(v_4)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/array/assign_to_subexpr.wgsl.expected.spvasm b/test/tint/array/assign_to_subexpr.wgsl.expected.spvasm
index 91d5d4a..c91ebec 100644
--- a/test/tint/array/assign_to_subexpr.wgsl.expected.spvasm
+++ b/test/tint/array/assign_to_subexpr.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 45
+; Bound: 51
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -46,7 +46,7 @@
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_int = OpTypePointer Function %int
        %void = OpTypeVoid
-         %40 = OpTypeFunction %void
+         %46 = OpTypeFunction %void
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
         %foo = OpFunction %int None %6
           %7 = OpLabel
@@ -66,16 +66,22 @@
          %31 = OpLoad %int %29 None
          %32 = OpAccessChain %_ptr_Function_int %dst_struct %uint_0 %uint_0
          %33 = OpLoad %int %32 None
-         %34 = OpIAdd %int %31 %33
-         %35 = OpAccessChain %_ptr_Function_int %dst_array %uint_0 %uint_0
-         %36 = OpLoad %int %35 None
-         %37 = OpIAdd %int %34 %36
-               OpReturnValue %37
+         %34 = OpBitcast %uint %31
+         %35 = OpBitcast %uint %33
+         %36 = OpIAdd %uint %34 %35
+         %37 = OpBitcast %int %36
+         %38 = OpAccessChain %_ptr_Function_int %dst_array %uint_0 %uint_0
+         %39 = OpLoad %int %38 None
+         %40 = OpBitcast %uint %37
+         %41 = OpBitcast %uint %39
+         %42 = OpIAdd %uint %40 %41
+         %43 = OpBitcast %int %42
+               OpReturnValue %43
                OpFunctionEnd
-       %main = OpFunction %void None %40
-         %41 = OpLabel
-         %42 = OpFunctionCall %int %foo
-         %43 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %43 %42 None
+       %main = OpFunction %void None %46
+         %47 = OpLabel
+         %48 = OpFunctionCall %int %foo
+         %49 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %49 %48 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/array/type_initializer.wgsl.expected.glsl b/test/tint/array/type_initializer.wgsl.expected.glsl
index ac638e9..664998d 100644
--- a/test/tint/array/type_initializer.wgsl.expected.glsl
+++ b/test/tint/array/type_initializer.wgsl.expected.glsl
@@ -9,16 +9,32 @@
   int x = 42;
   int empty[4] = int[4](0, 0, 0, 0);
   int nonempty[4] = int[4](1, 2, 3, 4);
-  int nonempty_with_expr[4] = int[4](1, x, (x + 1), nonempty[3u]);
+  uint v_1 = uint(x);
+  int nonempty_with_expr[4] = int[4](1, x, int((v_1 + uint(1))), nonempty[3u]);
   int nested_empty[2][3][4] = int[2][3][4](int[3][4](int[4](0, 0, 0, 0), int[4](0, 0, 0, 0), int[4](0, 0, 0, 0)), int[3][4](int[4](0, 0, 0, 0), int[4](0, 0, 0, 0), int[4](0, 0, 0, 0)));
   int nested_nonempty[2][3][4] = int[2][3][4](int[3][4](int[4](1, 2, 3, 4), int[4](5, 6, 7, 8), int[4](9, 10, 11, 12)), int[3][4](int[4](13, 14, 15, 16), int[4](17, 18, 19, 20), int[4](21, 22, 23, 24)));
-  int v_1[4] = int[4](1, 2, x, (x + 1));
-  int nested_nonempty_with_expr[2][3][4] = int[2][3][4](int[3][4](v_1, int[4](5, 6, nonempty[2u], (nonempty[3u] + 1)), nonempty), nested_nonempty[1u]);
+  uint v_2 = uint(x);
+  int v_3[4] = int[4](1, 2, x, int((v_2 + uint(1))));
+  uint v_4 = uint(nonempty[3u]);
+  int nested_nonempty_with_expr[2][3][4] = int[2][3][4](int[3][4](v_3, int[4](5, 6, nonempty[2u], int((v_4 + uint(1)))), nonempty), nested_nonempty[1u]);
   int subexpr_empty = 0;
   int subexpr_nonempty = 3;
-  int subexpr_nonempty_with_expr = int[4](1, x, (x + 1), nonempty[3u])[2u];
+  uint v_5 = uint(x);
+  int subexpr_nonempty_with_expr = int[4](1, x, int((v_5 + uint(1))), nonempty[3u])[2u];
   int subexpr_nested_empty[4] = int[4](0, 0, 0, 0);
   int subexpr_nested_nonempty[4] = int[4](5, 6, 7, 8);
-  int subexpr_nested_nonempty_with_expr[4] = int[2][4](int[4](1, x, (x + 1), nonempty[3u]), nested_nonempty[1u][2u])[1u];
-  v.inner = (((((((((((empty[0u] + nonempty[0u]) + nonempty_with_expr[0u]) + nested_empty[0u][0u][0u]) + nested_nonempty[0u][0u][0u]) + nested_nonempty_with_expr[0u][0u][0u]) + subexpr_empty) + subexpr_nonempty) + subexpr_nonempty_with_expr) + subexpr_nested_empty[0u]) + subexpr_nested_nonempty[0u]) + subexpr_nested_nonempty_with_expr[0u]);
+  uint v_6 = uint(x);
+  int subexpr_nested_nonempty_with_expr[4] = int[2][4](int[4](1, x, int((v_6 + uint(1))), nonempty[3u]), nested_nonempty[1u][2u])[1u];
+  uint v_7 = uint(empty[0u]);
+  uint v_8 = uint(int((v_7 + uint(nonempty[0u]))));
+  uint v_9 = uint(int((v_8 + uint(nonempty_with_expr[0u]))));
+  uint v_10 = uint(int((v_9 + uint(nested_empty[0u][0u][0u]))));
+  uint v_11 = uint(int((v_10 + uint(nested_nonempty[0u][0u][0u]))));
+  uint v_12 = uint(int((v_11 + uint(nested_nonempty_with_expr[0u][0u][0u]))));
+  uint v_13 = uint(int((v_12 + uint(subexpr_empty))));
+  uint v_14 = uint(int((v_13 + uint(subexpr_nonempty))));
+  uint v_15 = uint(int((v_14 + uint(subexpr_nonempty_with_expr))));
+  uint v_16 = uint(int((v_15 + uint(subexpr_nested_empty[0u]))));
+  uint v_17 = uint(int((v_16 + uint(subexpr_nested_nonempty[0u]))));
+  v.inner = int((v_17 + uint(subexpr_nested_nonempty_with_expr[0u])));
 }
diff --git a/test/tint/array/type_initializer.wgsl.expected.spvasm b/test/tint/array/type_initializer.wgsl.expected.spvasm
index 1be5596..3a481ed 100644
--- a/test/tint/array/type_initializer.wgsl.expected.spvasm
+++ b/test/tint/array/type_initializer.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 99
+; Bound: 147
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -58,74 +58,122 @@
      %int_10 = OpConstant %int 10
      %int_11 = OpConstant %int 11
      %int_12 = OpConstant %int 12
-         %34 = OpConstantComposite %_arr_int_uint_4 %int_9 %int_10 %int_11 %int_12
-         %28 = OpConstantComposite %_arr__arr_int_uint_4_uint_3 %nonempty %subexpr_nested_nonempty %34
+         %37 = OpConstantComposite %_arr_int_uint_4 %int_9 %int_10 %int_11 %int_12
+         %31 = OpConstantComposite %_arr__arr_int_uint_4_uint_3 %nonempty %subexpr_nested_nonempty %37
      %int_13 = OpConstant %int 13
      %int_14 = OpConstant %int 14
      %int_15 = OpConstant %int 15
      %int_16 = OpConstant %int 16
-         %40 = OpConstantComposite %_arr_int_uint_4 %int_13 %int_14 %int_15 %int_16
+         %43 = OpConstantComposite %_arr_int_uint_4 %int_13 %int_14 %int_15 %int_16
      %int_17 = OpConstant %int 17
      %int_18 = OpConstant %int 18
      %int_19 = OpConstant %int 19
      %int_20 = OpConstant %int 20
-         %45 = OpConstantComposite %_arr_int_uint_4 %int_17 %int_18 %int_19 %int_20
+         %48 = OpConstantComposite %_arr_int_uint_4 %int_17 %int_18 %int_19 %int_20
      %int_21 = OpConstant %int 21
      %int_22 = OpConstant %int 22
      %int_23 = OpConstant %int 23
      %int_24 = OpConstant %int 24
-         %50 = OpConstantComposite %_arr_int_uint_4 %int_21 %int_22 %int_23 %int_24
-         %39 = OpConstantComposite %_arr__arr_int_uint_4_uint_3 %40 %45 %50
-%nested_nonempty = OpConstantComposite %_arr__arr__arr_int_uint_4_uint_3_uint_2 %28 %39
+         %53 = OpConstantComposite %_arr_int_uint_4 %int_21 %int_22 %int_23 %int_24
+         %42 = OpConstantComposite %_arr__arr_int_uint_4_uint_3 %43 %48 %53
+%nested_nonempty = OpConstantComposite %_arr__arr__arr_int_uint_4_uint_3_uint_2 %31 %42
 %subexpr_empty = OpConstant %int 0
 %_arr__arr_int_uint_4_uint_2 = OpTypeArray %_arr_int_uint_4 %uint_2
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
        %main = OpFunction %void None %7
           %8 = OpLabel
-         %19 = OpIAdd %int %x %int_1
-         %20 = OpCompositeExtract %int %nonempty 3
-%nonempty_with_expr = OpCompositeConstruct %_arr_int_uint_4 %int_1 %x %19 %20
-         %55 = OpIAdd %int %x %int_1
-         %56 = OpCompositeConstruct %_arr_int_uint_4 %int_1 %int_2 %x %55
-         %57 = OpCompositeExtract %int %nonempty 2
-         %58 = OpCompositeExtract %int %nonempty 3
-         %59 = OpIAdd %int %58 %int_1
-         %60 = OpCompositeConstruct %_arr_int_uint_4 %int_5 %int_6 %57 %59
-         %61 = OpCompositeConstruct %_arr__arr_int_uint_4_uint_3 %56 %60 %nonempty
-         %62 = OpCompositeExtract %_arr__arr_int_uint_4_uint_3 %nested_nonempty 1
-%nested_nonempty_with_expr = OpCompositeConstruct %_arr__arr__arr_int_uint_4_uint_3_uint_2 %61 %62
-         %65 = OpIAdd %int %x %int_1
-         %66 = OpCompositeExtract %int %nonempty 3
-         %67 = OpCompositeConstruct %_arr_int_uint_4 %int_1 %x %65 %66
-%subexpr_nonempty_with_expr = OpCompositeExtract %int %67 2
-         %69 = OpIAdd %int %x %int_1
-         %70 = OpCompositeExtract %int %nonempty 3
-         %71 = OpCompositeConstruct %_arr_int_uint_4 %int_1 %x %69 %70
-         %72 = OpCompositeExtract %_arr_int_uint_4 %nested_nonempty 1 2
-         %74 = OpCompositeConstruct %_arr__arr_int_uint_4_uint_2 %71 %72
-%subexpr_nested_nonempty_with_expr = OpCompositeExtract %_arr_int_uint_4 %74 1
-         %76 = OpCompositeExtract %int %empty 0
-         %77 = OpCompositeExtract %int %nonempty 0
-         %78 = OpIAdd %int %76 %77
-         %79 = OpCompositeExtract %int %nonempty_with_expr 0
-         %80 = OpIAdd %int %78 %79
-         %81 = OpCompositeExtract %int %nested_empty 0 0 0
-         %82 = OpIAdd %int %80 %81
-         %83 = OpCompositeExtract %int %nested_nonempty 0 0 0
-         %84 = OpIAdd %int %82 %83
-         %85 = OpCompositeExtract %int %nested_nonempty_with_expr 0 0 0
-         %86 = OpIAdd %int %84 %85
-         %87 = OpIAdd %int %86 %subexpr_empty
-         %88 = OpIAdd %int %87 %subexpr_nonempty
-         %89 = OpIAdd %int %88 %subexpr_nonempty_with_expr
-         %90 = OpCompositeExtract %int %empty 0
-         %91 = OpIAdd %int %89 %90
-         %92 = OpCompositeExtract %int %subexpr_nested_nonempty 0
-         %93 = OpIAdd %int %91 %92
-         %94 = OpCompositeExtract %int %subexpr_nested_nonempty_with_expr 0
-         %95 = OpIAdd %int %93 %94
-         %96 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %96 %95 None
+         %19 = OpBitcast %uint %x
+         %20 = OpBitcast %uint %int_1
+         %21 = OpIAdd %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpCompositeExtract %int %nonempty 3
+%nonempty_with_expr = OpCompositeConstruct %_arr_int_uint_4 %int_1 %x %22 %23
+         %58 = OpBitcast %uint %x
+         %59 = OpBitcast %uint %int_1
+         %60 = OpIAdd %uint %58 %59
+         %61 = OpBitcast %int %60
+         %62 = OpCompositeConstruct %_arr_int_uint_4 %int_1 %int_2 %x %61
+         %63 = OpCompositeExtract %int %nonempty 2
+         %64 = OpCompositeExtract %int %nonempty 3
+         %65 = OpBitcast %uint %64
+         %66 = OpBitcast %uint %int_1
+         %67 = OpIAdd %uint %65 %66
+         %68 = OpBitcast %int %67
+         %69 = OpCompositeConstruct %_arr_int_uint_4 %int_5 %int_6 %63 %68
+         %70 = OpCompositeConstruct %_arr__arr_int_uint_4_uint_3 %62 %69 %nonempty
+         %71 = OpCompositeExtract %_arr__arr_int_uint_4_uint_3 %nested_nonempty 1
+%nested_nonempty_with_expr = OpCompositeConstruct %_arr__arr__arr_int_uint_4_uint_3_uint_2 %70 %71
+         %74 = OpBitcast %uint %x
+         %75 = OpBitcast %uint %int_1
+         %76 = OpIAdd %uint %74 %75
+         %77 = OpBitcast %int %76
+         %78 = OpCompositeExtract %int %nonempty 3
+         %79 = OpCompositeConstruct %_arr_int_uint_4 %int_1 %x %77 %78
+%subexpr_nonempty_with_expr = OpCompositeExtract %int %79 2
+         %81 = OpBitcast %uint %x
+         %82 = OpBitcast %uint %int_1
+         %83 = OpIAdd %uint %81 %82
+         %84 = OpBitcast %int %83
+         %85 = OpCompositeExtract %int %nonempty 3
+         %86 = OpCompositeConstruct %_arr_int_uint_4 %int_1 %x %84 %85
+         %87 = OpCompositeExtract %_arr_int_uint_4 %nested_nonempty 1 2
+         %89 = OpCompositeConstruct %_arr__arr_int_uint_4_uint_2 %86 %87
+%subexpr_nested_nonempty_with_expr = OpCompositeExtract %_arr_int_uint_4 %89 1
+         %91 = OpCompositeExtract %int %empty 0
+         %92 = OpCompositeExtract %int %nonempty 0
+         %93 = OpBitcast %uint %91
+         %94 = OpBitcast %uint %92
+         %95 = OpIAdd %uint %93 %94
+         %96 = OpBitcast %int %95
+         %97 = OpCompositeExtract %int %nonempty_with_expr 0
+         %98 = OpBitcast %uint %96
+         %99 = OpBitcast %uint %97
+        %100 = OpIAdd %uint %98 %99
+        %101 = OpBitcast %int %100
+        %102 = OpCompositeExtract %int %nested_empty 0 0 0
+        %103 = OpBitcast %uint %101
+        %104 = OpBitcast %uint %102
+        %105 = OpIAdd %uint %103 %104
+        %106 = OpBitcast %int %105
+        %107 = OpCompositeExtract %int %nested_nonempty 0 0 0
+        %108 = OpBitcast %uint %106
+        %109 = OpBitcast %uint %107
+        %110 = OpIAdd %uint %108 %109
+        %111 = OpBitcast %int %110
+        %112 = OpCompositeExtract %int %nested_nonempty_with_expr 0 0 0
+        %113 = OpBitcast %uint %111
+        %114 = OpBitcast %uint %112
+        %115 = OpIAdd %uint %113 %114
+        %116 = OpBitcast %int %115
+        %117 = OpBitcast %uint %116
+        %118 = OpBitcast %uint %subexpr_empty
+        %119 = OpIAdd %uint %117 %118
+        %120 = OpBitcast %int %119
+        %121 = OpBitcast %uint %120
+        %122 = OpBitcast %uint %subexpr_nonempty
+        %123 = OpIAdd %uint %121 %122
+        %124 = OpBitcast %int %123
+        %125 = OpBitcast %uint %124
+        %126 = OpBitcast %uint %subexpr_nonempty_with_expr
+        %127 = OpIAdd %uint %125 %126
+        %128 = OpBitcast %int %127
+        %129 = OpCompositeExtract %int %empty 0
+        %130 = OpBitcast %uint %128
+        %131 = OpBitcast %uint %129
+        %132 = OpIAdd %uint %130 %131
+        %133 = OpBitcast %int %132
+        %134 = OpCompositeExtract %int %subexpr_nested_nonempty 0
+        %135 = OpBitcast %uint %133
+        %136 = OpBitcast %uint %134
+        %137 = OpIAdd %uint %135 %136
+        %138 = OpBitcast %int %137
+        %139 = OpCompositeExtract %int %subexpr_nested_nonempty_with_expr 0
+        %140 = OpBitcast %uint %138
+        %141 = OpBitcast %uint %139
+        %142 = OpIAdd %uint %140 %141
+        %143 = OpBitcast %int %142
+        %144 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %144 %143 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl
index 7f3474c..6ff42e1 100644
--- a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl
@@ -90,24 +90,62 @@
   mat4 mat4x4_f32 = sb.arr[v_21].mat4x4_f32;
   uint v_22 = min(idx, (uint(sb.arr.length()) - 1u));
   vec3 arr2_vec3_f32[2] = sb.arr[v_22].arr2_vec3_f32;
-  int v_23 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_24 = (v_23 + int(scalar_u32));
-  int v_25 = ((v_24 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_26 = (v_25 + int(vec2_u32.x));
-  int v_27 = ((v_26 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_28 = (v_27 + int(vec3_u32.y));
-  int v_29 = ((v_28 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_30 = (v_29 + int(vec4_u32.z));
-  int v_31 = (v_30 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_32 = (v_31 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_33 = (v_32 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_34 = (v_33 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_35 = (v_34 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_36 = (v_35 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_37 = (v_36 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_38 = (v_37 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_39 = (v_38 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  v.inner = (v_39 + tint_f32_to_i32(arr2_vec3_f32[0u].x));
+  uint v_23 = uint(tint_f32_to_i32(scalar_f32));
+  int v_24 = int((v_23 + uint(scalar_i32)));
+  int v_25 = int(scalar_u32);
+  uint v_26 = uint(v_24);
+  int v_27 = int((v_26 + uint(v_25)));
+  int v_28 = tint_f32_to_i32(vec2_f32.x);
+  uint v_29 = uint(v_27);
+  uint v_30 = uint(int((v_29 + uint(v_28))));
+  int v_31 = int((v_30 + uint(vec2_i32.x)));
+  int v_32 = int(vec2_u32.x);
+  uint v_33 = uint(v_31);
+  int v_34 = int((v_33 + uint(v_32)));
+  int v_35 = tint_f32_to_i32(vec3_f32.y);
+  uint v_36 = uint(v_34);
+  uint v_37 = uint(int((v_36 + uint(v_35))));
+  int v_38 = int((v_37 + uint(vec3_i32.y)));
+  int v_39 = int(vec3_u32.y);
+  uint v_40 = uint(v_38);
+  int v_41 = int((v_40 + uint(v_39)));
+  int v_42 = tint_f32_to_i32(vec4_f32.z);
+  uint v_43 = uint(v_41);
+  uint v_44 = uint(int((v_43 + uint(v_42))));
+  int v_45 = int((v_44 + uint(vec4_i32.z)));
+  int v_46 = int(vec4_u32.z);
+  uint v_47 = uint(v_45);
+  int v_48 = int((v_47 + uint(v_46)));
+  int v_49 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_50 = uint(v_48);
+  int v_51 = int((v_50 + uint(v_49)));
+  int v_52 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_53 = uint(v_51);
+  int v_54 = int((v_53 + uint(v_52)));
+  int v_55 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_56 = uint(v_54);
+  int v_57 = int((v_56 + uint(v_55)));
+  int v_58 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_59 = uint(v_57);
+  int v_60 = int((v_59 + uint(v_58)));
+  int v_61 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_62 = uint(v_60);
+  int v_63 = int((v_62 + uint(v_61)));
+  int v_64 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_65 = uint(v_63);
+  int v_66 = int((v_65 + uint(v_64)));
+  int v_67 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_68 = uint(v_66);
+  int v_69 = int((v_68 + uint(v_67)));
+  int v_70 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_71 = uint(v_69);
+  int v_72 = int((v_71 + uint(v_70)));
+  int v_73 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_74 = uint(v_72);
+  int v_75 = int((v_74 + uint(v_73)));
+  int v_76 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_77 = uint(v_75);
+  v.inner = int((v_77 + uint(v_76)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.spvasm b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.spvasm
index 3cc6552..e3c9932 100644
--- a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.spvasm
+++ b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 316
+; Bound: 379
 ; Schema: 0
                OpCapability Shader
          %46 = OpExtInstImport "GLSL.std.450"
@@ -200,14 +200,14 @@
     %uint_21 = OpConstant %uint 21
 %_arr_v3float_uint_2_0 = OpTypeArray %v3float %uint_2
 %_ptr_StorageBuffer_int_0 = OpTypePointer StorageBuffer %int
-        %281 = OpTypeFunction %int %float
+        %344 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %288 = OpTypeFunction %void
-        %293 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %351 = OpTypeFunction %void
+        %356 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %299 = OpConstantNull %_arr_v3float_uint_2_0
+        %362 = OpConstantNull %_arr_v3float_uint_2_0
        %bool = OpTypeBool
 %_ptr_Function_v3float = OpTypePointer Function %v3float
  %main_inner = OpFunction %void None %37
@@ -347,109 +347,172 @@
         %215 = OpLoad %_arr_v3float_uint_2 %212 None
 %arr2_vec3_f32 = OpFunctionCall %_arr_v3float_uint_2_0 %tint_convert_explicit_layout %215
         %219 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %221 = OpIAdd %int %219 %scalar_i32
-        %222 = OpBitcast %int %scalar_u32
-        %223 = OpIAdd %int %221 %222
-        %224 = OpCompositeExtract %float %vec2_f32 0
-        %225 = OpFunctionCall %int %tint_f32_to_i32 %224
-        %226 = OpIAdd %int %223 %225
-        %227 = OpCompositeExtract %int %vec2_i32 0
-        %228 = OpIAdd %int %226 %227
-        %229 = OpCompositeExtract %uint %vec2_u32 0
-        %230 = OpBitcast %int %229
-        %231 = OpIAdd %int %228 %230
-        %232 = OpCompositeExtract %float %vec3_f32 1
-        %233 = OpFunctionCall %int %tint_f32_to_i32 %232
-        %234 = OpIAdd %int %231 %233
-        %235 = OpCompositeExtract %int %vec3_i32 1
-        %236 = OpIAdd %int %234 %235
-        %237 = OpCompositeExtract %uint %vec3_u32 1
-        %238 = OpBitcast %int %237
-        %239 = OpIAdd %int %236 %238
-        %240 = OpCompositeExtract %float %vec4_f32 2
-        %241 = OpFunctionCall %int %tint_f32_to_i32 %240
-        %242 = OpIAdd %int %239 %241
-        %243 = OpCompositeExtract %int %vec4_i32 2
-        %244 = OpIAdd %int %242 %243
-        %245 = OpCompositeExtract %uint %vec4_u32 2
+        %221 = OpBitcast %uint %219
+        %222 = OpBitcast %uint %scalar_i32
+        %223 = OpIAdd %uint %221 %222
+        %224 = OpBitcast %int %223
+        %225 = OpBitcast %int %scalar_u32
+        %226 = OpBitcast %uint %224
+        %227 = OpBitcast %uint %225
+        %228 = OpIAdd %uint %226 %227
+        %229 = OpBitcast %int %228
+        %230 = OpCompositeExtract %float %vec2_f32 0
+        %231 = OpFunctionCall %int %tint_f32_to_i32 %230
+        %232 = OpBitcast %uint %229
+        %233 = OpBitcast %uint %231
+        %234 = OpIAdd %uint %232 %233
+        %235 = OpBitcast %int %234
+        %236 = OpCompositeExtract %int %vec2_i32 0
+        %237 = OpBitcast %uint %235
+        %238 = OpBitcast %uint %236
+        %239 = OpIAdd %uint %237 %238
+        %240 = OpBitcast %int %239
+        %241 = OpCompositeExtract %uint %vec2_u32 0
+        %242 = OpBitcast %int %241
+        %243 = OpBitcast %uint %240
+        %244 = OpBitcast %uint %242
+        %245 = OpIAdd %uint %243 %244
         %246 = OpBitcast %int %245
-        %247 = OpIAdd %int %244 %246
-        %248 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %249 = OpFunctionCall %int %tint_f32_to_i32 %248
-        %250 = OpIAdd %int %247 %249
-        %251 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %252 = OpFunctionCall %int %tint_f32_to_i32 %251
-        %253 = OpIAdd %int %250 %252
-        %254 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %255 = OpFunctionCall %int %tint_f32_to_i32 %254
-        %256 = OpIAdd %int %253 %255
-        %257 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %258 = OpFunctionCall %int %tint_f32_to_i32 %257
-        %259 = OpIAdd %int %256 %258
-        %260 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %261 = OpFunctionCall %int %tint_f32_to_i32 %260
-        %262 = OpIAdd %int %259 %261
-        %263 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %264 = OpFunctionCall %int %tint_f32_to_i32 %263
-        %265 = OpIAdd %int %262 %264
-        %266 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %267 = OpFunctionCall %int %tint_f32_to_i32 %266
-        %268 = OpIAdd %int %265 %267
-        %269 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %270 = OpFunctionCall %int %tint_f32_to_i32 %269
-        %271 = OpIAdd %int %268 %270
-        %272 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %273 = OpFunctionCall %int %tint_f32_to_i32 %272
-        %274 = OpIAdd %int %271 %273
-        %275 = OpCompositeExtract %float %arr2_vec3_f32 0 0
-        %276 = OpFunctionCall %int %tint_f32_to_i32 %275
-        %277 = OpIAdd %int %274 %276
-        %278 = OpAccessChain %_ptr_StorageBuffer_int_0 %29 %uint_0
-               OpStore %278 %277 None
+        %247 = OpCompositeExtract %float %vec3_f32 1
+        %248 = OpFunctionCall %int %tint_f32_to_i32 %247
+        %249 = OpBitcast %uint %246
+        %250 = OpBitcast %uint %248
+        %251 = OpIAdd %uint %249 %250
+        %252 = OpBitcast %int %251
+        %253 = OpCompositeExtract %int %vec3_i32 1
+        %254 = OpBitcast %uint %252
+        %255 = OpBitcast %uint %253
+        %256 = OpIAdd %uint %254 %255
+        %257 = OpBitcast %int %256
+        %258 = OpCompositeExtract %uint %vec3_u32 1
+        %259 = OpBitcast %int %258
+        %260 = OpBitcast %uint %257
+        %261 = OpBitcast %uint %259
+        %262 = OpIAdd %uint %260 %261
+        %263 = OpBitcast %int %262
+        %264 = OpCompositeExtract %float %vec4_f32 2
+        %265 = OpFunctionCall %int %tint_f32_to_i32 %264
+        %266 = OpBitcast %uint %263
+        %267 = OpBitcast %uint %265
+        %268 = OpIAdd %uint %266 %267
+        %269 = OpBitcast %int %268
+        %270 = OpCompositeExtract %int %vec4_i32 2
+        %271 = OpBitcast %uint %269
+        %272 = OpBitcast %uint %270
+        %273 = OpIAdd %uint %271 %272
+        %274 = OpBitcast %int %273
+        %275 = OpCompositeExtract %uint %vec4_u32 2
+        %276 = OpBitcast %int %275
+        %277 = OpBitcast %uint %274
+        %278 = OpBitcast %uint %276
+        %279 = OpIAdd %uint %277 %278
+        %280 = OpBitcast %int %279
+        %281 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %282 = OpFunctionCall %int %tint_f32_to_i32 %281
+        %283 = OpBitcast %uint %280
+        %284 = OpBitcast %uint %282
+        %285 = OpIAdd %uint %283 %284
+        %286 = OpBitcast %int %285
+        %287 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %288 = OpFunctionCall %int %tint_f32_to_i32 %287
+        %289 = OpBitcast %uint %286
+        %290 = OpBitcast %uint %288
+        %291 = OpIAdd %uint %289 %290
+        %292 = OpBitcast %int %291
+        %293 = OpCompositeExtract %float %mat2x4_f32 0 0
+        %294 = OpFunctionCall %int %tint_f32_to_i32 %293
+        %295 = OpBitcast %uint %292
+        %296 = OpBitcast %uint %294
+        %297 = OpIAdd %uint %295 %296
+        %298 = OpBitcast %int %297
+        %299 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %300 = OpFunctionCall %int %tint_f32_to_i32 %299
+        %301 = OpBitcast %uint %298
+        %302 = OpBitcast %uint %300
+        %303 = OpIAdd %uint %301 %302
+        %304 = OpBitcast %int %303
+        %305 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %306 = OpFunctionCall %int %tint_f32_to_i32 %305
+        %307 = OpBitcast %uint %304
+        %308 = OpBitcast %uint %306
+        %309 = OpIAdd %uint %307 %308
+        %310 = OpBitcast %int %309
+        %311 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %312 = OpFunctionCall %int %tint_f32_to_i32 %311
+        %313 = OpBitcast %uint %310
+        %314 = OpBitcast %uint %312
+        %315 = OpIAdd %uint %313 %314
+        %316 = OpBitcast %int %315
+        %317 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %318 = OpFunctionCall %int %tint_f32_to_i32 %317
+        %319 = OpBitcast %uint %316
+        %320 = OpBitcast %uint %318
+        %321 = OpIAdd %uint %319 %320
+        %322 = OpBitcast %int %321
+        %323 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %324 = OpFunctionCall %int %tint_f32_to_i32 %323
+        %325 = OpBitcast %uint %322
+        %326 = OpBitcast %uint %324
+        %327 = OpIAdd %uint %325 %326
+        %328 = OpBitcast %int %327
+        %329 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %330 = OpFunctionCall %int %tint_f32_to_i32 %329
+        %331 = OpBitcast %uint %328
+        %332 = OpBitcast %uint %330
+        %333 = OpIAdd %uint %331 %332
+        %334 = OpBitcast %int %333
+        %335 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %336 = OpFunctionCall %int %tint_f32_to_i32 %335
+        %337 = OpBitcast %uint %334
+        %338 = OpBitcast %uint %336
+        %339 = OpIAdd %uint %337 %338
+        %340 = OpBitcast %int %339
+        %341 = OpAccessChain %_ptr_StorageBuffer_int_0 %29 %uint_0
+               OpStore %341 %340 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %281
+%tint_f32_to_i32 = OpFunction %int None %344
       %value = OpFunctionParameter %float
-        %282 = OpLabel
-        %283 = OpExtInst %float %46 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %286 = OpConvertFToS %int %283
-               OpReturnValue %286
+        %345 = OpLabel
+        %346 = OpExtInst %float %46 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %349 = OpConvertFToS %int %346
+               OpReturnValue %349
                OpFunctionEnd
-       %main = OpFunction %void None %288
-        %289 = OpLabel
-        %290 = OpLoad %uint %main_local_invocation_index_Input None
-        %291 = OpFunctionCall %void %main_inner %290
+       %main = OpFunction %void None %351
+        %352 = OpLabel
+        %353 = OpLoad %uint %main_local_invocation_index_Input None
+        %354 = OpFunctionCall %void %main_inner %353
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %293
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %356
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %294 = OpLabel
-        %295 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %297 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %299
-               OpStore %295 %tint_source
-               OpBranch %300
-        %300 = OpLabel
-               OpBranch %303
-        %303 = OpLabel
-        %305 = OpPhi %uint %uint_0 %300 %306 %302
-               OpLoopMerge %304 %302 None
-               OpBranch %301
-        %301 = OpLabel
-        %308 = OpUGreaterThanEqual %bool %305 %uint_2
-               OpSelectionMerge %310 None
-               OpBranchConditional %308 %311 %310
-        %311 = OpLabel
-               OpBranch %304
-        %310 = OpLabel
-        %312 = OpAccessChain %_ptr_Function_v3float %295 %305
-        %314 = OpLoad %v3float %312 None
-        %315 = OpAccessChain %_ptr_Function_v3float %297 %305
-               OpStore %315 %314 None
-               OpBranch %302
-        %302 = OpLabel
-        %306 = OpIAdd %uint %305 %uint_1
-               OpBranch %303
-        %304 = OpLabel
-        %307 = OpLoad %_arr_v3float_uint_2_0 %297 None
-               OpReturnValue %307
+        %357 = OpLabel
+        %358 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %360 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %362
+               OpStore %358 %tint_source
+               OpBranch %363
+        %363 = OpLabel
+               OpBranch %366
+        %366 = OpLabel
+        %368 = OpPhi %uint %uint_0 %363 %369 %365
+               OpLoopMerge %367 %365 None
+               OpBranch %364
+        %364 = OpLabel
+        %371 = OpUGreaterThanEqual %bool %368 %uint_2
+               OpSelectionMerge %373 None
+               OpBranchConditional %371 %374 %373
+        %374 = OpLabel
+               OpBranch %367
+        %373 = OpLabel
+        %375 = OpAccessChain %_ptr_Function_v3float %358 %368
+        %377 = OpLoad %v3float %375 None
+        %378 = OpAccessChain %_ptr_Function_v3float %360 %368
+               OpStore %378 %377 None
+               OpBranch %365
+        %365 = OpLabel
+        %369 = OpIAdd %uint %368 %uint_1
+               OpBranch %366
+        %367 = OpLabel
+        %370 = OpLoad %_arr_v3float_uint_2_0 %360 None
+               OpReturnValue %370
                OpFunctionEnd
diff --git a/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl b/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl
index d1f797c..6a8887c 100644
--- a/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl
@@ -141,38 +141,104 @@
   vec3 arr2_vec3_f32[2] = sb.arr[v_35].arr2_vec3_f32;
   uint v_36 = min(idx, (uint(sb.arr.length()) - 1u));
   f16mat4x2 arr2_mat4x2_f16[2] = sb.arr[v_36].arr2_mat4x2_f16;
-  int v_37 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_38 = (v_37 + int(scalar_u32));
-  int v_39 = (v_38 + tint_f16_to_i32(scalar_f16));
-  int v_40 = ((v_39 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_41 = (v_40 + int(vec2_u32.x));
-  int v_42 = (v_41 + tint_f16_to_i32(vec2_f16.x));
-  int v_43 = ((v_42 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_44 = (v_43 + int(vec3_u32.y));
-  int v_45 = (v_44 + tint_f16_to_i32(vec3_f16.y));
-  int v_46 = ((v_45 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_47 = (v_46 + int(vec4_u32.z));
-  int v_48 = (v_47 + tint_f16_to_i32(vec4_f16.z));
-  int v_49 = (v_48 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_50 = (v_49 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_51 = (v_50 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_52 = (v_51 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_53 = (v_52 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_54 = (v_53 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_55 = (v_54 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_56 = (v_55 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_57 = (v_56 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  int v_58 = (v_57 + tint_f16_to_i32(mat2x2_f16[0u].x));
-  int v_59 = (v_58 + tint_f16_to_i32(mat2x3_f16[0u].x));
-  int v_60 = (v_59 + tint_f16_to_i32(mat2x4_f16[0u].x));
-  int v_61 = (v_60 + tint_f16_to_i32(mat3x2_f16[0u].x));
-  int v_62 = (v_61 + tint_f16_to_i32(mat3x3_f16[0u].x));
-  int v_63 = (v_62 + tint_f16_to_i32(mat3x4_f16[0u].x));
-  int v_64 = (v_63 + tint_f16_to_i32(mat4x2_f16[0u].x));
-  int v_65 = (v_64 + tint_f16_to_i32(mat4x3_f16[0u].x));
-  int v_66 = (v_65 + tint_f16_to_i32(mat4x4_f16[0u].x));
-  int v_67 = (v_66 + tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x));
-  v.inner = (v_67 + tint_f32_to_i32(arr2_vec3_f32[0u].x));
+  uint v_37 = uint(tint_f32_to_i32(scalar_f32));
+  int v_38 = int((v_37 + uint(scalar_i32)));
+  int v_39 = int(scalar_u32);
+  uint v_40 = uint(v_38);
+  int v_41 = int((v_40 + uint(v_39)));
+  int v_42 = tint_f16_to_i32(scalar_f16);
+  uint v_43 = uint(v_41);
+  int v_44 = int((v_43 + uint(v_42)));
+  int v_45 = tint_f32_to_i32(vec2_f32.x);
+  uint v_46 = uint(v_44);
+  uint v_47 = uint(int((v_46 + uint(v_45))));
+  int v_48 = int((v_47 + uint(vec2_i32.x)));
+  int v_49 = int(vec2_u32.x);
+  uint v_50 = uint(v_48);
+  int v_51 = int((v_50 + uint(v_49)));
+  int v_52 = tint_f16_to_i32(vec2_f16.x);
+  uint v_53 = uint(v_51);
+  int v_54 = int((v_53 + uint(v_52)));
+  int v_55 = tint_f32_to_i32(vec3_f32.y);
+  uint v_56 = uint(v_54);
+  uint v_57 = uint(int((v_56 + uint(v_55))));
+  int v_58 = int((v_57 + uint(vec3_i32.y)));
+  int v_59 = int(vec3_u32.y);
+  uint v_60 = uint(v_58);
+  int v_61 = int((v_60 + uint(v_59)));
+  int v_62 = tint_f16_to_i32(vec3_f16.y);
+  uint v_63 = uint(v_61);
+  int v_64 = int((v_63 + uint(v_62)));
+  int v_65 = tint_f32_to_i32(vec4_f32.z);
+  uint v_66 = uint(v_64);
+  uint v_67 = uint(int((v_66 + uint(v_65))));
+  int v_68 = int((v_67 + uint(vec4_i32.z)));
+  int v_69 = int(vec4_u32.z);
+  uint v_70 = uint(v_68);
+  int v_71 = int((v_70 + uint(v_69)));
+  int v_72 = tint_f16_to_i32(vec4_f16.z);
+  uint v_73 = uint(v_71);
+  int v_74 = int((v_73 + uint(v_72)));
+  int v_75 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_76 = uint(v_74);
+  int v_77 = int((v_76 + uint(v_75)));
+  int v_78 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_79 = uint(v_77);
+  int v_80 = int((v_79 + uint(v_78)));
+  int v_81 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_82 = uint(v_80);
+  int v_83 = int((v_82 + uint(v_81)));
+  int v_84 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_85 = uint(v_83);
+  int v_86 = int((v_85 + uint(v_84)));
+  int v_87 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_88 = uint(v_86);
+  int v_89 = int((v_88 + uint(v_87)));
+  int v_90 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_91 = uint(v_89);
+  int v_92 = int((v_91 + uint(v_90)));
+  int v_93 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_94 = uint(v_92);
+  int v_95 = int((v_94 + uint(v_93)));
+  int v_96 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_97 = uint(v_95);
+  int v_98 = int((v_97 + uint(v_96)));
+  int v_99 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_100 = uint(v_98);
+  int v_101 = int((v_100 + uint(v_99)));
+  int v_102 = tint_f16_to_i32(mat2x2_f16[0u].x);
+  uint v_103 = uint(v_101);
+  int v_104 = int((v_103 + uint(v_102)));
+  int v_105 = tint_f16_to_i32(mat2x3_f16[0u].x);
+  uint v_106 = uint(v_104);
+  int v_107 = int((v_106 + uint(v_105)));
+  int v_108 = tint_f16_to_i32(mat2x4_f16[0u].x);
+  uint v_109 = uint(v_107);
+  int v_110 = int((v_109 + uint(v_108)));
+  int v_111 = tint_f16_to_i32(mat3x2_f16[0u].x);
+  uint v_112 = uint(v_110);
+  int v_113 = int((v_112 + uint(v_111)));
+  int v_114 = tint_f16_to_i32(mat3x3_f16[0u].x);
+  uint v_115 = uint(v_113);
+  int v_116 = int((v_115 + uint(v_114)));
+  int v_117 = tint_f16_to_i32(mat3x4_f16[0u].x);
+  uint v_118 = uint(v_116);
+  int v_119 = int((v_118 + uint(v_117)));
+  int v_120 = tint_f16_to_i32(mat4x2_f16[0u].x);
+  uint v_121 = uint(v_119);
+  int v_122 = int((v_121 + uint(v_120)));
+  int v_123 = tint_f16_to_i32(mat4x3_f16[0u].x);
+  uint v_124 = uint(v_122);
+  int v_125 = int((v_124 + uint(v_123)));
+  int v_126 = tint_f16_to_i32(mat4x4_f16[0u].x);
+  uint v_127 = uint(v_125);
+  int v_128 = int((v_127 + uint(v_126)));
+  int v_129 = tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x);
+  uint v_130 = uint(v_128);
+  int v_131 = int((v_130 + uint(v_129)));
+  int v_132 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_133 = uint(v_131);
+  v.inner = int((v_133 + uint(v_132)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.spvasm b/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.spvasm
index 12ff1aa..c038cba 100644
--- a/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.spvasm
+++ b/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 517
+; Bound: 622
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
@@ -313,23 +313,23 @@
     %uint_35 = OpConstant %uint 35
 %_arr_mat4v2half_uint_2_0 = OpTypeArray %mat4v2half %uint_2
 %_ptr_StorageBuffer_int_0 = OpTypePointer StorageBuffer %int
-        %452 = OpTypeFunction %int %float
+        %557 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %459 = OpTypeFunction %int %half
+        %564 = OpTypeFunction %int %half
 %half_n0x1_ffcp_15 = OpConstant %half -0x1.ffcp+15
 %half_0x1_ffcp_15 = OpConstant %half 0x1.ffcp+15
-        %466 = OpTypeFunction %void
-        %471 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %571 = OpTypeFunction %void
+        %576 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %477 = OpConstantNull %_arr_v3float_uint_2_0
+        %582 = OpConstantNull %_arr_v3float_uint_2_0
        %bool = OpTypeBool
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-        %495 = OpTypeFunction %_arr_mat4v2half_uint_2_0 %_arr_mat4v2half_uint_2
+        %600 = OpTypeFunction %_arr_mat4v2half_uint_2_0 %_arr_mat4v2half_uint_2
 %_ptr_Function__arr_mat4v2half_uint_2 = OpTypePointer Function %_arr_mat4v2half_uint_2
 %_ptr_Function__arr_mat4v2half_uint_2_0 = OpTypePointer Function %_arr_mat4v2half_uint_2_0
-        %501 = OpConstantNull %_arr_mat4v2half_uint_2_0
+        %606 = OpConstantNull %_arr_mat4v2half_uint_2_0
 %_ptr_Function_mat4v2half = OpTypePointer Function %mat4v2half
  %main_inner = OpFunction %void None %51
         %idx = OpFunctionParameter %uint
@@ -553,189 +553,294 @@
         %344 = OpLoad %_arr_mat4v2half_uint_2 %341 None
 %arr2_mat4x2_f16 = OpFunctionCall %_arr_mat4v2half_uint_2_0 %tint_convert_explicit_layout_0 %344
         %348 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %350 = OpIAdd %int %348 %scalar_i32
-        %351 = OpBitcast %int %scalar_u32
-        %352 = OpIAdd %int %350 %351
-        %353 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
-        %355 = OpIAdd %int %352 %353
-        %356 = OpCompositeExtract %float %vec2_f32 0
-        %357 = OpFunctionCall %int %tint_f32_to_i32 %356
-        %358 = OpIAdd %int %355 %357
-        %359 = OpCompositeExtract %int %vec2_i32 0
-        %360 = OpIAdd %int %358 %359
-        %361 = OpCompositeExtract %uint %vec2_u32 0
-        %362 = OpBitcast %int %361
-        %363 = OpIAdd %int %360 %362
-        %364 = OpCompositeExtract %half %vec2_f16 0
-        %365 = OpFunctionCall %int %tint_f16_to_i32 %364
-        %366 = OpIAdd %int %363 %365
-        %367 = OpCompositeExtract %float %vec3_f32 1
-        %368 = OpFunctionCall %int %tint_f32_to_i32 %367
-        %369 = OpIAdd %int %366 %368
-        %370 = OpCompositeExtract %int %vec3_i32 1
-        %371 = OpIAdd %int %369 %370
-        %372 = OpCompositeExtract %uint %vec3_u32 1
-        %373 = OpBitcast %int %372
-        %374 = OpIAdd %int %371 %373
-        %375 = OpCompositeExtract %half %vec3_f16 1
-        %376 = OpFunctionCall %int %tint_f16_to_i32 %375
-        %377 = OpIAdd %int %374 %376
-        %378 = OpCompositeExtract %float %vec4_f32 2
-        %379 = OpFunctionCall %int %tint_f32_to_i32 %378
-        %380 = OpIAdd %int %377 %379
-        %381 = OpCompositeExtract %int %vec4_i32 2
-        %382 = OpIAdd %int %380 %381
-        %383 = OpCompositeExtract %uint %vec4_u32 2
-        %384 = OpBitcast %int %383
-        %385 = OpIAdd %int %382 %384
-        %386 = OpCompositeExtract %half %vec4_f16 2
-        %387 = OpFunctionCall %int %tint_f16_to_i32 %386
-        %388 = OpIAdd %int %385 %387
-        %389 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %390 = OpFunctionCall %int %tint_f32_to_i32 %389
-        %391 = OpIAdd %int %388 %390
-        %392 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %393 = OpFunctionCall %int %tint_f32_to_i32 %392
-        %394 = OpIAdd %int %391 %393
-        %395 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %396 = OpFunctionCall %int %tint_f32_to_i32 %395
-        %397 = OpIAdd %int %394 %396
-        %398 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %399 = OpFunctionCall %int %tint_f32_to_i32 %398
-        %400 = OpIAdd %int %397 %399
-        %401 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %402 = OpFunctionCall %int %tint_f32_to_i32 %401
-        %403 = OpIAdd %int %400 %402
-        %404 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %405 = OpFunctionCall %int %tint_f32_to_i32 %404
-        %406 = OpIAdd %int %403 %405
-        %407 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %408 = OpFunctionCall %int %tint_f32_to_i32 %407
-        %409 = OpIAdd %int %406 %408
-        %410 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %411 = OpFunctionCall %int %tint_f32_to_i32 %410
-        %412 = OpIAdd %int %409 %411
-        %413 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %414 = OpFunctionCall %int %tint_f32_to_i32 %413
-        %415 = OpIAdd %int %412 %414
-        %416 = OpCompositeExtract %half %mat2x2_f16 0 0
-        %417 = OpFunctionCall %int %tint_f16_to_i32 %416
-        %418 = OpIAdd %int %415 %417
-        %419 = OpCompositeExtract %half %mat2x3_f16 0 0
-        %420 = OpFunctionCall %int %tint_f16_to_i32 %419
-        %421 = OpIAdd %int %418 %420
-        %422 = OpCompositeExtract %half %mat2x4_f16 0 0
-        %423 = OpFunctionCall %int %tint_f16_to_i32 %422
-        %424 = OpIAdd %int %421 %423
-        %425 = OpCompositeExtract %half %mat3x2_f16 0 0
-        %426 = OpFunctionCall %int %tint_f16_to_i32 %425
-        %427 = OpIAdd %int %424 %426
-        %428 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %350 = OpBitcast %uint %348
+        %351 = OpBitcast %uint %scalar_i32
+        %352 = OpIAdd %uint %350 %351
+        %353 = OpBitcast %int %352
+        %354 = OpBitcast %int %scalar_u32
+        %355 = OpBitcast %uint %353
+        %356 = OpBitcast %uint %354
+        %357 = OpIAdd %uint %355 %356
+        %358 = OpBitcast %int %357
+        %359 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
+        %361 = OpBitcast %uint %358
+        %362 = OpBitcast %uint %359
+        %363 = OpIAdd %uint %361 %362
+        %364 = OpBitcast %int %363
+        %365 = OpCompositeExtract %float %vec2_f32 0
+        %366 = OpFunctionCall %int %tint_f32_to_i32 %365
+        %367 = OpBitcast %uint %364
+        %368 = OpBitcast %uint %366
+        %369 = OpIAdd %uint %367 %368
+        %370 = OpBitcast %int %369
+        %371 = OpCompositeExtract %int %vec2_i32 0
+        %372 = OpBitcast %uint %370
+        %373 = OpBitcast %uint %371
+        %374 = OpIAdd %uint %372 %373
+        %375 = OpBitcast %int %374
+        %376 = OpCompositeExtract %uint %vec2_u32 0
+        %377 = OpBitcast %int %376
+        %378 = OpBitcast %uint %375
+        %379 = OpBitcast %uint %377
+        %380 = OpIAdd %uint %378 %379
+        %381 = OpBitcast %int %380
+        %382 = OpCompositeExtract %half %vec2_f16 0
+        %383 = OpFunctionCall %int %tint_f16_to_i32 %382
+        %384 = OpBitcast %uint %381
+        %385 = OpBitcast %uint %383
+        %386 = OpIAdd %uint %384 %385
+        %387 = OpBitcast %int %386
+        %388 = OpCompositeExtract %float %vec3_f32 1
+        %389 = OpFunctionCall %int %tint_f32_to_i32 %388
+        %390 = OpBitcast %uint %387
+        %391 = OpBitcast %uint %389
+        %392 = OpIAdd %uint %390 %391
+        %393 = OpBitcast %int %392
+        %394 = OpCompositeExtract %int %vec3_i32 1
+        %395 = OpBitcast %uint %393
+        %396 = OpBitcast %uint %394
+        %397 = OpIAdd %uint %395 %396
+        %398 = OpBitcast %int %397
+        %399 = OpCompositeExtract %uint %vec3_u32 1
+        %400 = OpBitcast %int %399
+        %401 = OpBitcast %uint %398
+        %402 = OpBitcast %uint %400
+        %403 = OpIAdd %uint %401 %402
+        %404 = OpBitcast %int %403
+        %405 = OpCompositeExtract %half %vec3_f16 1
+        %406 = OpFunctionCall %int %tint_f16_to_i32 %405
+        %407 = OpBitcast %uint %404
+        %408 = OpBitcast %uint %406
+        %409 = OpIAdd %uint %407 %408
+        %410 = OpBitcast %int %409
+        %411 = OpCompositeExtract %float %vec4_f32 2
+        %412 = OpFunctionCall %int %tint_f32_to_i32 %411
+        %413 = OpBitcast %uint %410
+        %414 = OpBitcast %uint %412
+        %415 = OpIAdd %uint %413 %414
+        %416 = OpBitcast %int %415
+        %417 = OpCompositeExtract %int %vec4_i32 2
+        %418 = OpBitcast %uint %416
+        %419 = OpBitcast %uint %417
+        %420 = OpIAdd %uint %418 %419
+        %421 = OpBitcast %int %420
+        %422 = OpCompositeExtract %uint %vec4_u32 2
+        %423 = OpBitcast %int %422
+        %424 = OpBitcast %uint %421
+        %425 = OpBitcast %uint %423
+        %426 = OpIAdd %uint %424 %425
+        %427 = OpBitcast %int %426
+        %428 = OpCompositeExtract %half %vec4_f16 2
         %429 = OpFunctionCall %int %tint_f16_to_i32 %428
-        %430 = OpIAdd %int %427 %429
-        %431 = OpCompositeExtract %half %mat3x4_f16 0 0
-        %432 = OpFunctionCall %int %tint_f16_to_i32 %431
-        %433 = OpIAdd %int %430 %432
-        %434 = OpCompositeExtract %half %mat4x2_f16 0 0
-        %435 = OpFunctionCall %int %tint_f16_to_i32 %434
-        %436 = OpIAdd %int %433 %435
-        %437 = OpCompositeExtract %half %mat4x3_f16 0 0
-        %438 = OpFunctionCall %int %tint_f16_to_i32 %437
-        %439 = OpIAdd %int %436 %438
-        %440 = OpCompositeExtract %half %mat4x4_f16 0 0
-        %441 = OpFunctionCall %int %tint_f16_to_i32 %440
-        %442 = OpIAdd %int %439 %441
-        %443 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
-        %444 = OpFunctionCall %int %tint_f16_to_i32 %443
-        %445 = OpIAdd %int %442 %444
-        %446 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %430 = OpBitcast %uint %427
+        %431 = OpBitcast %uint %429
+        %432 = OpIAdd %uint %430 %431
+        %433 = OpBitcast %int %432
+        %434 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %435 = OpFunctionCall %int %tint_f32_to_i32 %434
+        %436 = OpBitcast %uint %433
+        %437 = OpBitcast %uint %435
+        %438 = OpIAdd %uint %436 %437
+        %439 = OpBitcast %int %438
+        %440 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %441 = OpFunctionCall %int %tint_f32_to_i32 %440
+        %442 = OpBitcast %uint %439
+        %443 = OpBitcast %uint %441
+        %444 = OpIAdd %uint %442 %443
+        %445 = OpBitcast %int %444
+        %446 = OpCompositeExtract %float %mat2x4_f32 0 0
         %447 = OpFunctionCall %int %tint_f32_to_i32 %446
-        %448 = OpIAdd %int %445 %447
-        %449 = OpAccessChain %_ptr_StorageBuffer_int_0 %43 %uint_0
-               OpStore %449 %448 None
+        %448 = OpBitcast %uint %445
+        %449 = OpBitcast %uint %447
+        %450 = OpIAdd %uint %448 %449
+        %451 = OpBitcast %int %450
+        %452 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %453 = OpFunctionCall %int %tint_f32_to_i32 %452
+        %454 = OpBitcast %uint %451
+        %455 = OpBitcast %uint %453
+        %456 = OpIAdd %uint %454 %455
+        %457 = OpBitcast %int %456
+        %458 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %459 = OpFunctionCall %int %tint_f32_to_i32 %458
+        %460 = OpBitcast %uint %457
+        %461 = OpBitcast %uint %459
+        %462 = OpIAdd %uint %460 %461
+        %463 = OpBitcast %int %462
+        %464 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %465 = OpFunctionCall %int %tint_f32_to_i32 %464
+        %466 = OpBitcast %uint %463
+        %467 = OpBitcast %uint %465
+        %468 = OpIAdd %uint %466 %467
+        %469 = OpBitcast %int %468
+        %470 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %471 = OpFunctionCall %int %tint_f32_to_i32 %470
+        %472 = OpBitcast %uint %469
+        %473 = OpBitcast %uint %471
+        %474 = OpIAdd %uint %472 %473
+        %475 = OpBitcast %int %474
+        %476 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %477 = OpFunctionCall %int %tint_f32_to_i32 %476
+        %478 = OpBitcast %uint %475
+        %479 = OpBitcast %uint %477
+        %480 = OpIAdd %uint %478 %479
+        %481 = OpBitcast %int %480
+        %482 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %483 = OpFunctionCall %int %tint_f32_to_i32 %482
+        %484 = OpBitcast %uint %481
+        %485 = OpBitcast %uint %483
+        %486 = OpIAdd %uint %484 %485
+        %487 = OpBitcast %int %486
+        %488 = OpCompositeExtract %half %mat2x2_f16 0 0
+        %489 = OpFunctionCall %int %tint_f16_to_i32 %488
+        %490 = OpBitcast %uint %487
+        %491 = OpBitcast %uint %489
+        %492 = OpIAdd %uint %490 %491
+        %493 = OpBitcast %int %492
+        %494 = OpCompositeExtract %half %mat2x3_f16 0 0
+        %495 = OpFunctionCall %int %tint_f16_to_i32 %494
+        %496 = OpBitcast %uint %493
+        %497 = OpBitcast %uint %495
+        %498 = OpIAdd %uint %496 %497
+        %499 = OpBitcast %int %498
+        %500 = OpCompositeExtract %half %mat2x4_f16 0 0
+        %501 = OpFunctionCall %int %tint_f16_to_i32 %500
+        %502 = OpBitcast %uint %499
+        %503 = OpBitcast %uint %501
+        %504 = OpIAdd %uint %502 %503
+        %505 = OpBitcast %int %504
+        %506 = OpCompositeExtract %half %mat3x2_f16 0 0
+        %507 = OpFunctionCall %int %tint_f16_to_i32 %506
+        %508 = OpBitcast %uint %505
+        %509 = OpBitcast %uint %507
+        %510 = OpIAdd %uint %508 %509
+        %511 = OpBitcast %int %510
+        %512 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %513 = OpFunctionCall %int %tint_f16_to_i32 %512
+        %514 = OpBitcast %uint %511
+        %515 = OpBitcast %uint %513
+        %516 = OpIAdd %uint %514 %515
+        %517 = OpBitcast %int %516
+        %518 = OpCompositeExtract %half %mat3x4_f16 0 0
+        %519 = OpFunctionCall %int %tint_f16_to_i32 %518
+        %520 = OpBitcast %uint %517
+        %521 = OpBitcast %uint %519
+        %522 = OpIAdd %uint %520 %521
+        %523 = OpBitcast %int %522
+        %524 = OpCompositeExtract %half %mat4x2_f16 0 0
+        %525 = OpFunctionCall %int %tint_f16_to_i32 %524
+        %526 = OpBitcast %uint %523
+        %527 = OpBitcast %uint %525
+        %528 = OpIAdd %uint %526 %527
+        %529 = OpBitcast %int %528
+        %530 = OpCompositeExtract %half %mat4x3_f16 0 0
+        %531 = OpFunctionCall %int %tint_f16_to_i32 %530
+        %532 = OpBitcast %uint %529
+        %533 = OpBitcast %uint %531
+        %534 = OpIAdd %uint %532 %533
+        %535 = OpBitcast %int %534
+        %536 = OpCompositeExtract %half %mat4x4_f16 0 0
+        %537 = OpFunctionCall %int %tint_f16_to_i32 %536
+        %538 = OpBitcast %uint %535
+        %539 = OpBitcast %uint %537
+        %540 = OpIAdd %uint %538 %539
+        %541 = OpBitcast %int %540
+        %542 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
+        %543 = OpFunctionCall %int %tint_f16_to_i32 %542
+        %544 = OpBitcast %uint %541
+        %545 = OpBitcast %uint %543
+        %546 = OpIAdd %uint %544 %545
+        %547 = OpBitcast %int %546
+        %548 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %549 = OpFunctionCall %int %tint_f32_to_i32 %548
+        %550 = OpBitcast %uint %547
+        %551 = OpBitcast %uint %549
+        %552 = OpIAdd %uint %550 %551
+        %553 = OpBitcast %int %552
+        %554 = OpAccessChain %_ptr_StorageBuffer_int_0 %43 %uint_0
+               OpStore %554 %553 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %452
+%tint_f32_to_i32 = OpFunction %int None %557
       %value = OpFunctionParameter %float
-        %453 = OpLabel
-        %454 = OpExtInst %float %60 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %457 = OpConvertFToS %int %454
-               OpReturnValue %457
+        %558 = OpLabel
+        %559 = OpExtInst %float %60 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %562 = OpConvertFToS %int %559
+               OpReturnValue %562
                OpFunctionEnd
-%tint_f16_to_i32 = OpFunction %int None %459
+%tint_f16_to_i32 = OpFunction %int None %564
     %value_0 = OpFunctionParameter %half
-        %460 = OpLabel
-        %461 = OpExtInst %half %60 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
-        %464 = OpConvertFToS %int %461
-               OpReturnValue %464
+        %565 = OpLabel
+        %566 = OpExtInst %half %60 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
+        %569 = OpConvertFToS %int %566
+               OpReturnValue %569
                OpFunctionEnd
-       %main = OpFunction %void None %466
-        %467 = OpLabel
-        %468 = OpLoad %uint %main_local_invocation_index_Input None
-        %469 = OpFunctionCall %void %main_inner %468
+       %main = OpFunction %void None %571
+        %572 = OpLabel
+        %573 = OpLoad %uint %main_local_invocation_index_Input None
+        %574 = OpFunctionCall %void %main_inner %573
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %471
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %576
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %472 = OpLabel
-        %473 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %475 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %477
-               OpStore %473 %tint_source
-               OpBranch %478
-        %478 = OpLabel
-               OpBranch %481
-        %481 = OpLabel
-        %483 = OpPhi %uint %uint_0 %478 %484 %480
-               OpLoopMerge %482 %480 None
-               OpBranch %479
-        %479 = OpLabel
-        %486 = OpUGreaterThanEqual %bool %483 %uint_2
-               OpSelectionMerge %488 None
-               OpBranchConditional %486 %489 %488
-        %489 = OpLabel
-               OpBranch %482
-        %488 = OpLabel
-        %490 = OpAccessChain %_ptr_Function_v3float %473 %483
-        %492 = OpLoad %v3float %490 None
-        %493 = OpAccessChain %_ptr_Function_v3float %475 %483
-               OpStore %493 %492 None
-               OpBranch %480
-        %480 = OpLabel
-        %484 = OpIAdd %uint %483 %uint_1
-               OpBranch %481
-        %482 = OpLabel
-        %485 = OpLoad %_arr_v3float_uint_2_0 %475 None
-               OpReturnValue %485
+        %577 = OpLabel
+        %578 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %580 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %582
+               OpStore %578 %tint_source
+               OpBranch %583
+        %583 = OpLabel
+               OpBranch %586
+        %586 = OpLabel
+        %588 = OpPhi %uint %uint_0 %583 %589 %585
+               OpLoopMerge %587 %585 None
+               OpBranch %584
+        %584 = OpLabel
+        %591 = OpUGreaterThanEqual %bool %588 %uint_2
+               OpSelectionMerge %593 None
+               OpBranchConditional %591 %594 %593
+        %594 = OpLabel
+               OpBranch %587
+        %593 = OpLabel
+        %595 = OpAccessChain %_ptr_Function_v3float %578 %588
+        %597 = OpLoad %v3float %595 None
+        %598 = OpAccessChain %_ptr_Function_v3float %580 %588
+               OpStore %598 %597 None
+               OpBranch %585
+        %585 = OpLabel
+        %589 = OpIAdd %uint %588 %uint_1
+               OpBranch %586
+        %587 = OpLabel
+        %590 = OpLoad %_arr_v3float_uint_2_0 %580 None
+               OpReturnValue %590
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4v2half_uint_2_0 None %495
+%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4v2half_uint_2_0 None %600
 %tint_source_0 = OpFunctionParameter %_arr_mat4v2half_uint_2
-        %496 = OpLabel
-        %497 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2 Function
-        %499 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2_0 Function %501
-               OpStore %497 %tint_source_0
-               OpBranch %502
-        %502 = OpLabel
-               OpBranch %505
-        %505 = OpLabel
-        %507 = OpPhi %uint %uint_0 %502 %508 %504
-               OpLoopMerge %506 %504 None
-               OpBranch %503
-        %503 = OpLabel
-        %510 = OpUGreaterThanEqual %bool %507 %uint_2
-               OpSelectionMerge %511 None
-               OpBranchConditional %510 %512 %511
-        %512 = OpLabel
-               OpBranch %506
-        %511 = OpLabel
-        %513 = OpAccessChain %_ptr_Function_mat4v2half %497 %507
-        %515 = OpLoad %mat4v2half %513 None
-        %516 = OpAccessChain %_ptr_Function_mat4v2half %499 %507
-               OpStore %516 %515 None
-               OpBranch %504
-        %504 = OpLabel
-        %508 = OpIAdd %uint %507 %uint_1
-               OpBranch %505
-        %506 = OpLabel
-        %509 = OpLoad %_arr_mat4v2half_uint_2_0 %499 None
-               OpReturnValue %509
+        %601 = OpLabel
+        %602 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2 Function
+        %604 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2_0 Function %606
+               OpStore %602 %tint_source_0
+               OpBranch %607
+        %607 = OpLabel
+               OpBranch %610
+        %610 = OpLabel
+        %612 = OpPhi %uint %uint_0 %607 %613 %609
+               OpLoopMerge %611 %609 None
+               OpBranch %608
+        %608 = OpLabel
+        %615 = OpUGreaterThanEqual %bool %612 %uint_2
+               OpSelectionMerge %616 None
+               OpBranchConditional %615 %617 %616
+        %617 = OpLabel
+               OpBranch %611
+        %616 = OpLabel
+        %618 = OpAccessChain %_ptr_Function_mat4v2half %602 %612
+        %620 = OpLoad %mat4v2half %618 None
+        %621 = OpAccessChain %_ptr_Function_mat4v2half %604 %612
+               OpStore %621 %620 None
+               OpBranch %609
+        %609 = OpLabel
+        %613 = OpIAdd %uint %612 %uint_1
+               OpBranch %610
+        %611 = OpLabel
+        %614 = OpLoad %_arr_mat4v2half_uint_2_0 %604 None
+               OpReturnValue %614
                OpFunctionEnd
diff --git a/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl b/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl
index ec2ec82..c36b600 100644
--- a/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl
@@ -80,22 +80,62 @@
   vec3 arr2_vec3_f32[2] = v.inner.arr2_vec3_f32;
   Inner struct_inner = v.inner.struct_inner;
   Inner array_struct_inner[4] = v.inner.array_struct_inner;
-  int v_2 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_3 = (v_2 + int(scalar_u32));
-  int v_4 = ((v_3 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_5 = (v_4 + int(vec2_u32.x));
-  int v_6 = ((v_5 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_7 = (v_6 + int(vec3_u32.y));
-  int v_8 = ((v_7 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_9 = (v_8 + int(vec4_u32.z));
-  int v_10 = (v_9 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_11 = (v_10 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_12 = (v_11 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_13 = (v_12 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_14 = (v_13 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_15 = (v_14 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_16 = (v_15 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_17 = (v_16 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_18 = (v_17 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  v_1.inner = (((v_18 + tint_f32_to_i32(arr2_vec3_f32[0u].x)) + struct_inner.scalar_i32) + array_struct_inner[0u].scalar_i32);
+  uint v_2 = uint(tint_f32_to_i32(scalar_f32));
+  int v_3 = int((v_2 + uint(scalar_i32)));
+  int v_4 = int(scalar_u32);
+  uint v_5 = uint(v_3);
+  int v_6 = int((v_5 + uint(v_4)));
+  int v_7 = tint_f32_to_i32(vec2_f32.x);
+  uint v_8 = uint(v_6);
+  uint v_9 = uint(int((v_8 + uint(v_7))));
+  int v_10 = int((v_9 + uint(vec2_i32.x)));
+  int v_11 = int(vec2_u32.x);
+  uint v_12 = uint(v_10);
+  int v_13 = int((v_12 + uint(v_11)));
+  int v_14 = tint_f32_to_i32(vec3_f32.y);
+  uint v_15 = uint(v_13);
+  uint v_16 = uint(int((v_15 + uint(v_14))));
+  int v_17 = int((v_16 + uint(vec3_i32.y)));
+  int v_18 = int(vec3_u32.y);
+  uint v_19 = uint(v_17);
+  int v_20 = int((v_19 + uint(v_18)));
+  int v_21 = tint_f32_to_i32(vec4_f32.z);
+  uint v_22 = uint(v_20);
+  uint v_23 = uint(int((v_22 + uint(v_21))));
+  int v_24 = int((v_23 + uint(vec4_i32.z)));
+  int v_25 = int(vec4_u32.z);
+  uint v_26 = uint(v_24);
+  int v_27 = int((v_26 + uint(v_25)));
+  int v_28 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_29 = uint(v_27);
+  int v_30 = int((v_29 + uint(v_28)));
+  int v_31 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_32 = uint(v_30);
+  int v_33 = int((v_32 + uint(v_31)));
+  int v_34 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_35 = uint(v_33);
+  int v_36 = int((v_35 + uint(v_34)));
+  int v_37 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_38 = uint(v_36);
+  int v_39 = int((v_38 + uint(v_37)));
+  int v_40 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_41 = uint(v_39);
+  int v_42 = int((v_41 + uint(v_40)));
+  int v_43 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_44 = uint(v_42);
+  int v_45 = int((v_44 + uint(v_43)));
+  int v_46 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_47 = uint(v_45);
+  int v_48 = int((v_47 + uint(v_46)));
+  int v_49 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_50 = uint(v_48);
+  int v_51 = int((v_50 + uint(v_49)));
+  int v_52 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_53 = uint(v_51);
+  int v_54 = int((v_53 + uint(v_52)));
+  int v_55 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_56 = uint(v_54);
+  uint v_57 = uint(int((v_56 + uint(v_55))));
+  uint v_58 = uint(int((v_57 + uint(struct_inner.scalar_i32))));
+  v_1.inner = int((v_58 + uint(array_struct_inner[0u].scalar_i32)));
 }
diff --git a/test/tint/buffer/storage/static_index/read.wgsl.expected.spvasm b/test/tint/buffer/storage/static_index/read.wgsl.expected.spvasm
index d34c40e..d89004f 100644
--- a/test/tint/buffer/storage/static_index/read.wgsl.expected.spvasm
+++ b/test/tint/buffer/storage/static_index/read.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 258
+; Bound: 327
 ; Schema: 0
                OpCapability Shader
-        %207 = OpExtInstImport "GLSL.std.450"
+        %276 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
@@ -211,19 +211,19 @@
     %uint_23 = OpConstant %uint 23
 %_arr_Inner_uint_4_0 = OpTypeArray %Inner %uint_4
 %_ptr_StorageBuffer_int_0 = OpTypePointer StorageBuffer %int
-        %204 = OpTypeFunction %int %float
+        %273 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %212 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %281 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %218 = OpConstantNull %_arr_v3float_uint_2_0
+        %287 = OpConstantNull %_arr_v3float_uint_2_0
        %bool = OpTypeBool
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-        %236 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
+        %305 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4_0 = OpTypePointer Function %_arr_Inner_uint_4_0
-        %242 = OpConstantNull %_arr_Inner_uint_4_0
+        %311 = OpConstantNull %_arr_Inner_uint_4_0
 %_ptr_Function_Inner = OpTypePointer Function %Inner
        %main = OpFunction %void None %36
          %37 = OpLabel
@@ -278,139 +278,208 @@
         %134 = OpLoad %_arr_Inner_uint_4 %131 None
 %array_struct_inner = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout_0 %134
         %138 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %140 = OpIAdd %int %138 %scalar_i32
-        %141 = OpBitcast %int %scalar_u32
-        %142 = OpIAdd %int %140 %141
-        %143 = OpCompositeExtract %float %vec2_f32 0
-        %144 = OpFunctionCall %int %tint_f32_to_i32 %143
-        %145 = OpIAdd %int %142 %144
-        %146 = OpCompositeExtract %int %vec2_i32 0
-        %147 = OpIAdd %int %145 %146
-        %148 = OpCompositeExtract %uint %vec2_u32 0
-        %149 = OpBitcast %int %148
-        %150 = OpIAdd %int %147 %149
-        %151 = OpCompositeExtract %float %vec3_f32 1
-        %152 = OpFunctionCall %int %tint_f32_to_i32 %151
-        %153 = OpIAdd %int %150 %152
-        %154 = OpCompositeExtract %int %vec3_i32 1
-        %155 = OpIAdd %int %153 %154
-        %156 = OpCompositeExtract %uint %vec3_u32 1
-        %157 = OpBitcast %int %156
-        %158 = OpIAdd %int %155 %157
-        %159 = OpCompositeExtract %float %vec4_f32 2
-        %160 = OpFunctionCall %int %tint_f32_to_i32 %159
-        %161 = OpIAdd %int %158 %160
-        %162 = OpCompositeExtract %int %vec4_i32 2
-        %163 = OpIAdd %int %161 %162
-        %164 = OpCompositeExtract %uint %vec4_u32 2
+        %140 = OpBitcast %uint %138
+        %141 = OpBitcast %uint %scalar_i32
+        %142 = OpIAdd %uint %140 %141
+        %143 = OpBitcast %int %142
+        %144 = OpBitcast %int %scalar_u32
+        %145 = OpBitcast %uint %143
+        %146 = OpBitcast %uint %144
+        %147 = OpIAdd %uint %145 %146
+        %148 = OpBitcast %int %147
+        %149 = OpCompositeExtract %float %vec2_f32 0
+        %150 = OpFunctionCall %int %tint_f32_to_i32 %149
+        %151 = OpBitcast %uint %148
+        %152 = OpBitcast %uint %150
+        %153 = OpIAdd %uint %151 %152
+        %154 = OpBitcast %int %153
+        %155 = OpCompositeExtract %int %vec2_i32 0
+        %156 = OpBitcast %uint %154
+        %157 = OpBitcast %uint %155
+        %158 = OpIAdd %uint %156 %157
+        %159 = OpBitcast %int %158
+        %160 = OpCompositeExtract %uint %vec2_u32 0
+        %161 = OpBitcast %int %160
+        %162 = OpBitcast %uint %159
+        %163 = OpBitcast %uint %161
+        %164 = OpIAdd %uint %162 %163
         %165 = OpBitcast %int %164
-        %166 = OpIAdd %int %163 %165
-        %167 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %168 = OpFunctionCall %int %tint_f32_to_i32 %167
-        %169 = OpIAdd %int %166 %168
-        %170 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %171 = OpFunctionCall %int %tint_f32_to_i32 %170
-        %172 = OpIAdd %int %169 %171
-        %173 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %174 = OpFunctionCall %int %tint_f32_to_i32 %173
-        %175 = OpIAdd %int %172 %174
-        %176 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %177 = OpFunctionCall %int %tint_f32_to_i32 %176
-        %178 = OpIAdd %int %175 %177
-        %179 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %180 = OpFunctionCall %int %tint_f32_to_i32 %179
-        %181 = OpIAdd %int %178 %180
-        %182 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %183 = OpFunctionCall %int %tint_f32_to_i32 %182
-        %184 = OpIAdd %int %181 %183
-        %185 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %186 = OpFunctionCall %int %tint_f32_to_i32 %185
-        %187 = OpIAdd %int %184 %186
-        %188 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %189 = OpFunctionCall %int %tint_f32_to_i32 %188
-        %190 = OpIAdd %int %187 %189
-        %191 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %192 = OpFunctionCall %int %tint_f32_to_i32 %191
-        %193 = OpIAdd %int %190 %192
-        %194 = OpCompositeExtract %float %arr2_vec3_f32 0 0
-        %195 = OpFunctionCall %int %tint_f32_to_i32 %194
-        %196 = OpIAdd %int %193 %195
-        %197 = OpCompositeExtract %int %struct_inner 0
-        %198 = OpIAdd %int %196 %197
-        %199 = OpCompositeExtract %int %array_struct_inner 0 0
-        %200 = OpIAdd %int %198 %199
-        %201 = OpAccessChain %_ptr_StorageBuffer_int_0 %31 %uint_0
-               OpStore %201 %200 None
+        %166 = OpCompositeExtract %float %vec3_f32 1
+        %167 = OpFunctionCall %int %tint_f32_to_i32 %166
+        %168 = OpBitcast %uint %165
+        %169 = OpBitcast %uint %167
+        %170 = OpIAdd %uint %168 %169
+        %171 = OpBitcast %int %170
+        %172 = OpCompositeExtract %int %vec3_i32 1
+        %173 = OpBitcast %uint %171
+        %174 = OpBitcast %uint %172
+        %175 = OpIAdd %uint %173 %174
+        %176 = OpBitcast %int %175
+        %177 = OpCompositeExtract %uint %vec3_u32 1
+        %178 = OpBitcast %int %177
+        %179 = OpBitcast %uint %176
+        %180 = OpBitcast %uint %178
+        %181 = OpIAdd %uint %179 %180
+        %182 = OpBitcast %int %181
+        %183 = OpCompositeExtract %float %vec4_f32 2
+        %184 = OpFunctionCall %int %tint_f32_to_i32 %183
+        %185 = OpBitcast %uint %182
+        %186 = OpBitcast %uint %184
+        %187 = OpIAdd %uint %185 %186
+        %188 = OpBitcast %int %187
+        %189 = OpCompositeExtract %int %vec4_i32 2
+        %190 = OpBitcast %uint %188
+        %191 = OpBitcast %uint %189
+        %192 = OpIAdd %uint %190 %191
+        %193 = OpBitcast %int %192
+        %194 = OpCompositeExtract %uint %vec4_u32 2
+        %195 = OpBitcast %int %194
+        %196 = OpBitcast %uint %193
+        %197 = OpBitcast %uint %195
+        %198 = OpIAdd %uint %196 %197
+        %199 = OpBitcast %int %198
+        %200 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %201 = OpFunctionCall %int %tint_f32_to_i32 %200
+        %202 = OpBitcast %uint %199
+        %203 = OpBitcast %uint %201
+        %204 = OpIAdd %uint %202 %203
+        %205 = OpBitcast %int %204
+        %206 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %207 = OpFunctionCall %int %tint_f32_to_i32 %206
+        %208 = OpBitcast %uint %205
+        %209 = OpBitcast %uint %207
+        %210 = OpIAdd %uint %208 %209
+        %211 = OpBitcast %int %210
+        %212 = OpCompositeExtract %float %mat2x4_f32 0 0
+        %213 = OpFunctionCall %int %tint_f32_to_i32 %212
+        %214 = OpBitcast %uint %211
+        %215 = OpBitcast %uint %213
+        %216 = OpIAdd %uint %214 %215
+        %217 = OpBitcast %int %216
+        %218 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %219 = OpFunctionCall %int %tint_f32_to_i32 %218
+        %220 = OpBitcast %uint %217
+        %221 = OpBitcast %uint %219
+        %222 = OpIAdd %uint %220 %221
+        %223 = OpBitcast %int %222
+        %224 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %225 = OpFunctionCall %int %tint_f32_to_i32 %224
+        %226 = OpBitcast %uint %223
+        %227 = OpBitcast %uint %225
+        %228 = OpIAdd %uint %226 %227
+        %229 = OpBitcast %int %228
+        %230 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %231 = OpFunctionCall %int %tint_f32_to_i32 %230
+        %232 = OpBitcast %uint %229
+        %233 = OpBitcast %uint %231
+        %234 = OpIAdd %uint %232 %233
+        %235 = OpBitcast %int %234
+        %236 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %237 = OpFunctionCall %int %tint_f32_to_i32 %236
+        %238 = OpBitcast %uint %235
+        %239 = OpBitcast %uint %237
+        %240 = OpIAdd %uint %238 %239
+        %241 = OpBitcast %int %240
+        %242 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %243 = OpFunctionCall %int %tint_f32_to_i32 %242
+        %244 = OpBitcast %uint %241
+        %245 = OpBitcast %uint %243
+        %246 = OpIAdd %uint %244 %245
+        %247 = OpBitcast %int %246
+        %248 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %249 = OpFunctionCall %int %tint_f32_to_i32 %248
+        %250 = OpBitcast %uint %247
+        %251 = OpBitcast %uint %249
+        %252 = OpIAdd %uint %250 %251
+        %253 = OpBitcast %int %252
+        %254 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %255 = OpFunctionCall %int %tint_f32_to_i32 %254
+        %256 = OpBitcast %uint %253
+        %257 = OpBitcast %uint %255
+        %258 = OpIAdd %uint %256 %257
+        %259 = OpBitcast %int %258
+        %260 = OpCompositeExtract %int %struct_inner 0
+        %261 = OpBitcast %uint %259
+        %262 = OpBitcast %uint %260
+        %263 = OpIAdd %uint %261 %262
+        %264 = OpBitcast %int %263
+        %265 = OpCompositeExtract %int %array_struct_inner 0 0
+        %266 = OpBitcast %uint %264
+        %267 = OpBitcast %uint %265
+        %268 = OpIAdd %uint %266 %267
+        %269 = OpBitcast %int %268
+        %270 = OpAccessChain %_ptr_StorageBuffer_int_0 %31 %uint_0
+               OpStore %270 %269 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %204
+%tint_f32_to_i32 = OpFunction %int None %273
       %value = OpFunctionParameter %float
-        %205 = OpLabel
-        %206 = OpExtInst %float %207 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %210 = OpConvertFToS %int %206
-               OpReturnValue %210
+        %274 = OpLabel
+        %275 = OpExtInst %float %276 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %279 = OpConvertFToS %int %275
+               OpReturnValue %279
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %212
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %281
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %213 = OpLabel
-        %214 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %216 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %218
-               OpStore %214 %tint_source
-               OpBranch %219
-        %219 = OpLabel
-               OpBranch %222
-        %222 = OpLabel
-        %224 = OpPhi %uint %uint_0 %219 %225 %221
-               OpLoopMerge %223 %221 None
-               OpBranch %220
-        %220 = OpLabel
-        %227 = OpUGreaterThanEqual %bool %224 %uint_2
-               OpSelectionMerge %229 None
-               OpBranchConditional %227 %230 %229
-        %230 = OpLabel
-               OpBranch %223
-        %229 = OpLabel
-        %231 = OpAccessChain %_ptr_Function_v3float %214 %224
-        %233 = OpLoad %v3float %231 None
-        %234 = OpAccessChain %_ptr_Function_v3float %216 %224
-               OpStore %234 %233 None
-               OpBranch %221
-        %221 = OpLabel
-        %225 = OpIAdd %uint %224 %uint_1
-               OpBranch %222
-        %223 = OpLabel
-        %226 = OpLoad %_arr_v3float_uint_2_0 %216 None
-               OpReturnValue %226
+        %282 = OpLabel
+        %283 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %285 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %287
+               OpStore %283 %tint_source
+               OpBranch %288
+        %288 = OpLabel
+               OpBranch %291
+        %291 = OpLabel
+        %293 = OpPhi %uint %uint_0 %288 %294 %290
+               OpLoopMerge %292 %290 None
+               OpBranch %289
+        %289 = OpLabel
+        %296 = OpUGreaterThanEqual %bool %293 %uint_2
+               OpSelectionMerge %298 None
+               OpBranchConditional %296 %299 %298
+        %299 = OpLabel
+               OpBranch %292
+        %298 = OpLabel
+        %300 = OpAccessChain %_ptr_Function_v3float %283 %293
+        %302 = OpLoad %v3float %300 None
+        %303 = OpAccessChain %_ptr_Function_v3float %285 %293
+               OpStore %303 %302 None
+               OpBranch %290
+        %290 = OpLabel
+        %294 = OpIAdd %uint %293 %uint_1
+               OpBranch %291
+        %292 = OpLabel
+        %295 = OpLoad %_arr_v3float_uint_2_0 %285 None
+               OpReturnValue %295
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %_arr_Inner_uint_4_0 None %236
+%tint_convert_explicit_layout_0 = OpFunction %_arr_Inner_uint_4_0 None %305
 %tint_source_0 = OpFunctionParameter %_arr_Inner_uint_4
-        %237 = OpLabel
-        %238 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
-        %240 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %242
-               OpStore %238 %tint_source_0
-               OpBranch %243
-        %243 = OpLabel
-               OpBranch %246
-        %246 = OpLabel
-        %248 = OpPhi %uint %uint_0 %243 %249 %245
-               OpLoopMerge %247 %245 None
-               OpBranch %244
-        %244 = OpLabel
-        %251 = OpUGreaterThanEqual %bool %248 %uint_4
-               OpSelectionMerge %252 None
-               OpBranchConditional %251 %253 %252
-        %253 = OpLabel
-               OpBranch %247
-        %252 = OpLabel
-        %254 = OpAccessChain %_ptr_Function_Inner %238 %248
-        %256 = OpLoad %Inner %254 None
-        %257 = OpAccessChain %_ptr_Function_Inner %240 %248
-               OpStore %257 %256 None
-               OpBranch %245
-        %245 = OpLabel
-        %249 = OpIAdd %uint %248 %uint_1
-               OpBranch %246
-        %247 = OpLabel
-        %250 = OpLoad %_arr_Inner_uint_4_0 %240 None
-               OpReturnValue %250
+        %306 = OpLabel
+        %307 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
+        %309 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %311
+               OpStore %307 %tint_source_0
+               OpBranch %312
+        %312 = OpLabel
+               OpBranch %315
+        %315 = OpLabel
+        %317 = OpPhi %uint %uint_0 %312 %318 %314
+               OpLoopMerge %316 %314 None
+               OpBranch %313
+        %313 = OpLabel
+        %320 = OpUGreaterThanEqual %bool %317 %uint_4
+               OpSelectionMerge %321 None
+               OpBranchConditional %320 %322 %321
+        %322 = OpLabel
+               OpBranch %316
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Function_Inner %307 %317
+        %325 = OpLoad %Inner %323 None
+        %326 = OpAccessChain %_ptr_Function_Inner %309 %317
+               OpStore %326 %325 None
+               OpBranch %314
+        %314 = OpLabel
+        %318 = OpIAdd %uint %317 %uint_1
+               OpBranch %315
+        %316 = OpLabel
+        %319 = OpLoad %_arr_Inner_uint_4_0 %309 None
+               OpReturnValue %319
                OpFunctionEnd
diff --git a/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl b/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl
index b2afae2..9485cd2 100644
--- a/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl
@@ -117,36 +117,104 @@
   f16mat4x2 arr2_mat4x2_f16[2] = v.inner.arr2_mat4x2_f16;
   Inner struct_inner = v.inner.struct_inner;
   Inner array_struct_inner[4] = v.inner.array_struct_inner;
-  int v_2 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_3 = (v_2 + int(scalar_u32));
-  int v_4 = (v_3 + tint_f16_to_i32(scalar_f16));
-  int v_5 = ((v_4 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_6 = (v_5 + int(vec2_u32.x));
-  int v_7 = (v_6 + tint_f16_to_i32(vec2_f16.x));
-  int v_8 = ((v_7 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_9 = (v_8 + int(vec3_u32.y));
-  int v_10 = (v_9 + tint_f16_to_i32(vec3_f16.y));
-  int v_11 = ((v_10 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_12 = (v_11 + int(vec4_u32.z));
-  int v_13 = (v_12 + tint_f16_to_i32(vec4_f16.z));
-  int v_14 = (v_13 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_15 = (v_14 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_16 = (v_15 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_17 = (v_16 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_18 = (v_17 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_19 = (v_18 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_20 = (v_19 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_21 = (v_20 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_22 = (v_21 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  int v_23 = (v_22 + tint_f16_to_i32(mat2x2_f16[0u].x));
-  int v_24 = (v_23 + tint_f16_to_i32(mat2x3_f16[0u].x));
-  int v_25 = (v_24 + tint_f16_to_i32(mat2x4_f16[0u].x));
-  int v_26 = (v_25 + tint_f16_to_i32(mat3x2_f16[0u].x));
-  int v_27 = (v_26 + tint_f16_to_i32(mat3x3_f16[0u].x));
-  int v_28 = (v_27 + tint_f16_to_i32(mat3x4_f16[0u].x));
-  int v_29 = (v_28 + tint_f16_to_i32(mat4x2_f16[0u].x));
-  int v_30 = (v_29 + tint_f16_to_i32(mat4x3_f16[0u].x));
-  int v_31 = (v_30 + tint_f16_to_i32(mat4x4_f16[0u].x));
-  int v_32 = (v_31 + tint_f32_to_i32(arr2_vec3_f32[0u].x));
-  v_1.inner = (((v_32 + tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x)) + struct_inner.scalar_i32) + array_struct_inner[0u].scalar_i32);
+  uint v_2 = uint(tint_f32_to_i32(scalar_f32));
+  int v_3 = int((v_2 + uint(scalar_i32)));
+  int v_4 = int(scalar_u32);
+  uint v_5 = uint(v_3);
+  int v_6 = int((v_5 + uint(v_4)));
+  int v_7 = tint_f16_to_i32(scalar_f16);
+  uint v_8 = uint(v_6);
+  int v_9 = int((v_8 + uint(v_7)));
+  int v_10 = tint_f32_to_i32(vec2_f32.x);
+  uint v_11 = uint(v_9);
+  uint v_12 = uint(int((v_11 + uint(v_10))));
+  int v_13 = int((v_12 + uint(vec2_i32.x)));
+  int v_14 = int(vec2_u32.x);
+  uint v_15 = uint(v_13);
+  int v_16 = int((v_15 + uint(v_14)));
+  int v_17 = tint_f16_to_i32(vec2_f16.x);
+  uint v_18 = uint(v_16);
+  int v_19 = int((v_18 + uint(v_17)));
+  int v_20 = tint_f32_to_i32(vec3_f32.y);
+  uint v_21 = uint(v_19);
+  uint v_22 = uint(int((v_21 + uint(v_20))));
+  int v_23 = int((v_22 + uint(vec3_i32.y)));
+  int v_24 = int(vec3_u32.y);
+  uint v_25 = uint(v_23);
+  int v_26 = int((v_25 + uint(v_24)));
+  int v_27 = tint_f16_to_i32(vec3_f16.y);
+  uint v_28 = uint(v_26);
+  int v_29 = int((v_28 + uint(v_27)));
+  int v_30 = tint_f32_to_i32(vec4_f32.z);
+  uint v_31 = uint(v_29);
+  uint v_32 = uint(int((v_31 + uint(v_30))));
+  int v_33 = int((v_32 + uint(vec4_i32.z)));
+  int v_34 = int(vec4_u32.z);
+  uint v_35 = uint(v_33);
+  int v_36 = int((v_35 + uint(v_34)));
+  int v_37 = tint_f16_to_i32(vec4_f16.z);
+  uint v_38 = uint(v_36);
+  int v_39 = int((v_38 + uint(v_37)));
+  int v_40 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_41 = uint(v_39);
+  int v_42 = int((v_41 + uint(v_40)));
+  int v_43 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_44 = uint(v_42);
+  int v_45 = int((v_44 + uint(v_43)));
+  int v_46 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_47 = uint(v_45);
+  int v_48 = int((v_47 + uint(v_46)));
+  int v_49 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_50 = uint(v_48);
+  int v_51 = int((v_50 + uint(v_49)));
+  int v_52 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_53 = uint(v_51);
+  int v_54 = int((v_53 + uint(v_52)));
+  int v_55 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_56 = uint(v_54);
+  int v_57 = int((v_56 + uint(v_55)));
+  int v_58 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_59 = uint(v_57);
+  int v_60 = int((v_59 + uint(v_58)));
+  int v_61 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_62 = uint(v_60);
+  int v_63 = int((v_62 + uint(v_61)));
+  int v_64 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_65 = uint(v_63);
+  int v_66 = int((v_65 + uint(v_64)));
+  int v_67 = tint_f16_to_i32(mat2x2_f16[0u].x);
+  uint v_68 = uint(v_66);
+  int v_69 = int((v_68 + uint(v_67)));
+  int v_70 = tint_f16_to_i32(mat2x3_f16[0u].x);
+  uint v_71 = uint(v_69);
+  int v_72 = int((v_71 + uint(v_70)));
+  int v_73 = tint_f16_to_i32(mat2x4_f16[0u].x);
+  uint v_74 = uint(v_72);
+  int v_75 = int((v_74 + uint(v_73)));
+  int v_76 = tint_f16_to_i32(mat3x2_f16[0u].x);
+  uint v_77 = uint(v_75);
+  int v_78 = int((v_77 + uint(v_76)));
+  int v_79 = tint_f16_to_i32(mat3x3_f16[0u].x);
+  uint v_80 = uint(v_78);
+  int v_81 = int((v_80 + uint(v_79)));
+  int v_82 = tint_f16_to_i32(mat3x4_f16[0u].x);
+  uint v_83 = uint(v_81);
+  int v_84 = int((v_83 + uint(v_82)));
+  int v_85 = tint_f16_to_i32(mat4x2_f16[0u].x);
+  uint v_86 = uint(v_84);
+  int v_87 = int((v_86 + uint(v_85)));
+  int v_88 = tint_f16_to_i32(mat4x3_f16[0u].x);
+  uint v_89 = uint(v_87);
+  int v_90 = int((v_89 + uint(v_88)));
+  int v_91 = tint_f16_to_i32(mat4x4_f16[0u].x);
+  uint v_92 = uint(v_90);
+  int v_93 = int((v_92 + uint(v_91)));
+  int v_94 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_95 = uint(v_93);
+  int v_96 = int((v_95 + uint(v_94)));
+  int v_97 = tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x);
+  uint v_98 = uint(v_96);
+  uint v_99 = uint(int((v_98 + uint(v_97))));
+  uint v_100 = uint(int((v_99 + uint(struct_inner.scalar_i32))));
+  v_1.inner = int((v_100 + uint(array_struct_inner[0u].scalar_i32)));
 }
diff --git a/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.spvasm b/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.spvasm
index c413419..329ac8c 100644
--- a/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.spvasm
+++ b/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 403
+; Bound: 514
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-        %322 = OpExtInstImport "GLSL.std.450"
+        %433 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
@@ -326,27 +326,27 @@
     %uint_37 = OpConstant %uint 37
 %_arr_Inner_uint_4_0 = OpTypeArray %Inner %uint_4
 %_ptr_StorageBuffer_int_0 = OpTypePointer StorageBuffer %int
-        %319 = OpTypeFunction %int %float
+        %430 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %327 = OpTypeFunction %int %half
+        %438 = OpTypeFunction %int %half
 %half_n0x1_ffcp_15 = OpConstant %half -0x1.ffcp+15
 %half_0x1_ffcp_15 = OpConstant %half 0x1.ffcp+15
-        %334 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %445 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %340 = OpConstantNull %_arr_v3float_uint_2_0
+        %451 = OpConstantNull %_arr_v3float_uint_2_0
        %bool = OpTypeBool
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-        %358 = OpTypeFunction %_arr_mat4v2half_uint_2_0 %_arr_mat4v2half_uint_2
+        %469 = OpTypeFunction %_arr_mat4v2half_uint_2_0 %_arr_mat4v2half_uint_2
 %_ptr_Function__arr_mat4v2half_uint_2 = OpTypePointer Function %_arr_mat4v2half_uint_2
 %_ptr_Function__arr_mat4v2half_uint_2_0 = OpTypePointer Function %_arr_mat4v2half_uint_2_0
-        %364 = OpConstantNull %_arr_mat4v2half_uint_2_0
+        %475 = OpConstantNull %_arr_mat4v2half_uint_2_0
 %_ptr_Function_mat4v2half = OpTypePointer Function %mat4v2half
-        %381 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
+        %492 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4_0 = OpTypePointer Function %_arr_Inner_uint_4_0
-        %387 = OpConstantNull %_arr_Inner_uint_4_0
+        %498 = OpConstantNull %_arr_Inner_uint_4_0
 %_ptr_Function_Inner = OpTypePointer Function %Inner
        %main = OpFunction %void None %50
          %51 = OpLabel
@@ -430,219 +430,330 @@
         %207 = OpLoad %_arr_Inner_uint_4 %204 None
 %array_struct_inner = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout_1 %207
         %211 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %213 = OpIAdd %int %211 %scalar_i32
-        %214 = OpBitcast %int %scalar_u32
-        %215 = OpIAdd %int %213 %214
-        %216 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
-        %218 = OpIAdd %int %215 %216
-        %219 = OpCompositeExtract %float %vec2_f32 0
-        %220 = OpFunctionCall %int %tint_f32_to_i32 %219
-        %221 = OpIAdd %int %218 %220
-        %222 = OpCompositeExtract %int %vec2_i32 0
-        %223 = OpIAdd %int %221 %222
-        %224 = OpCompositeExtract %uint %vec2_u32 0
-        %225 = OpBitcast %int %224
-        %226 = OpIAdd %int %223 %225
-        %227 = OpCompositeExtract %half %vec2_f16 0
-        %228 = OpFunctionCall %int %tint_f16_to_i32 %227
-        %229 = OpIAdd %int %226 %228
-        %230 = OpCompositeExtract %float %vec3_f32 1
-        %231 = OpFunctionCall %int %tint_f32_to_i32 %230
-        %232 = OpIAdd %int %229 %231
-        %233 = OpCompositeExtract %int %vec3_i32 1
-        %234 = OpIAdd %int %232 %233
-        %235 = OpCompositeExtract %uint %vec3_u32 1
-        %236 = OpBitcast %int %235
-        %237 = OpIAdd %int %234 %236
-        %238 = OpCompositeExtract %half %vec3_f16 1
-        %239 = OpFunctionCall %int %tint_f16_to_i32 %238
-        %240 = OpIAdd %int %237 %239
-        %241 = OpCompositeExtract %float %vec4_f32 2
-        %242 = OpFunctionCall %int %tint_f32_to_i32 %241
-        %243 = OpIAdd %int %240 %242
-        %244 = OpCompositeExtract %int %vec4_i32 2
-        %245 = OpIAdd %int %243 %244
-        %246 = OpCompositeExtract %uint %vec4_u32 2
-        %247 = OpBitcast %int %246
-        %248 = OpIAdd %int %245 %247
-        %249 = OpCompositeExtract %half %vec4_f16 2
-        %250 = OpFunctionCall %int %tint_f16_to_i32 %249
-        %251 = OpIAdd %int %248 %250
-        %252 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %253 = OpFunctionCall %int %tint_f32_to_i32 %252
-        %254 = OpIAdd %int %251 %253
-        %255 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %256 = OpFunctionCall %int %tint_f32_to_i32 %255
-        %257 = OpIAdd %int %254 %256
-        %258 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %259 = OpFunctionCall %int %tint_f32_to_i32 %258
-        %260 = OpIAdd %int %257 %259
-        %261 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %262 = OpFunctionCall %int %tint_f32_to_i32 %261
-        %263 = OpIAdd %int %260 %262
-        %264 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %265 = OpFunctionCall %int %tint_f32_to_i32 %264
-        %266 = OpIAdd %int %263 %265
-        %267 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %268 = OpFunctionCall %int %tint_f32_to_i32 %267
-        %269 = OpIAdd %int %266 %268
-        %270 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %271 = OpFunctionCall %int %tint_f32_to_i32 %270
-        %272 = OpIAdd %int %269 %271
-        %273 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %274 = OpFunctionCall %int %tint_f32_to_i32 %273
-        %275 = OpIAdd %int %272 %274
-        %276 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %277 = OpFunctionCall %int %tint_f32_to_i32 %276
-        %278 = OpIAdd %int %275 %277
-        %279 = OpCompositeExtract %half %mat2x2_f16 0 0
-        %280 = OpFunctionCall %int %tint_f16_to_i32 %279
-        %281 = OpIAdd %int %278 %280
-        %282 = OpCompositeExtract %half %mat2x3_f16 0 0
-        %283 = OpFunctionCall %int %tint_f16_to_i32 %282
-        %284 = OpIAdd %int %281 %283
-        %285 = OpCompositeExtract %half %mat2x4_f16 0 0
-        %286 = OpFunctionCall %int %tint_f16_to_i32 %285
-        %287 = OpIAdd %int %284 %286
-        %288 = OpCompositeExtract %half %mat3x2_f16 0 0
-        %289 = OpFunctionCall %int %tint_f16_to_i32 %288
-        %290 = OpIAdd %int %287 %289
-        %291 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %213 = OpBitcast %uint %211
+        %214 = OpBitcast %uint %scalar_i32
+        %215 = OpIAdd %uint %213 %214
+        %216 = OpBitcast %int %215
+        %217 = OpBitcast %int %scalar_u32
+        %218 = OpBitcast %uint %216
+        %219 = OpBitcast %uint %217
+        %220 = OpIAdd %uint %218 %219
+        %221 = OpBitcast %int %220
+        %222 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
+        %224 = OpBitcast %uint %221
+        %225 = OpBitcast %uint %222
+        %226 = OpIAdd %uint %224 %225
+        %227 = OpBitcast %int %226
+        %228 = OpCompositeExtract %float %vec2_f32 0
+        %229 = OpFunctionCall %int %tint_f32_to_i32 %228
+        %230 = OpBitcast %uint %227
+        %231 = OpBitcast %uint %229
+        %232 = OpIAdd %uint %230 %231
+        %233 = OpBitcast %int %232
+        %234 = OpCompositeExtract %int %vec2_i32 0
+        %235 = OpBitcast %uint %233
+        %236 = OpBitcast %uint %234
+        %237 = OpIAdd %uint %235 %236
+        %238 = OpBitcast %int %237
+        %239 = OpCompositeExtract %uint %vec2_u32 0
+        %240 = OpBitcast %int %239
+        %241 = OpBitcast %uint %238
+        %242 = OpBitcast %uint %240
+        %243 = OpIAdd %uint %241 %242
+        %244 = OpBitcast %int %243
+        %245 = OpCompositeExtract %half %vec2_f16 0
+        %246 = OpFunctionCall %int %tint_f16_to_i32 %245
+        %247 = OpBitcast %uint %244
+        %248 = OpBitcast %uint %246
+        %249 = OpIAdd %uint %247 %248
+        %250 = OpBitcast %int %249
+        %251 = OpCompositeExtract %float %vec3_f32 1
+        %252 = OpFunctionCall %int %tint_f32_to_i32 %251
+        %253 = OpBitcast %uint %250
+        %254 = OpBitcast %uint %252
+        %255 = OpIAdd %uint %253 %254
+        %256 = OpBitcast %int %255
+        %257 = OpCompositeExtract %int %vec3_i32 1
+        %258 = OpBitcast %uint %256
+        %259 = OpBitcast %uint %257
+        %260 = OpIAdd %uint %258 %259
+        %261 = OpBitcast %int %260
+        %262 = OpCompositeExtract %uint %vec3_u32 1
+        %263 = OpBitcast %int %262
+        %264 = OpBitcast %uint %261
+        %265 = OpBitcast %uint %263
+        %266 = OpIAdd %uint %264 %265
+        %267 = OpBitcast %int %266
+        %268 = OpCompositeExtract %half %vec3_f16 1
+        %269 = OpFunctionCall %int %tint_f16_to_i32 %268
+        %270 = OpBitcast %uint %267
+        %271 = OpBitcast %uint %269
+        %272 = OpIAdd %uint %270 %271
+        %273 = OpBitcast %int %272
+        %274 = OpCompositeExtract %float %vec4_f32 2
+        %275 = OpFunctionCall %int %tint_f32_to_i32 %274
+        %276 = OpBitcast %uint %273
+        %277 = OpBitcast %uint %275
+        %278 = OpIAdd %uint %276 %277
+        %279 = OpBitcast %int %278
+        %280 = OpCompositeExtract %int %vec4_i32 2
+        %281 = OpBitcast %uint %279
+        %282 = OpBitcast %uint %280
+        %283 = OpIAdd %uint %281 %282
+        %284 = OpBitcast %int %283
+        %285 = OpCompositeExtract %uint %vec4_u32 2
+        %286 = OpBitcast %int %285
+        %287 = OpBitcast %uint %284
+        %288 = OpBitcast %uint %286
+        %289 = OpIAdd %uint %287 %288
+        %290 = OpBitcast %int %289
+        %291 = OpCompositeExtract %half %vec4_f16 2
         %292 = OpFunctionCall %int %tint_f16_to_i32 %291
-        %293 = OpIAdd %int %290 %292
-        %294 = OpCompositeExtract %half %mat3x4_f16 0 0
-        %295 = OpFunctionCall %int %tint_f16_to_i32 %294
-        %296 = OpIAdd %int %293 %295
-        %297 = OpCompositeExtract %half %mat4x2_f16 0 0
-        %298 = OpFunctionCall %int %tint_f16_to_i32 %297
-        %299 = OpIAdd %int %296 %298
-        %300 = OpCompositeExtract %half %mat4x3_f16 0 0
-        %301 = OpFunctionCall %int %tint_f16_to_i32 %300
-        %302 = OpIAdd %int %299 %301
-        %303 = OpCompositeExtract %half %mat4x4_f16 0 0
-        %304 = OpFunctionCall %int %tint_f16_to_i32 %303
-        %305 = OpIAdd %int %302 %304
-        %306 = OpCompositeExtract %float %arr2_vec3_f32 0 0
-        %307 = OpFunctionCall %int %tint_f32_to_i32 %306
-        %308 = OpIAdd %int %305 %307
-        %309 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
-        %310 = OpFunctionCall %int %tint_f16_to_i32 %309
-        %311 = OpIAdd %int %308 %310
-        %312 = OpCompositeExtract %int %struct_inner 0
-        %313 = OpIAdd %int %311 %312
-        %314 = OpCompositeExtract %int %array_struct_inner 0 0
-        %315 = OpIAdd %int %313 %314
-        %316 = OpAccessChain %_ptr_StorageBuffer_int_0 %45 %uint_0
-               OpStore %316 %315 None
+        %293 = OpBitcast %uint %290
+        %294 = OpBitcast %uint %292
+        %295 = OpIAdd %uint %293 %294
+        %296 = OpBitcast %int %295
+        %297 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %298 = OpFunctionCall %int %tint_f32_to_i32 %297
+        %299 = OpBitcast %uint %296
+        %300 = OpBitcast %uint %298
+        %301 = OpIAdd %uint %299 %300
+        %302 = OpBitcast %int %301
+        %303 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %304 = OpFunctionCall %int %tint_f32_to_i32 %303
+        %305 = OpBitcast %uint %302
+        %306 = OpBitcast %uint %304
+        %307 = OpIAdd %uint %305 %306
+        %308 = OpBitcast %int %307
+        %309 = OpCompositeExtract %float %mat2x4_f32 0 0
+        %310 = OpFunctionCall %int %tint_f32_to_i32 %309
+        %311 = OpBitcast %uint %308
+        %312 = OpBitcast %uint %310
+        %313 = OpIAdd %uint %311 %312
+        %314 = OpBitcast %int %313
+        %315 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %316 = OpFunctionCall %int %tint_f32_to_i32 %315
+        %317 = OpBitcast %uint %314
+        %318 = OpBitcast %uint %316
+        %319 = OpIAdd %uint %317 %318
+        %320 = OpBitcast %int %319
+        %321 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %322 = OpFunctionCall %int %tint_f32_to_i32 %321
+        %323 = OpBitcast %uint %320
+        %324 = OpBitcast %uint %322
+        %325 = OpIAdd %uint %323 %324
+        %326 = OpBitcast %int %325
+        %327 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %328 = OpFunctionCall %int %tint_f32_to_i32 %327
+        %329 = OpBitcast %uint %326
+        %330 = OpBitcast %uint %328
+        %331 = OpIAdd %uint %329 %330
+        %332 = OpBitcast %int %331
+        %333 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %334 = OpFunctionCall %int %tint_f32_to_i32 %333
+        %335 = OpBitcast %uint %332
+        %336 = OpBitcast %uint %334
+        %337 = OpIAdd %uint %335 %336
+        %338 = OpBitcast %int %337
+        %339 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %340 = OpFunctionCall %int %tint_f32_to_i32 %339
+        %341 = OpBitcast %uint %338
+        %342 = OpBitcast %uint %340
+        %343 = OpIAdd %uint %341 %342
+        %344 = OpBitcast %int %343
+        %345 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %346 = OpFunctionCall %int %tint_f32_to_i32 %345
+        %347 = OpBitcast %uint %344
+        %348 = OpBitcast %uint %346
+        %349 = OpIAdd %uint %347 %348
+        %350 = OpBitcast %int %349
+        %351 = OpCompositeExtract %half %mat2x2_f16 0 0
+        %352 = OpFunctionCall %int %tint_f16_to_i32 %351
+        %353 = OpBitcast %uint %350
+        %354 = OpBitcast %uint %352
+        %355 = OpIAdd %uint %353 %354
+        %356 = OpBitcast %int %355
+        %357 = OpCompositeExtract %half %mat2x3_f16 0 0
+        %358 = OpFunctionCall %int %tint_f16_to_i32 %357
+        %359 = OpBitcast %uint %356
+        %360 = OpBitcast %uint %358
+        %361 = OpIAdd %uint %359 %360
+        %362 = OpBitcast %int %361
+        %363 = OpCompositeExtract %half %mat2x4_f16 0 0
+        %364 = OpFunctionCall %int %tint_f16_to_i32 %363
+        %365 = OpBitcast %uint %362
+        %366 = OpBitcast %uint %364
+        %367 = OpIAdd %uint %365 %366
+        %368 = OpBitcast %int %367
+        %369 = OpCompositeExtract %half %mat3x2_f16 0 0
+        %370 = OpFunctionCall %int %tint_f16_to_i32 %369
+        %371 = OpBitcast %uint %368
+        %372 = OpBitcast %uint %370
+        %373 = OpIAdd %uint %371 %372
+        %374 = OpBitcast %int %373
+        %375 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %376 = OpFunctionCall %int %tint_f16_to_i32 %375
+        %377 = OpBitcast %uint %374
+        %378 = OpBitcast %uint %376
+        %379 = OpIAdd %uint %377 %378
+        %380 = OpBitcast %int %379
+        %381 = OpCompositeExtract %half %mat3x4_f16 0 0
+        %382 = OpFunctionCall %int %tint_f16_to_i32 %381
+        %383 = OpBitcast %uint %380
+        %384 = OpBitcast %uint %382
+        %385 = OpIAdd %uint %383 %384
+        %386 = OpBitcast %int %385
+        %387 = OpCompositeExtract %half %mat4x2_f16 0 0
+        %388 = OpFunctionCall %int %tint_f16_to_i32 %387
+        %389 = OpBitcast %uint %386
+        %390 = OpBitcast %uint %388
+        %391 = OpIAdd %uint %389 %390
+        %392 = OpBitcast %int %391
+        %393 = OpCompositeExtract %half %mat4x3_f16 0 0
+        %394 = OpFunctionCall %int %tint_f16_to_i32 %393
+        %395 = OpBitcast %uint %392
+        %396 = OpBitcast %uint %394
+        %397 = OpIAdd %uint %395 %396
+        %398 = OpBitcast %int %397
+        %399 = OpCompositeExtract %half %mat4x4_f16 0 0
+        %400 = OpFunctionCall %int %tint_f16_to_i32 %399
+        %401 = OpBitcast %uint %398
+        %402 = OpBitcast %uint %400
+        %403 = OpIAdd %uint %401 %402
+        %404 = OpBitcast %int %403
+        %405 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %406 = OpFunctionCall %int %tint_f32_to_i32 %405
+        %407 = OpBitcast %uint %404
+        %408 = OpBitcast %uint %406
+        %409 = OpIAdd %uint %407 %408
+        %410 = OpBitcast %int %409
+        %411 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
+        %412 = OpFunctionCall %int %tint_f16_to_i32 %411
+        %413 = OpBitcast %uint %410
+        %414 = OpBitcast %uint %412
+        %415 = OpIAdd %uint %413 %414
+        %416 = OpBitcast %int %415
+        %417 = OpCompositeExtract %int %struct_inner 0
+        %418 = OpBitcast %uint %416
+        %419 = OpBitcast %uint %417
+        %420 = OpIAdd %uint %418 %419
+        %421 = OpBitcast %int %420
+        %422 = OpCompositeExtract %int %array_struct_inner 0 0
+        %423 = OpBitcast %uint %421
+        %424 = OpBitcast %uint %422
+        %425 = OpIAdd %uint %423 %424
+        %426 = OpBitcast %int %425
+        %427 = OpAccessChain %_ptr_StorageBuffer_int_0 %45 %uint_0
+               OpStore %427 %426 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %319
+%tint_f32_to_i32 = OpFunction %int None %430
       %value = OpFunctionParameter %float
-        %320 = OpLabel
-        %321 = OpExtInst %float %322 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %325 = OpConvertFToS %int %321
-               OpReturnValue %325
+        %431 = OpLabel
+        %432 = OpExtInst %float %433 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %436 = OpConvertFToS %int %432
+               OpReturnValue %436
                OpFunctionEnd
-%tint_f16_to_i32 = OpFunction %int None %327
+%tint_f16_to_i32 = OpFunction %int None %438
     %value_0 = OpFunctionParameter %half
-        %328 = OpLabel
-        %329 = OpExtInst %half %322 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
-        %332 = OpConvertFToS %int %329
-               OpReturnValue %332
+        %439 = OpLabel
+        %440 = OpExtInst %half %433 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
+        %443 = OpConvertFToS %int %440
+               OpReturnValue %443
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %334
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %445
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %335 = OpLabel
-        %336 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %338 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %340
-               OpStore %336 %tint_source
-               OpBranch %341
-        %341 = OpLabel
-               OpBranch %344
-        %344 = OpLabel
-        %346 = OpPhi %uint %uint_0 %341 %347 %343
-               OpLoopMerge %345 %343 None
-               OpBranch %342
-        %342 = OpLabel
-        %349 = OpUGreaterThanEqual %bool %346 %uint_2
-               OpSelectionMerge %351 None
-               OpBranchConditional %349 %352 %351
-        %352 = OpLabel
-               OpBranch %345
-        %351 = OpLabel
-        %353 = OpAccessChain %_ptr_Function_v3float %336 %346
-        %355 = OpLoad %v3float %353 None
-        %356 = OpAccessChain %_ptr_Function_v3float %338 %346
-               OpStore %356 %355 None
-               OpBranch %343
-        %343 = OpLabel
-        %347 = OpIAdd %uint %346 %uint_1
-               OpBranch %344
-        %345 = OpLabel
-        %348 = OpLoad %_arr_v3float_uint_2_0 %338 None
-               OpReturnValue %348
+        %446 = OpLabel
+        %447 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %449 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %451
+               OpStore %447 %tint_source
+               OpBranch %452
+        %452 = OpLabel
+               OpBranch %455
+        %455 = OpLabel
+        %457 = OpPhi %uint %uint_0 %452 %458 %454
+               OpLoopMerge %456 %454 None
+               OpBranch %453
+        %453 = OpLabel
+        %460 = OpUGreaterThanEqual %bool %457 %uint_2
+               OpSelectionMerge %462 None
+               OpBranchConditional %460 %463 %462
+        %463 = OpLabel
+               OpBranch %456
+        %462 = OpLabel
+        %464 = OpAccessChain %_ptr_Function_v3float %447 %457
+        %466 = OpLoad %v3float %464 None
+        %467 = OpAccessChain %_ptr_Function_v3float %449 %457
+               OpStore %467 %466 None
+               OpBranch %454
+        %454 = OpLabel
+        %458 = OpIAdd %uint %457 %uint_1
+               OpBranch %455
+        %456 = OpLabel
+        %459 = OpLoad %_arr_v3float_uint_2_0 %449 None
+               OpReturnValue %459
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4v2half_uint_2_0 None %358
+%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4v2half_uint_2_0 None %469
 %tint_source_0 = OpFunctionParameter %_arr_mat4v2half_uint_2
-        %359 = OpLabel
-        %360 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2 Function
-        %362 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2_0 Function %364
-               OpStore %360 %tint_source_0
-               OpBranch %365
-        %365 = OpLabel
-               OpBranch %368
-        %368 = OpLabel
-        %370 = OpPhi %uint %uint_0 %365 %371 %367
-               OpLoopMerge %369 %367 None
-               OpBranch %366
-        %366 = OpLabel
-        %373 = OpUGreaterThanEqual %bool %370 %uint_2
-               OpSelectionMerge %374 None
-               OpBranchConditional %373 %375 %374
-        %375 = OpLabel
-               OpBranch %369
-        %374 = OpLabel
-        %376 = OpAccessChain %_ptr_Function_mat4v2half %360 %370
-        %378 = OpLoad %mat4v2half %376 None
-        %379 = OpAccessChain %_ptr_Function_mat4v2half %362 %370
-               OpStore %379 %378 None
-               OpBranch %367
-        %367 = OpLabel
-        %371 = OpIAdd %uint %370 %uint_1
-               OpBranch %368
-        %369 = OpLabel
-        %372 = OpLoad %_arr_mat4v2half_uint_2_0 %362 None
-               OpReturnValue %372
+        %470 = OpLabel
+        %471 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2 Function
+        %473 = OpVariable %_ptr_Function__arr_mat4v2half_uint_2_0 Function %475
+               OpStore %471 %tint_source_0
+               OpBranch %476
+        %476 = OpLabel
+               OpBranch %479
+        %479 = OpLabel
+        %481 = OpPhi %uint %uint_0 %476 %482 %478
+               OpLoopMerge %480 %478 None
+               OpBranch %477
+        %477 = OpLabel
+        %484 = OpUGreaterThanEqual %bool %481 %uint_2
+               OpSelectionMerge %485 None
+               OpBranchConditional %484 %486 %485
+        %486 = OpLabel
+               OpBranch %480
+        %485 = OpLabel
+        %487 = OpAccessChain %_ptr_Function_mat4v2half %471 %481
+        %489 = OpLoad %mat4v2half %487 None
+        %490 = OpAccessChain %_ptr_Function_mat4v2half %473 %481
+               OpStore %490 %489 None
+               OpBranch %478
+        %478 = OpLabel
+        %482 = OpIAdd %uint %481 %uint_1
+               OpBranch %479
+        %480 = OpLabel
+        %483 = OpLoad %_arr_mat4v2half_uint_2_0 %473 None
+               OpReturnValue %483
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Inner_uint_4_0 None %381
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Inner_uint_4_0 None %492
 %tint_source_1 = OpFunctionParameter %_arr_Inner_uint_4
-        %382 = OpLabel
-        %383 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
-        %385 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %387
-               OpStore %383 %tint_source_1
-               OpBranch %388
-        %388 = OpLabel
-               OpBranch %391
-        %391 = OpLabel
-        %393 = OpPhi %uint %uint_0 %388 %394 %390
-               OpLoopMerge %392 %390 None
-               OpBranch %389
-        %389 = OpLabel
-        %396 = OpUGreaterThanEqual %bool %393 %uint_4
-               OpSelectionMerge %397 None
-               OpBranchConditional %396 %398 %397
-        %398 = OpLabel
-               OpBranch %392
-        %397 = OpLabel
-        %399 = OpAccessChain %_ptr_Function_Inner %383 %393
-        %401 = OpLoad %Inner %399 None
-        %402 = OpAccessChain %_ptr_Function_Inner %385 %393
-               OpStore %402 %401 None
-               OpBranch %390
-        %390 = OpLabel
-        %394 = OpIAdd %uint %393 %uint_1
-               OpBranch %391
-        %392 = OpLabel
-        %395 = OpLoad %_arr_Inner_uint_4_0 %385 None
-               OpReturnValue %395
+        %493 = OpLabel
+        %494 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
+        %496 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %498
+               OpStore %494 %tint_source_1
+               OpBranch %499
+        %499 = OpLabel
+               OpBranch %502
+        %502 = OpLabel
+        %504 = OpPhi %uint %uint_0 %499 %505 %501
+               OpLoopMerge %503 %501 None
+               OpBranch %500
+        %500 = OpLabel
+        %507 = OpUGreaterThanEqual %bool %504 %uint_4
+               OpSelectionMerge %508 None
+               OpBranchConditional %507 %509 %508
+        %509 = OpLabel
+               OpBranch %503
+        %508 = OpLabel
+        %510 = OpAccessChain %_ptr_Function_Inner %494 %504
+        %512 = OpLoad %Inner %510 None
+        %513 = OpAccessChain %_ptr_Function_Inner %496 %504
+               OpStore %513 %512 None
+               OpBranch %501
+        %501 = OpLabel
+        %505 = OpIAdd %uint %504 %uint_1
+               OpBranch %502
+        %503 = OpLabel
+        %506 = OpLoad %_arr_Inner_uint_4_0 %496 None
+               OpReturnValue %506
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl
index df8236d..7168493 100644
--- a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl
@@ -93,24 +93,62 @@
   mat4x3 mat4x3_f32 = mat4x3(v.inner.arr[min(idx, 7u)].mat4x3_f32_col0, v.inner.arr[min(idx, 7u)].mat4x3_f32_col1, v.inner.arr[min(idx, 7u)].mat4x3_f32_col2, v.inner.arr[min(idx, 7u)].mat4x3_f32_col3);
   mat4 mat4x4_f32 = v.inner.arr[min(idx, 7u)].mat4x4_f32;
   vec3 arr2_vec3_f32[2] = v.inner.arr[min(idx, 7u)].arr2_vec3_f32;
-  int v_2 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_3 = (v_2 + int(scalar_u32));
-  int v_4 = ((v_3 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_5 = (v_4 + int(vec2_u32.x));
-  int v_6 = ((v_5 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_7 = (v_6 + int(vec3_u32.y));
-  int v_8 = ((v_7 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_9 = (v_8 + int(vec4_u32.z));
-  int v_10 = (v_9 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_11 = (v_10 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_12 = (v_11 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_13 = (v_12 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_14 = (v_13 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_15 = (v_14 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_16 = (v_15 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_17 = (v_16 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_18 = (v_17 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  v_1.inner = (v_18 + tint_f32_to_i32(arr2_vec3_f32[0u].x));
+  uint v_2 = uint(tint_f32_to_i32(scalar_f32));
+  int v_3 = int((v_2 + uint(scalar_i32)));
+  int v_4 = int(scalar_u32);
+  uint v_5 = uint(v_3);
+  int v_6 = int((v_5 + uint(v_4)));
+  int v_7 = tint_f32_to_i32(vec2_f32.x);
+  uint v_8 = uint(v_6);
+  uint v_9 = uint(int((v_8 + uint(v_7))));
+  int v_10 = int((v_9 + uint(vec2_i32.x)));
+  int v_11 = int(vec2_u32.x);
+  uint v_12 = uint(v_10);
+  int v_13 = int((v_12 + uint(v_11)));
+  int v_14 = tint_f32_to_i32(vec3_f32.y);
+  uint v_15 = uint(v_13);
+  uint v_16 = uint(int((v_15 + uint(v_14))));
+  int v_17 = int((v_16 + uint(vec3_i32.y)));
+  int v_18 = int(vec3_u32.y);
+  uint v_19 = uint(v_17);
+  int v_20 = int((v_19 + uint(v_18)));
+  int v_21 = tint_f32_to_i32(vec4_f32.z);
+  uint v_22 = uint(v_20);
+  uint v_23 = uint(int((v_22 + uint(v_21))));
+  int v_24 = int((v_23 + uint(vec4_i32.z)));
+  int v_25 = int(vec4_u32.z);
+  uint v_26 = uint(v_24);
+  int v_27 = int((v_26 + uint(v_25)));
+  int v_28 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_29 = uint(v_27);
+  int v_30 = int((v_29 + uint(v_28)));
+  int v_31 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_32 = uint(v_30);
+  int v_33 = int((v_32 + uint(v_31)));
+  int v_34 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_35 = uint(v_33);
+  int v_36 = int((v_35 + uint(v_34)));
+  int v_37 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_38 = uint(v_36);
+  int v_39 = int((v_38 + uint(v_37)));
+  int v_40 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_41 = uint(v_39);
+  int v_42 = int((v_41 + uint(v_40)));
+  int v_43 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_44 = uint(v_42);
+  int v_45 = int((v_44 + uint(v_43)));
+  int v_46 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_47 = uint(v_45);
+  int v_48 = int((v_47 + uint(v_46)));
+  int v_49 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_50 = uint(v_48);
+  int v_51 = int((v_50 + uint(v_49)));
+  int v_52 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_53 = uint(v_51);
+  int v_54 = int((v_53 + uint(v_52)));
+  int v_55 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_56 = uint(v_54);
+  v_1.inner = int((v_56 + uint(v_55)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm
index 9b9907b..552b748 100644
--- a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 286
+; Bound: 349
 ; Schema: 0
                OpCapability Shader
          %36 = OpExtInstImport "GLSL.std.450"
@@ -220,14 +220,14 @@
     %uint_33 = OpConstant %uint 33
 %_arr_v3float_uint_2_0 = OpTypeArray %v3float %uint_2
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-        %251 = OpTypeFunction %int %float
+        %314 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %258 = OpTypeFunction %void
-        %263 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %321 = OpTypeFunction %void
+        %326 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %269 = OpConstantNull %_arr_v3float_uint_2_0
+        %332 = OpConstantNull %_arr_v3float_uint_2_0
        %bool = OpTypeBool
 %_ptr_Function_v3float = OpTypePointer Function %v3float
  %main_inner = OpFunction %void None %33
@@ -331,109 +331,172 @@
         %185 = OpLoad %_arr_v3float_uint_2 %182 None
 %arr2_vec3_f32 = OpFunctionCall %_arr_v3float_uint_2_0 %tint_convert_explicit_layout %185
         %189 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %191 = OpIAdd %int %189 %scalar_i32
-        %192 = OpBitcast %int %scalar_u32
-        %193 = OpIAdd %int %191 %192
-        %194 = OpCompositeExtract %float %vec2_f32 0
-        %195 = OpFunctionCall %int %tint_f32_to_i32 %194
-        %196 = OpIAdd %int %193 %195
-        %197 = OpCompositeExtract %int %vec2_i32 0
-        %198 = OpIAdd %int %196 %197
-        %199 = OpCompositeExtract %uint %vec2_u32 0
-        %200 = OpBitcast %int %199
-        %201 = OpIAdd %int %198 %200
-        %202 = OpCompositeExtract %float %vec3_f32 1
-        %203 = OpFunctionCall %int %tint_f32_to_i32 %202
-        %204 = OpIAdd %int %201 %203
-        %205 = OpCompositeExtract %int %vec3_i32 1
-        %206 = OpIAdd %int %204 %205
-        %207 = OpCompositeExtract %uint %vec3_u32 1
-        %208 = OpBitcast %int %207
-        %209 = OpIAdd %int %206 %208
-        %210 = OpCompositeExtract %float %vec4_f32 2
-        %211 = OpFunctionCall %int %tint_f32_to_i32 %210
-        %212 = OpIAdd %int %209 %211
-        %213 = OpCompositeExtract %int %vec4_i32 2
-        %214 = OpIAdd %int %212 %213
-        %215 = OpCompositeExtract %uint %vec4_u32 2
+        %191 = OpBitcast %uint %189
+        %192 = OpBitcast %uint %scalar_i32
+        %193 = OpIAdd %uint %191 %192
+        %194 = OpBitcast %int %193
+        %195 = OpBitcast %int %scalar_u32
+        %196 = OpBitcast %uint %194
+        %197 = OpBitcast %uint %195
+        %198 = OpIAdd %uint %196 %197
+        %199 = OpBitcast %int %198
+        %200 = OpCompositeExtract %float %vec2_f32 0
+        %201 = OpFunctionCall %int %tint_f32_to_i32 %200
+        %202 = OpBitcast %uint %199
+        %203 = OpBitcast %uint %201
+        %204 = OpIAdd %uint %202 %203
+        %205 = OpBitcast %int %204
+        %206 = OpCompositeExtract %int %vec2_i32 0
+        %207 = OpBitcast %uint %205
+        %208 = OpBitcast %uint %206
+        %209 = OpIAdd %uint %207 %208
+        %210 = OpBitcast %int %209
+        %211 = OpCompositeExtract %uint %vec2_u32 0
+        %212 = OpBitcast %int %211
+        %213 = OpBitcast %uint %210
+        %214 = OpBitcast %uint %212
+        %215 = OpIAdd %uint %213 %214
         %216 = OpBitcast %int %215
-        %217 = OpIAdd %int %214 %216
-        %218 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %219 = OpFunctionCall %int %tint_f32_to_i32 %218
-        %220 = OpIAdd %int %217 %219
-        %221 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %222 = OpFunctionCall %int %tint_f32_to_i32 %221
-        %223 = OpIAdd %int %220 %222
-        %224 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %225 = OpFunctionCall %int %tint_f32_to_i32 %224
-        %226 = OpIAdd %int %223 %225
-        %227 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %228 = OpFunctionCall %int %tint_f32_to_i32 %227
-        %229 = OpIAdd %int %226 %228
-        %230 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %231 = OpFunctionCall %int %tint_f32_to_i32 %230
-        %232 = OpIAdd %int %229 %231
-        %233 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %234 = OpFunctionCall %int %tint_f32_to_i32 %233
-        %235 = OpIAdd %int %232 %234
-        %236 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %237 = OpFunctionCall %int %tint_f32_to_i32 %236
-        %238 = OpIAdd %int %235 %237
-        %239 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %240 = OpFunctionCall %int %tint_f32_to_i32 %239
-        %241 = OpIAdd %int %238 %240
-        %242 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %243 = OpFunctionCall %int %tint_f32_to_i32 %242
-        %244 = OpIAdd %int %241 %243
-        %245 = OpCompositeExtract %float %arr2_vec3_f32 0 0
-        %246 = OpFunctionCall %int %tint_f32_to_i32 %245
-        %247 = OpIAdd %int %244 %246
-        %248 = OpAccessChain %_ptr_StorageBuffer_int %25 %uint_0
-               OpStore %248 %247 None
+        %217 = OpCompositeExtract %float %vec3_f32 1
+        %218 = OpFunctionCall %int %tint_f32_to_i32 %217
+        %219 = OpBitcast %uint %216
+        %220 = OpBitcast %uint %218
+        %221 = OpIAdd %uint %219 %220
+        %222 = OpBitcast %int %221
+        %223 = OpCompositeExtract %int %vec3_i32 1
+        %224 = OpBitcast %uint %222
+        %225 = OpBitcast %uint %223
+        %226 = OpIAdd %uint %224 %225
+        %227 = OpBitcast %int %226
+        %228 = OpCompositeExtract %uint %vec3_u32 1
+        %229 = OpBitcast %int %228
+        %230 = OpBitcast %uint %227
+        %231 = OpBitcast %uint %229
+        %232 = OpIAdd %uint %230 %231
+        %233 = OpBitcast %int %232
+        %234 = OpCompositeExtract %float %vec4_f32 2
+        %235 = OpFunctionCall %int %tint_f32_to_i32 %234
+        %236 = OpBitcast %uint %233
+        %237 = OpBitcast %uint %235
+        %238 = OpIAdd %uint %236 %237
+        %239 = OpBitcast %int %238
+        %240 = OpCompositeExtract %int %vec4_i32 2
+        %241 = OpBitcast %uint %239
+        %242 = OpBitcast %uint %240
+        %243 = OpIAdd %uint %241 %242
+        %244 = OpBitcast %int %243
+        %245 = OpCompositeExtract %uint %vec4_u32 2
+        %246 = OpBitcast %int %245
+        %247 = OpBitcast %uint %244
+        %248 = OpBitcast %uint %246
+        %249 = OpIAdd %uint %247 %248
+        %250 = OpBitcast %int %249
+        %251 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %252 = OpFunctionCall %int %tint_f32_to_i32 %251
+        %253 = OpBitcast %uint %250
+        %254 = OpBitcast %uint %252
+        %255 = OpIAdd %uint %253 %254
+        %256 = OpBitcast %int %255
+        %257 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %258 = OpFunctionCall %int %tint_f32_to_i32 %257
+        %259 = OpBitcast %uint %256
+        %260 = OpBitcast %uint %258
+        %261 = OpIAdd %uint %259 %260
+        %262 = OpBitcast %int %261
+        %263 = OpCompositeExtract %float %mat2x4_f32 0 0
+        %264 = OpFunctionCall %int %tint_f32_to_i32 %263
+        %265 = OpBitcast %uint %262
+        %266 = OpBitcast %uint %264
+        %267 = OpIAdd %uint %265 %266
+        %268 = OpBitcast %int %267
+        %269 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %270 = OpFunctionCall %int %tint_f32_to_i32 %269
+        %271 = OpBitcast %uint %268
+        %272 = OpBitcast %uint %270
+        %273 = OpIAdd %uint %271 %272
+        %274 = OpBitcast %int %273
+        %275 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %276 = OpFunctionCall %int %tint_f32_to_i32 %275
+        %277 = OpBitcast %uint %274
+        %278 = OpBitcast %uint %276
+        %279 = OpIAdd %uint %277 %278
+        %280 = OpBitcast %int %279
+        %281 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %282 = OpFunctionCall %int %tint_f32_to_i32 %281
+        %283 = OpBitcast %uint %280
+        %284 = OpBitcast %uint %282
+        %285 = OpIAdd %uint %283 %284
+        %286 = OpBitcast %int %285
+        %287 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %288 = OpFunctionCall %int %tint_f32_to_i32 %287
+        %289 = OpBitcast %uint %286
+        %290 = OpBitcast %uint %288
+        %291 = OpIAdd %uint %289 %290
+        %292 = OpBitcast %int %291
+        %293 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %294 = OpFunctionCall %int %tint_f32_to_i32 %293
+        %295 = OpBitcast %uint %292
+        %296 = OpBitcast %uint %294
+        %297 = OpIAdd %uint %295 %296
+        %298 = OpBitcast %int %297
+        %299 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %300 = OpFunctionCall %int %tint_f32_to_i32 %299
+        %301 = OpBitcast %uint %298
+        %302 = OpBitcast %uint %300
+        %303 = OpIAdd %uint %301 %302
+        %304 = OpBitcast %int %303
+        %305 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %306 = OpFunctionCall %int %tint_f32_to_i32 %305
+        %307 = OpBitcast %uint %304
+        %308 = OpBitcast %uint %306
+        %309 = OpIAdd %uint %307 %308
+        %310 = OpBitcast %int %309
+        %311 = OpAccessChain %_ptr_StorageBuffer_int %25 %uint_0
+               OpStore %311 %310 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %251
+%tint_f32_to_i32 = OpFunction %int None %314
       %value = OpFunctionParameter %float
-        %252 = OpLabel
-        %253 = OpExtInst %float %36 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %256 = OpConvertFToS %int %253
-               OpReturnValue %256
+        %315 = OpLabel
+        %316 = OpExtInst %float %36 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %319 = OpConvertFToS %int %316
+               OpReturnValue %319
                OpFunctionEnd
-       %main = OpFunction %void None %258
-        %259 = OpLabel
-        %260 = OpLoad %uint %main_local_invocation_index_Input None
-        %261 = OpFunctionCall %void %main_inner %260
+       %main = OpFunction %void None %321
+        %322 = OpLabel
+        %323 = OpLoad %uint %main_local_invocation_index_Input None
+        %324 = OpFunctionCall %void %main_inner %323
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %263
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %326
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %264 = OpLabel
-        %265 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %267 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %269
-               OpStore %265 %tint_source
-               OpBranch %270
-        %270 = OpLabel
-               OpBranch %273
-        %273 = OpLabel
-        %275 = OpPhi %uint %uint_0 %270 %276 %272
-               OpLoopMerge %274 %272 None
-               OpBranch %271
-        %271 = OpLabel
-        %278 = OpUGreaterThanEqual %bool %275 %uint_2
-               OpSelectionMerge %280 None
-               OpBranchConditional %278 %281 %280
-        %281 = OpLabel
-               OpBranch %274
-        %280 = OpLabel
-        %282 = OpAccessChain %_ptr_Function_v3float %265 %275
-        %284 = OpLoad %v3float %282 None
-        %285 = OpAccessChain %_ptr_Function_v3float %267 %275
-               OpStore %285 %284 None
-               OpBranch %272
-        %272 = OpLabel
-        %276 = OpIAdd %uint %275 %uint_1
-               OpBranch %273
-        %274 = OpLabel
-        %277 = OpLoad %_arr_v3float_uint_2_0 %267 None
-               OpReturnValue %277
+        %327 = OpLabel
+        %328 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %330 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %332
+               OpStore %328 %tint_source
+               OpBranch %333
+        %333 = OpLabel
+               OpBranch %336
+        %336 = OpLabel
+        %338 = OpPhi %uint %uint_0 %333 %339 %335
+               OpLoopMerge %337 %335 None
+               OpBranch %334
+        %334 = OpLabel
+        %341 = OpUGreaterThanEqual %bool %338 %uint_2
+               OpSelectionMerge %343 None
+               OpBranchConditional %341 %344 %343
+        %344 = OpLabel
+               OpBranch %337
+        %343 = OpLabel
+        %345 = OpAccessChain %_ptr_Function_v3float %328 %338
+        %347 = OpLoad %v3float %345 None
+        %348 = OpAccessChain %_ptr_Function_v3float %330 %338
+               OpStore %348 %347 None
+               OpBranch %335
+        %335 = OpLabel
+        %339 = OpIAdd %uint %338 %uint_1
+               OpBranch %336
+        %337 = OpLabel
+        %340 = OpLoad %_arr_v3float_uint_2_0 %330 None
+               OpReturnValue %340
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.glsl b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.glsl
index 6799dc4..ef1797b 100644
--- a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.glsl
@@ -172,38 +172,104 @@
     }
   }
   f16mat4x2 arr2_mat4x2_f16[2] = v_3;
-  int v_6 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_7 = (v_6 + int(scalar_u32));
-  int v_8 = (v_7 + tint_f16_to_i32(scalar_f16));
-  int v_9 = ((v_8 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_10 = (v_9 + int(vec2_u32.x));
-  int v_11 = (v_10 + tint_f16_to_i32(vec2_f16.x));
-  int v_12 = ((v_11 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_13 = (v_12 + int(vec3_u32.y));
-  int v_14 = (v_13 + tint_f16_to_i32(vec3_f16.y));
-  int v_15 = ((v_14 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_16 = (v_15 + int(vec4_u32.z));
-  int v_17 = (v_16 + tint_f16_to_i32(vec4_f16.z));
-  int v_18 = (v_17 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_19 = (v_18 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_20 = (v_19 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_21 = (v_20 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_22 = (v_21 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_23 = (v_22 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_24 = (v_23 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_25 = (v_24 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_26 = (v_25 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  int v_27 = (v_26 + tint_f16_to_i32(mat2x2_f16[0u].x));
-  int v_28 = (v_27 + tint_f16_to_i32(mat2x3_f16[0u].x));
-  int v_29 = (v_28 + tint_f16_to_i32(mat2x4_f16[0u].x));
-  int v_30 = (v_29 + tint_f16_to_i32(mat3x2_f16[0u].x));
-  int v_31 = (v_30 + tint_f16_to_i32(mat3x3_f16[0u].x));
-  int v_32 = (v_31 + tint_f16_to_i32(mat3x4_f16[0u].x));
-  int v_33 = (v_32 + tint_f16_to_i32(mat4x2_f16[0u].x));
-  int v_34 = (v_33 + tint_f16_to_i32(mat4x3_f16[0u].x));
-  int v_35 = (v_34 + tint_f16_to_i32(mat4x4_f16[0u].x));
-  int v_36 = (v_35 + tint_f32_to_i32(arr2_vec3_f32[0u].x));
-  v_1.inner = (v_36 + tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x));
+  uint v_6 = uint(tint_f32_to_i32(scalar_f32));
+  int v_7 = int((v_6 + uint(scalar_i32)));
+  int v_8 = int(scalar_u32);
+  uint v_9 = uint(v_7);
+  int v_10 = int((v_9 + uint(v_8)));
+  int v_11 = tint_f16_to_i32(scalar_f16);
+  uint v_12 = uint(v_10);
+  int v_13 = int((v_12 + uint(v_11)));
+  int v_14 = tint_f32_to_i32(vec2_f32.x);
+  uint v_15 = uint(v_13);
+  uint v_16 = uint(int((v_15 + uint(v_14))));
+  int v_17 = int((v_16 + uint(vec2_i32.x)));
+  int v_18 = int(vec2_u32.x);
+  uint v_19 = uint(v_17);
+  int v_20 = int((v_19 + uint(v_18)));
+  int v_21 = tint_f16_to_i32(vec2_f16.x);
+  uint v_22 = uint(v_20);
+  int v_23 = int((v_22 + uint(v_21)));
+  int v_24 = tint_f32_to_i32(vec3_f32.y);
+  uint v_25 = uint(v_23);
+  uint v_26 = uint(int((v_25 + uint(v_24))));
+  int v_27 = int((v_26 + uint(vec3_i32.y)));
+  int v_28 = int(vec3_u32.y);
+  uint v_29 = uint(v_27);
+  int v_30 = int((v_29 + uint(v_28)));
+  int v_31 = tint_f16_to_i32(vec3_f16.y);
+  uint v_32 = uint(v_30);
+  int v_33 = int((v_32 + uint(v_31)));
+  int v_34 = tint_f32_to_i32(vec4_f32.z);
+  uint v_35 = uint(v_33);
+  uint v_36 = uint(int((v_35 + uint(v_34))));
+  int v_37 = int((v_36 + uint(vec4_i32.z)));
+  int v_38 = int(vec4_u32.z);
+  uint v_39 = uint(v_37);
+  int v_40 = int((v_39 + uint(v_38)));
+  int v_41 = tint_f16_to_i32(vec4_f16.z);
+  uint v_42 = uint(v_40);
+  int v_43 = int((v_42 + uint(v_41)));
+  int v_44 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_45 = uint(v_43);
+  int v_46 = int((v_45 + uint(v_44)));
+  int v_47 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_48 = uint(v_46);
+  int v_49 = int((v_48 + uint(v_47)));
+  int v_50 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_51 = uint(v_49);
+  int v_52 = int((v_51 + uint(v_50)));
+  int v_53 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_54 = uint(v_52);
+  int v_55 = int((v_54 + uint(v_53)));
+  int v_56 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_57 = uint(v_55);
+  int v_58 = int((v_57 + uint(v_56)));
+  int v_59 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_60 = uint(v_58);
+  int v_61 = int((v_60 + uint(v_59)));
+  int v_62 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_63 = uint(v_61);
+  int v_64 = int((v_63 + uint(v_62)));
+  int v_65 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_66 = uint(v_64);
+  int v_67 = int((v_66 + uint(v_65)));
+  int v_68 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_69 = uint(v_67);
+  int v_70 = int((v_69 + uint(v_68)));
+  int v_71 = tint_f16_to_i32(mat2x2_f16[0u].x);
+  uint v_72 = uint(v_70);
+  int v_73 = int((v_72 + uint(v_71)));
+  int v_74 = tint_f16_to_i32(mat2x3_f16[0u].x);
+  uint v_75 = uint(v_73);
+  int v_76 = int((v_75 + uint(v_74)));
+  int v_77 = tint_f16_to_i32(mat2x4_f16[0u].x);
+  uint v_78 = uint(v_76);
+  int v_79 = int((v_78 + uint(v_77)));
+  int v_80 = tint_f16_to_i32(mat3x2_f16[0u].x);
+  uint v_81 = uint(v_79);
+  int v_82 = int((v_81 + uint(v_80)));
+  int v_83 = tint_f16_to_i32(mat3x3_f16[0u].x);
+  uint v_84 = uint(v_82);
+  int v_85 = int((v_84 + uint(v_83)));
+  int v_86 = tint_f16_to_i32(mat3x4_f16[0u].x);
+  uint v_87 = uint(v_85);
+  int v_88 = int((v_87 + uint(v_86)));
+  int v_89 = tint_f16_to_i32(mat4x2_f16[0u].x);
+  uint v_90 = uint(v_88);
+  int v_91 = int((v_90 + uint(v_89)));
+  int v_92 = tint_f16_to_i32(mat4x3_f16[0u].x);
+  uint v_93 = uint(v_91);
+  int v_94 = int((v_93 + uint(v_92)));
+  int v_95 = tint_f16_to_i32(mat4x4_f16[0u].x);
+  uint v_96 = uint(v_94);
+  int v_97 = int((v_96 + uint(v_95)));
+  int v_98 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_99 = uint(v_97);
+  int v_100 = int((v_99 + uint(v_98)));
+  int v_101 = tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x);
+  uint v_102 = uint(v_100);
+  v_1.inner = int((v_102 + uint(v_101)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.spvasm b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.spvasm
index 6312b0c..35e2f5f 100644
--- a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 525
+; Bound: 630
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
@@ -375,21 +375,21 @@
        %bool = OpTypeBool
 %_ptr_Function_mat4v2half = OpTypePointer Function %mat4v2half
 %_ptr_Function_mat4x2_f16_std140 = OpTypePointer Function %mat4x2_f16_std140
-        %463 = OpTypeFunction %int %float
+        %568 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %470 = OpTypeFunction %int %half
+        %575 = OpTypeFunction %int %half
 %half_n0x1_ffcp_15 = OpConstant %half -0x1.ffcp+15
 %half_0x1_ffcp_15 = OpConstant %half 0x1.ffcp+15
-        %477 = OpTypeFunction %void
-        %482 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %582 = OpTypeFunction %void
+        %587 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %488 = OpConstantNull %_arr_v3float_uint_2_0
+        %593 = OpConstantNull %_arr_v3float_uint_2_0
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-        %505 = OpTypeFunction %_arr_mat4x2_f16_std140_uint_2_0 %_arr_mat4x2_f16_std140_uint_2
+        %610 = OpTypeFunction %_arr_mat4x2_f16_std140_uint_2_0 %_arr_mat4x2_f16_std140_uint_2
 %_ptr_Function__arr_mat4x2_f16_std140_uint_2 = OpTypePointer Function %_arr_mat4x2_f16_std140_uint_2
-        %510 = OpConstantNull %_arr_mat4x2_f16_std140_uint_2_0
+        %615 = OpConstantNull %_arr_mat4x2_f16_std140_uint_2_0
  %main_inner = OpFunction %void None %39
         %idx = OpFunctionParameter %uint
          %40 = OpLabel
@@ -589,21 +589,21 @@
                OpLoopMerge %341 %339 None
                OpBranch %338
         %338 = OpLabel
-        %448 = OpUGreaterThanEqual %bool %342 %uint_2
-               OpSelectionMerge %450 None
-               OpBranchConditional %448 %451 %450
-        %451 = OpLabel
+        %553 = OpUGreaterThanEqual %bool %342 %uint_2
+               OpSelectionMerge %555 None
+               OpBranchConditional %553 %556 %555
+        %556 = OpLabel
                OpBranch %341
-        %450 = OpLabel
-        %452 = OpAccessChain %_ptr_Function_mat4v2half %333 %342
-        %454 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %331 %342
-        %456 = OpLoad %mat4x2_f16_std140 %454 None
-        %457 = OpCompositeExtract %v2half %456 0
-        %458 = OpCompositeExtract %v2half %456 1
-        %459 = OpCompositeExtract %v2half %456 2
-        %460 = OpCompositeExtract %v2half %456 3
-        %461 = OpCompositeConstruct %mat4v2half %457 %458 %459 %460
-               OpStore %452 %461 None
+        %555 = OpLabel
+        %557 = OpAccessChain %_ptr_Function_mat4v2half %333 %342
+        %559 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %331 %342
+        %561 = OpLoad %mat4x2_f16_std140 %559 None
+        %562 = OpCompositeExtract %v2half %561 0
+        %563 = OpCompositeExtract %v2half %561 1
+        %564 = OpCompositeExtract %v2half %561 2
+        %565 = OpCompositeExtract %v2half %561 3
+        %566 = OpCompositeConstruct %mat4v2half %562 %563 %564 %565
+               OpStore %557 %566 None
                OpBranch %339
         %339 = OpLabel
         %343 = OpIAdd %uint %342 %uint_1
@@ -611,189 +611,294 @@
         %341 = OpLabel
 %arr2_mat4x2_f16 = OpLoad %_arr_mat4v2half_uint_2 %333 None
         %345 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %347 = OpIAdd %int %345 %scalar_i32
-        %348 = OpBitcast %int %scalar_u32
-        %349 = OpIAdd %int %347 %348
-        %350 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
-        %352 = OpIAdd %int %349 %350
-        %353 = OpCompositeExtract %float %vec2_f32 0
-        %354 = OpFunctionCall %int %tint_f32_to_i32 %353
-        %355 = OpIAdd %int %352 %354
-        %356 = OpCompositeExtract %int %vec2_i32 0
-        %357 = OpIAdd %int %355 %356
-        %358 = OpCompositeExtract %uint %vec2_u32 0
-        %359 = OpBitcast %int %358
-        %360 = OpIAdd %int %357 %359
-        %361 = OpCompositeExtract %half %vec2_f16 0
-        %362 = OpFunctionCall %int %tint_f16_to_i32 %361
-        %363 = OpIAdd %int %360 %362
-        %364 = OpCompositeExtract %float %vec3_f32 1
-        %365 = OpFunctionCall %int %tint_f32_to_i32 %364
-        %366 = OpIAdd %int %363 %365
-        %367 = OpCompositeExtract %int %vec3_i32 1
-        %368 = OpIAdd %int %366 %367
-        %369 = OpCompositeExtract %uint %vec3_u32 1
-        %370 = OpBitcast %int %369
-        %371 = OpIAdd %int %368 %370
-        %372 = OpCompositeExtract %half %vec3_f16 1
-        %373 = OpFunctionCall %int %tint_f16_to_i32 %372
-        %374 = OpIAdd %int %371 %373
-        %375 = OpCompositeExtract %float %vec4_f32 2
-        %376 = OpFunctionCall %int %tint_f32_to_i32 %375
-        %377 = OpIAdd %int %374 %376
-        %378 = OpCompositeExtract %int %vec4_i32 2
-        %379 = OpIAdd %int %377 %378
-        %380 = OpCompositeExtract %uint %vec4_u32 2
-        %381 = OpBitcast %int %380
-        %382 = OpIAdd %int %379 %381
-        %383 = OpCompositeExtract %half %vec4_f16 2
-        %384 = OpFunctionCall %int %tint_f16_to_i32 %383
-        %385 = OpIAdd %int %382 %384
-        %386 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %387 = OpFunctionCall %int %tint_f32_to_i32 %386
-        %388 = OpIAdd %int %385 %387
-        %389 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %390 = OpFunctionCall %int %tint_f32_to_i32 %389
-        %391 = OpIAdd %int %388 %390
-        %392 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %393 = OpFunctionCall %int %tint_f32_to_i32 %392
-        %394 = OpIAdd %int %391 %393
-        %395 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %396 = OpFunctionCall %int %tint_f32_to_i32 %395
-        %397 = OpIAdd %int %394 %396
-        %398 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %399 = OpFunctionCall %int %tint_f32_to_i32 %398
-        %400 = OpIAdd %int %397 %399
-        %401 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %402 = OpFunctionCall %int %tint_f32_to_i32 %401
-        %403 = OpIAdd %int %400 %402
-        %404 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %405 = OpFunctionCall %int %tint_f32_to_i32 %404
-        %406 = OpIAdd %int %403 %405
-        %407 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %408 = OpFunctionCall %int %tint_f32_to_i32 %407
-        %409 = OpIAdd %int %406 %408
-        %410 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %411 = OpFunctionCall %int %tint_f32_to_i32 %410
-        %412 = OpIAdd %int %409 %411
-        %413 = OpCompositeExtract %half %mat2x2_f16 0 0
-        %414 = OpFunctionCall %int %tint_f16_to_i32 %413
-        %415 = OpIAdd %int %412 %414
-        %416 = OpCompositeExtract %half %mat2x3_f16 0 0
-        %417 = OpFunctionCall %int %tint_f16_to_i32 %416
-        %418 = OpIAdd %int %415 %417
-        %419 = OpCompositeExtract %half %mat2x4_f16 0 0
-        %420 = OpFunctionCall %int %tint_f16_to_i32 %419
-        %421 = OpIAdd %int %418 %420
-        %422 = OpCompositeExtract %half %mat3x2_f16 0 0
-        %423 = OpFunctionCall %int %tint_f16_to_i32 %422
-        %424 = OpIAdd %int %421 %423
-        %425 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %347 = OpBitcast %uint %345
+        %348 = OpBitcast %uint %scalar_i32
+        %349 = OpIAdd %uint %347 %348
+        %350 = OpBitcast %int %349
+        %351 = OpBitcast %int %scalar_u32
+        %352 = OpBitcast %uint %350
+        %353 = OpBitcast %uint %351
+        %354 = OpIAdd %uint %352 %353
+        %355 = OpBitcast %int %354
+        %356 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
+        %358 = OpBitcast %uint %355
+        %359 = OpBitcast %uint %356
+        %360 = OpIAdd %uint %358 %359
+        %361 = OpBitcast %int %360
+        %362 = OpCompositeExtract %float %vec2_f32 0
+        %363 = OpFunctionCall %int %tint_f32_to_i32 %362
+        %364 = OpBitcast %uint %361
+        %365 = OpBitcast %uint %363
+        %366 = OpIAdd %uint %364 %365
+        %367 = OpBitcast %int %366
+        %368 = OpCompositeExtract %int %vec2_i32 0
+        %369 = OpBitcast %uint %367
+        %370 = OpBitcast %uint %368
+        %371 = OpIAdd %uint %369 %370
+        %372 = OpBitcast %int %371
+        %373 = OpCompositeExtract %uint %vec2_u32 0
+        %374 = OpBitcast %int %373
+        %375 = OpBitcast %uint %372
+        %376 = OpBitcast %uint %374
+        %377 = OpIAdd %uint %375 %376
+        %378 = OpBitcast %int %377
+        %379 = OpCompositeExtract %half %vec2_f16 0
+        %380 = OpFunctionCall %int %tint_f16_to_i32 %379
+        %381 = OpBitcast %uint %378
+        %382 = OpBitcast %uint %380
+        %383 = OpIAdd %uint %381 %382
+        %384 = OpBitcast %int %383
+        %385 = OpCompositeExtract %float %vec3_f32 1
+        %386 = OpFunctionCall %int %tint_f32_to_i32 %385
+        %387 = OpBitcast %uint %384
+        %388 = OpBitcast %uint %386
+        %389 = OpIAdd %uint %387 %388
+        %390 = OpBitcast %int %389
+        %391 = OpCompositeExtract %int %vec3_i32 1
+        %392 = OpBitcast %uint %390
+        %393 = OpBitcast %uint %391
+        %394 = OpIAdd %uint %392 %393
+        %395 = OpBitcast %int %394
+        %396 = OpCompositeExtract %uint %vec3_u32 1
+        %397 = OpBitcast %int %396
+        %398 = OpBitcast %uint %395
+        %399 = OpBitcast %uint %397
+        %400 = OpIAdd %uint %398 %399
+        %401 = OpBitcast %int %400
+        %402 = OpCompositeExtract %half %vec3_f16 1
+        %403 = OpFunctionCall %int %tint_f16_to_i32 %402
+        %404 = OpBitcast %uint %401
+        %405 = OpBitcast %uint %403
+        %406 = OpIAdd %uint %404 %405
+        %407 = OpBitcast %int %406
+        %408 = OpCompositeExtract %float %vec4_f32 2
+        %409 = OpFunctionCall %int %tint_f32_to_i32 %408
+        %410 = OpBitcast %uint %407
+        %411 = OpBitcast %uint %409
+        %412 = OpIAdd %uint %410 %411
+        %413 = OpBitcast %int %412
+        %414 = OpCompositeExtract %int %vec4_i32 2
+        %415 = OpBitcast %uint %413
+        %416 = OpBitcast %uint %414
+        %417 = OpIAdd %uint %415 %416
+        %418 = OpBitcast %int %417
+        %419 = OpCompositeExtract %uint %vec4_u32 2
+        %420 = OpBitcast %int %419
+        %421 = OpBitcast %uint %418
+        %422 = OpBitcast %uint %420
+        %423 = OpIAdd %uint %421 %422
+        %424 = OpBitcast %int %423
+        %425 = OpCompositeExtract %half %vec4_f16 2
         %426 = OpFunctionCall %int %tint_f16_to_i32 %425
-        %427 = OpIAdd %int %424 %426
-        %428 = OpCompositeExtract %half %mat3x4_f16 0 0
-        %429 = OpFunctionCall %int %tint_f16_to_i32 %428
-        %430 = OpIAdd %int %427 %429
-        %431 = OpCompositeExtract %half %mat4x2_f16 0 0
-        %432 = OpFunctionCall %int %tint_f16_to_i32 %431
-        %433 = OpIAdd %int %430 %432
-        %434 = OpCompositeExtract %half %mat4x3_f16 0 0
-        %435 = OpFunctionCall %int %tint_f16_to_i32 %434
-        %436 = OpIAdd %int %433 %435
-        %437 = OpCompositeExtract %half %mat4x4_f16 0 0
-        %438 = OpFunctionCall %int %tint_f16_to_i32 %437
-        %439 = OpIAdd %int %436 %438
-        %440 = OpCompositeExtract %float %arr2_vec3_f32 0 0
-        %441 = OpFunctionCall %int %tint_f32_to_i32 %440
-        %442 = OpIAdd %int %439 %441
-        %443 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
-        %444 = OpFunctionCall %int %tint_f16_to_i32 %443
-        %445 = OpIAdd %int %442 %444
-        %446 = OpAccessChain %_ptr_StorageBuffer_int %31 %uint_0
-               OpStore %446 %445 None
+        %427 = OpBitcast %uint %424
+        %428 = OpBitcast %uint %426
+        %429 = OpIAdd %uint %427 %428
+        %430 = OpBitcast %int %429
+        %431 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %432 = OpFunctionCall %int %tint_f32_to_i32 %431
+        %433 = OpBitcast %uint %430
+        %434 = OpBitcast %uint %432
+        %435 = OpIAdd %uint %433 %434
+        %436 = OpBitcast %int %435
+        %437 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %438 = OpFunctionCall %int %tint_f32_to_i32 %437
+        %439 = OpBitcast %uint %436
+        %440 = OpBitcast %uint %438
+        %441 = OpIAdd %uint %439 %440
+        %442 = OpBitcast %int %441
+        %443 = OpCompositeExtract %float %mat2x4_f32 0 0
+        %444 = OpFunctionCall %int %tint_f32_to_i32 %443
+        %445 = OpBitcast %uint %442
+        %446 = OpBitcast %uint %444
+        %447 = OpIAdd %uint %445 %446
+        %448 = OpBitcast %int %447
+        %449 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %450 = OpFunctionCall %int %tint_f32_to_i32 %449
+        %451 = OpBitcast %uint %448
+        %452 = OpBitcast %uint %450
+        %453 = OpIAdd %uint %451 %452
+        %454 = OpBitcast %int %453
+        %455 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %456 = OpFunctionCall %int %tint_f32_to_i32 %455
+        %457 = OpBitcast %uint %454
+        %458 = OpBitcast %uint %456
+        %459 = OpIAdd %uint %457 %458
+        %460 = OpBitcast %int %459
+        %461 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %462 = OpFunctionCall %int %tint_f32_to_i32 %461
+        %463 = OpBitcast %uint %460
+        %464 = OpBitcast %uint %462
+        %465 = OpIAdd %uint %463 %464
+        %466 = OpBitcast %int %465
+        %467 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %468 = OpFunctionCall %int %tint_f32_to_i32 %467
+        %469 = OpBitcast %uint %466
+        %470 = OpBitcast %uint %468
+        %471 = OpIAdd %uint %469 %470
+        %472 = OpBitcast %int %471
+        %473 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %474 = OpFunctionCall %int %tint_f32_to_i32 %473
+        %475 = OpBitcast %uint %472
+        %476 = OpBitcast %uint %474
+        %477 = OpIAdd %uint %475 %476
+        %478 = OpBitcast %int %477
+        %479 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %480 = OpFunctionCall %int %tint_f32_to_i32 %479
+        %481 = OpBitcast %uint %478
+        %482 = OpBitcast %uint %480
+        %483 = OpIAdd %uint %481 %482
+        %484 = OpBitcast %int %483
+        %485 = OpCompositeExtract %half %mat2x2_f16 0 0
+        %486 = OpFunctionCall %int %tint_f16_to_i32 %485
+        %487 = OpBitcast %uint %484
+        %488 = OpBitcast %uint %486
+        %489 = OpIAdd %uint %487 %488
+        %490 = OpBitcast %int %489
+        %491 = OpCompositeExtract %half %mat2x3_f16 0 0
+        %492 = OpFunctionCall %int %tint_f16_to_i32 %491
+        %493 = OpBitcast %uint %490
+        %494 = OpBitcast %uint %492
+        %495 = OpIAdd %uint %493 %494
+        %496 = OpBitcast %int %495
+        %497 = OpCompositeExtract %half %mat2x4_f16 0 0
+        %498 = OpFunctionCall %int %tint_f16_to_i32 %497
+        %499 = OpBitcast %uint %496
+        %500 = OpBitcast %uint %498
+        %501 = OpIAdd %uint %499 %500
+        %502 = OpBitcast %int %501
+        %503 = OpCompositeExtract %half %mat3x2_f16 0 0
+        %504 = OpFunctionCall %int %tint_f16_to_i32 %503
+        %505 = OpBitcast %uint %502
+        %506 = OpBitcast %uint %504
+        %507 = OpIAdd %uint %505 %506
+        %508 = OpBitcast %int %507
+        %509 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %510 = OpFunctionCall %int %tint_f16_to_i32 %509
+        %511 = OpBitcast %uint %508
+        %512 = OpBitcast %uint %510
+        %513 = OpIAdd %uint %511 %512
+        %514 = OpBitcast %int %513
+        %515 = OpCompositeExtract %half %mat3x4_f16 0 0
+        %516 = OpFunctionCall %int %tint_f16_to_i32 %515
+        %517 = OpBitcast %uint %514
+        %518 = OpBitcast %uint %516
+        %519 = OpIAdd %uint %517 %518
+        %520 = OpBitcast %int %519
+        %521 = OpCompositeExtract %half %mat4x2_f16 0 0
+        %522 = OpFunctionCall %int %tint_f16_to_i32 %521
+        %523 = OpBitcast %uint %520
+        %524 = OpBitcast %uint %522
+        %525 = OpIAdd %uint %523 %524
+        %526 = OpBitcast %int %525
+        %527 = OpCompositeExtract %half %mat4x3_f16 0 0
+        %528 = OpFunctionCall %int %tint_f16_to_i32 %527
+        %529 = OpBitcast %uint %526
+        %530 = OpBitcast %uint %528
+        %531 = OpIAdd %uint %529 %530
+        %532 = OpBitcast %int %531
+        %533 = OpCompositeExtract %half %mat4x4_f16 0 0
+        %534 = OpFunctionCall %int %tint_f16_to_i32 %533
+        %535 = OpBitcast %uint %532
+        %536 = OpBitcast %uint %534
+        %537 = OpIAdd %uint %535 %536
+        %538 = OpBitcast %int %537
+        %539 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %540 = OpFunctionCall %int %tint_f32_to_i32 %539
+        %541 = OpBitcast %uint %538
+        %542 = OpBitcast %uint %540
+        %543 = OpIAdd %uint %541 %542
+        %544 = OpBitcast %int %543
+        %545 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
+        %546 = OpFunctionCall %int %tint_f16_to_i32 %545
+        %547 = OpBitcast %uint %544
+        %548 = OpBitcast %uint %546
+        %549 = OpIAdd %uint %547 %548
+        %550 = OpBitcast %int %549
+        %551 = OpAccessChain %_ptr_StorageBuffer_int %31 %uint_0
+               OpStore %551 %550 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %463
+%tint_f32_to_i32 = OpFunction %int None %568
       %value = OpFunctionParameter %float
-        %464 = OpLabel
-        %465 = OpExtInst %float %42 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %468 = OpConvertFToS %int %465
-               OpReturnValue %468
+        %569 = OpLabel
+        %570 = OpExtInst %float %42 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %573 = OpConvertFToS %int %570
+               OpReturnValue %573
                OpFunctionEnd
-%tint_f16_to_i32 = OpFunction %int None %470
+%tint_f16_to_i32 = OpFunction %int None %575
     %value_0 = OpFunctionParameter %half
-        %471 = OpLabel
-        %472 = OpExtInst %half %42 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
-        %475 = OpConvertFToS %int %472
-               OpReturnValue %475
+        %576 = OpLabel
+        %577 = OpExtInst %half %42 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
+        %580 = OpConvertFToS %int %577
+               OpReturnValue %580
                OpFunctionEnd
-       %main = OpFunction %void None %477
-        %478 = OpLabel
-        %479 = OpLoad %uint %main_local_invocation_index_Input None
-        %480 = OpFunctionCall %void %main_inner %479
+       %main = OpFunction %void None %582
+        %583 = OpLabel
+        %584 = OpLoad %uint %main_local_invocation_index_Input None
+        %585 = OpFunctionCall %void %main_inner %584
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %482
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %587
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %483 = OpLabel
-        %484 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %486 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %488
-               OpStore %484 %tint_source
-               OpBranch %489
-        %489 = OpLabel
-               OpBranch %492
-        %492 = OpLabel
-        %494 = OpPhi %uint %uint_0 %489 %495 %491
-               OpLoopMerge %493 %491 None
-               OpBranch %490
-        %490 = OpLabel
-        %497 = OpUGreaterThanEqual %bool %494 %uint_2
-               OpSelectionMerge %498 None
-               OpBranchConditional %497 %499 %498
-        %499 = OpLabel
-               OpBranch %493
-        %498 = OpLabel
-        %500 = OpAccessChain %_ptr_Function_v3float %484 %494
-        %502 = OpLoad %v3float %500 None
-        %503 = OpAccessChain %_ptr_Function_v3float %486 %494
-               OpStore %503 %502 None
-               OpBranch %491
-        %491 = OpLabel
-        %495 = OpIAdd %uint %494 %uint_1
-               OpBranch %492
-        %493 = OpLabel
-        %496 = OpLoad %_arr_v3float_uint_2_0 %486 None
-               OpReturnValue %496
+        %588 = OpLabel
+        %589 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %591 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %593
+               OpStore %589 %tint_source
+               OpBranch %594
+        %594 = OpLabel
+               OpBranch %597
+        %597 = OpLabel
+        %599 = OpPhi %uint %uint_0 %594 %600 %596
+               OpLoopMerge %598 %596 None
+               OpBranch %595
+        %595 = OpLabel
+        %602 = OpUGreaterThanEqual %bool %599 %uint_2
+               OpSelectionMerge %603 None
+               OpBranchConditional %602 %604 %603
+        %604 = OpLabel
+               OpBranch %598
+        %603 = OpLabel
+        %605 = OpAccessChain %_ptr_Function_v3float %589 %599
+        %607 = OpLoad %v3float %605 None
+        %608 = OpAccessChain %_ptr_Function_v3float %591 %599
+               OpStore %608 %607 None
+               OpBranch %596
+        %596 = OpLabel
+        %600 = OpIAdd %uint %599 %uint_1
+               OpBranch %597
+        %598 = OpLabel
+        %601 = OpLoad %_arr_v3float_uint_2_0 %591 None
+               OpReturnValue %601
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4x2_f16_std140_uint_2_0 None %505
+%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4x2_f16_std140_uint_2_0 None %610
 %tint_source_0 = OpFunctionParameter %_arr_mat4x2_f16_std140_uint_2
-        %506 = OpLabel
-        %507 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2 Function
-        %509 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2_0 Function %510
-               OpStore %507 %tint_source_0
-               OpBranch %511
-        %511 = OpLabel
-               OpBranch %514
-        %514 = OpLabel
-        %516 = OpPhi %uint %uint_0 %511 %517 %513
-               OpLoopMerge %515 %513 None
-               OpBranch %512
-        %512 = OpLabel
-        %519 = OpUGreaterThanEqual %bool %516 %uint_2
-               OpSelectionMerge %520 None
-               OpBranchConditional %519 %521 %520
-        %521 = OpLabel
-               OpBranch %515
-        %520 = OpLabel
-        %522 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %507 %516
-        %523 = OpLoad %mat4x2_f16_std140 %522 None
-        %524 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %509 %516
-               OpStore %524 %523 None
-               OpBranch %513
-        %513 = OpLabel
-        %517 = OpIAdd %uint %516 %uint_1
-               OpBranch %514
-        %515 = OpLabel
-        %518 = OpLoad %_arr_mat4x2_f16_std140_uint_2_0 %509 None
-               OpReturnValue %518
+        %611 = OpLabel
+        %612 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2 Function
+        %614 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2_0 Function %615
+               OpStore %612 %tint_source_0
+               OpBranch %616
+        %616 = OpLabel
+               OpBranch %619
+        %619 = OpLabel
+        %621 = OpPhi %uint %uint_0 %616 %622 %618
+               OpLoopMerge %620 %618 None
+               OpBranch %617
+        %617 = OpLabel
+        %624 = OpUGreaterThanEqual %bool %621 %uint_2
+               OpSelectionMerge %625 None
+               OpBranchConditional %624 %626 %625
+        %626 = OpLabel
+               OpBranch %620
+        %625 = OpLabel
+        %627 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %612 %621
+        %628 = OpLoad %mat4x2_f16_std140 %627 None
+        %629 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %614 %621
+               OpStore %629 %628 None
+               OpBranch %618
+        %618 = OpLabel
+        %622 = OpIAdd %uint %621 %uint_1
+               OpBranch %619
+        %620 = OpLabel
+        %623 = OpLoad %_arr_mat4x2_f16_std140_uint_2_0 %614 None
+               OpReturnValue %623
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl b/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl
index a158c11..57ab07f 100644
--- a/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl
@@ -105,22 +105,62 @@
   vec3 arr2_vec3_f32[2] = v.inner.arr2_vec3_f32;
   Inner struct_inner = v.inner.struct_inner;
   Inner array_struct_inner[4] = v.inner.array_struct_inner;
-  int v_2 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_3 = (v_2 + int(scalar_u32));
-  int v_4 = ((v_3 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_5 = (v_4 + int(vec2_u32.x));
-  int v_6 = ((v_5 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_7 = (v_6 + int(vec3_u32.y));
-  int v_8 = ((v_7 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_9 = (v_8 + int(vec4_u32.z));
-  int v_10 = (v_9 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_11 = (v_10 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_12 = (v_11 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_13 = (v_12 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_14 = (v_13 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_15 = (v_14 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_16 = (v_15 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_17 = (v_16 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_18 = (v_17 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  v_1.inner = (((v_18 + tint_f32_to_i32(arr2_vec3_f32[0u].x)) + struct_inner.scalar_i32) + array_struct_inner[0u].scalar_i32);
+  uint v_2 = uint(tint_f32_to_i32(scalar_f32));
+  int v_3 = int((v_2 + uint(scalar_i32)));
+  int v_4 = int(scalar_u32);
+  uint v_5 = uint(v_3);
+  int v_6 = int((v_5 + uint(v_4)));
+  int v_7 = tint_f32_to_i32(vec2_f32.x);
+  uint v_8 = uint(v_6);
+  uint v_9 = uint(int((v_8 + uint(v_7))));
+  int v_10 = int((v_9 + uint(vec2_i32.x)));
+  int v_11 = int(vec2_u32.x);
+  uint v_12 = uint(v_10);
+  int v_13 = int((v_12 + uint(v_11)));
+  int v_14 = tint_f32_to_i32(vec3_f32.y);
+  uint v_15 = uint(v_13);
+  uint v_16 = uint(int((v_15 + uint(v_14))));
+  int v_17 = int((v_16 + uint(vec3_i32.y)));
+  int v_18 = int(vec3_u32.y);
+  uint v_19 = uint(v_17);
+  int v_20 = int((v_19 + uint(v_18)));
+  int v_21 = tint_f32_to_i32(vec4_f32.z);
+  uint v_22 = uint(v_20);
+  uint v_23 = uint(int((v_22 + uint(v_21))));
+  int v_24 = int((v_23 + uint(vec4_i32.z)));
+  int v_25 = int(vec4_u32.z);
+  uint v_26 = uint(v_24);
+  int v_27 = int((v_26 + uint(v_25)));
+  int v_28 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_29 = uint(v_27);
+  int v_30 = int((v_29 + uint(v_28)));
+  int v_31 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_32 = uint(v_30);
+  int v_33 = int((v_32 + uint(v_31)));
+  int v_34 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_35 = uint(v_33);
+  int v_36 = int((v_35 + uint(v_34)));
+  int v_37 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_38 = uint(v_36);
+  int v_39 = int((v_38 + uint(v_37)));
+  int v_40 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_41 = uint(v_39);
+  int v_42 = int((v_41 + uint(v_40)));
+  int v_43 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_44 = uint(v_42);
+  int v_45 = int((v_44 + uint(v_43)));
+  int v_46 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_47 = uint(v_45);
+  int v_48 = int((v_47 + uint(v_46)));
+  int v_49 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_50 = uint(v_48);
+  int v_51 = int((v_50 + uint(v_49)));
+  int v_52 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_53 = uint(v_51);
+  int v_54 = int((v_53 + uint(v_52)));
+  int v_55 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_56 = uint(v_54);
+  uint v_57 = uint(int((v_56 + uint(v_55))));
+  uint v_58 = uint(int((v_57 + uint(struct_inner.scalar_i32))));
+  v_1.inner = int((v_58 + uint(array_struct_inner[0u].scalar_i32)));
 }
diff --git a/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm b/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm
index d26c0eb..3bb46cf 100644
--- a/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 294
+; Bound: 363
 ; Schema: 0
                OpCapability Shader
-        %243 = OpExtInstImport "GLSL.std.450"
+        %312 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
@@ -229,19 +229,19 @@
     %uint_35 = OpConstant %uint 35
 %_arr_Inner_uint_4_0 = OpTypeArray %Inner %uint_4
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-        %240 = OpTypeFunction %int %float
+        %309 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %248 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %317 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %254 = OpConstantNull %_arr_v3float_uint_2_0
+        %323 = OpConstantNull %_arr_v3float_uint_2_0
        %bool = OpTypeBool
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-        %272 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
+        %341 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4_0 = OpTypePointer Function %_arr_Inner_uint_4_0
-        %278 = OpConstantNull %_arr_Inner_uint_4_0
+        %347 = OpConstantNull %_arr_Inner_uint_4_0
 %_ptr_Function_Inner = OpTypePointer Function %Inner
        %main = OpFunction %void None %30
          %31 = OpLabel
@@ -326,139 +326,208 @@
         %170 = OpLoad %_arr_Inner_uint_4 %167 None
 %array_struct_inner = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout_0 %170
         %174 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %176 = OpIAdd %int %174 %scalar_i32
-        %177 = OpBitcast %int %scalar_u32
-        %178 = OpIAdd %int %176 %177
-        %179 = OpCompositeExtract %float %vec2_f32 0
-        %180 = OpFunctionCall %int %tint_f32_to_i32 %179
-        %181 = OpIAdd %int %178 %180
-        %182 = OpCompositeExtract %int %vec2_i32 0
-        %183 = OpIAdd %int %181 %182
-        %184 = OpCompositeExtract %uint %vec2_u32 0
-        %185 = OpBitcast %int %184
-        %186 = OpIAdd %int %183 %185
-        %187 = OpCompositeExtract %float %vec3_f32 1
-        %188 = OpFunctionCall %int %tint_f32_to_i32 %187
-        %189 = OpIAdd %int %186 %188
-        %190 = OpCompositeExtract %int %vec3_i32 1
-        %191 = OpIAdd %int %189 %190
-        %192 = OpCompositeExtract %uint %vec3_u32 1
-        %193 = OpBitcast %int %192
-        %194 = OpIAdd %int %191 %193
-        %195 = OpCompositeExtract %float %vec4_f32 2
-        %196 = OpFunctionCall %int %tint_f32_to_i32 %195
-        %197 = OpIAdd %int %194 %196
-        %198 = OpCompositeExtract %int %vec4_i32 2
-        %199 = OpIAdd %int %197 %198
-        %200 = OpCompositeExtract %uint %vec4_u32 2
+        %176 = OpBitcast %uint %174
+        %177 = OpBitcast %uint %scalar_i32
+        %178 = OpIAdd %uint %176 %177
+        %179 = OpBitcast %int %178
+        %180 = OpBitcast %int %scalar_u32
+        %181 = OpBitcast %uint %179
+        %182 = OpBitcast %uint %180
+        %183 = OpIAdd %uint %181 %182
+        %184 = OpBitcast %int %183
+        %185 = OpCompositeExtract %float %vec2_f32 0
+        %186 = OpFunctionCall %int %tint_f32_to_i32 %185
+        %187 = OpBitcast %uint %184
+        %188 = OpBitcast %uint %186
+        %189 = OpIAdd %uint %187 %188
+        %190 = OpBitcast %int %189
+        %191 = OpCompositeExtract %int %vec2_i32 0
+        %192 = OpBitcast %uint %190
+        %193 = OpBitcast %uint %191
+        %194 = OpIAdd %uint %192 %193
+        %195 = OpBitcast %int %194
+        %196 = OpCompositeExtract %uint %vec2_u32 0
+        %197 = OpBitcast %int %196
+        %198 = OpBitcast %uint %195
+        %199 = OpBitcast %uint %197
+        %200 = OpIAdd %uint %198 %199
         %201 = OpBitcast %int %200
-        %202 = OpIAdd %int %199 %201
-        %203 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %204 = OpFunctionCall %int %tint_f32_to_i32 %203
-        %205 = OpIAdd %int %202 %204
-        %206 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %207 = OpFunctionCall %int %tint_f32_to_i32 %206
-        %208 = OpIAdd %int %205 %207
-        %209 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %210 = OpFunctionCall %int %tint_f32_to_i32 %209
-        %211 = OpIAdd %int %208 %210
-        %212 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %213 = OpFunctionCall %int %tint_f32_to_i32 %212
-        %214 = OpIAdd %int %211 %213
-        %215 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %216 = OpFunctionCall %int %tint_f32_to_i32 %215
-        %217 = OpIAdd %int %214 %216
-        %218 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %219 = OpFunctionCall %int %tint_f32_to_i32 %218
-        %220 = OpIAdd %int %217 %219
-        %221 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %222 = OpFunctionCall %int %tint_f32_to_i32 %221
-        %223 = OpIAdd %int %220 %222
-        %224 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %225 = OpFunctionCall %int %tint_f32_to_i32 %224
-        %226 = OpIAdd %int %223 %225
-        %227 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %228 = OpFunctionCall %int %tint_f32_to_i32 %227
-        %229 = OpIAdd %int %226 %228
-        %230 = OpCompositeExtract %float %arr2_vec3_f32 0 0
-        %231 = OpFunctionCall %int %tint_f32_to_i32 %230
-        %232 = OpIAdd %int %229 %231
-        %233 = OpCompositeExtract %int %struct_inner 0
-        %234 = OpIAdd %int %232 %233
-        %235 = OpCompositeExtract %int %array_struct_inner 0 0
-        %236 = OpIAdd %int %234 %235
-        %237 = OpAccessChain %_ptr_StorageBuffer_int %25 %uint_0
-               OpStore %237 %236 None
+        %202 = OpCompositeExtract %float %vec3_f32 1
+        %203 = OpFunctionCall %int %tint_f32_to_i32 %202
+        %204 = OpBitcast %uint %201
+        %205 = OpBitcast %uint %203
+        %206 = OpIAdd %uint %204 %205
+        %207 = OpBitcast %int %206
+        %208 = OpCompositeExtract %int %vec3_i32 1
+        %209 = OpBitcast %uint %207
+        %210 = OpBitcast %uint %208
+        %211 = OpIAdd %uint %209 %210
+        %212 = OpBitcast %int %211
+        %213 = OpCompositeExtract %uint %vec3_u32 1
+        %214 = OpBitcast %int %213
+        %215 = OpBitcast %uint %212
+        %216 = OpBitcast %uint %214
+        %217 = OpIAdd %uint %215 %216
+        %218 = OpBitcast %int %217
+        %219 = OpCompositeExtract %float %vec4_f32 2
+        %220 = OpFunctionCall %int %tint_f32_to_i32 %219
+        %221 = OpBitcast %uint %218
+        %222 = OpBitcast %uint %220
+        %223 = OpIAdd %uint %221 %222
+        %224 = OpBitcast %int %223
+        %225 = OpCompositeExtract %int %vec4_i32 2
+        %226 = OpBitcast %uint %224
+        %227 = OpBitcast %uint %225
+        %228 = OpIAdd %uint %226 %227
+        %229 = OpBitcast %int %228
+        %230 = OpCompositeExtract %uint %vec4_u32 2
+        %231 = OpBitcast %int %230
+        %232 = OpBitcast %uint %229
+        %233 = OpBitcast %uint %231
+        %234 = OpIAdd %uint %232 %233
+        %235 = OpBitcast %int %234
+        %236 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %237 = OpFunctionCall %int %tint_f32_to_i32 %236
+        %238 = OpBitcast %uint %235
+        %239 = OpBitcast %uint %237
+        %240 = OpIAdd %uint %238 %239
+        %241 = OpBitcast %int %240
+        %242 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %243 = OpFunctionCall %int %tint_f32_to_i32 %242
+        %244 = OpBitcast %uint %241
+        %245 = OpBitcast %uint %243
+        %246 = OpIAdd %uint %244 %245
+        %247 = OpBitcast %int %246
+        %248 = OpCompositeExtract %float %mat2x4_f32 0 0
+        %249 = OpFunctionCall %int %tint_f32_to_i32 %248
+        %250 = OpBitcast %uint %247
+        %251 = OpBitcast %uint %249
+        %252 = OpIAdd %uint %250 %251
+        %253 = OpBitcast %int %252
+        %254 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %255 = OpFunctionCall %int %tint_f32_to_i32 %254
+        %256 = OpBitcast %uint %253
+        %257 = OpBitcast %uint %255
+        %258 = OpIAdd %uint %256 %257
+        %259 = OpBitcast %int %258
+        %260 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %261 = OpFunctionCall %int %tint_f32_to_i32 %260
+        %262 = OpBitcast %uint %259
+        %263 = OpBitcast %uint %261
+        %264 = OpIAdd %uint %262 %263
+        %265 = OpBitcast %int %264
+        %266 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %267 = OpFunctionCall %int %tint_f32_to_i32 %266
+        %268 = OpBitcast %uint %265
+        %269 = OpBitcast %uint %267
+        %270 = OpIAdd %uint %268 %269
+        %271 = OpBitcast %int %270
+        %272 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %273 = OpFunctionCall %int %tint_f32_to_i32 %272
+        %274 = OpBitcast %uint %271
+        %275 = OpBitcast %uint %273
+        %276 = OpIAdd %uint %274 %275
+        %277 = OpBitcast %int %276
+        %278 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %279 = OpFunctionCall %int %tint_f32_to_i32 %278
+        %280 = OpBitcast %uint %277
+        %281 = OpBitcast %uint %279
+        %282 = OpIAdd %uint %280 %281
+        %283 = OpBitcast %int %282
+        %284 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %285 = OpFunctionCall %int %tint_f32_to_i32 %284
+        %286 = OpBitcast %uint %283
+        %287 = OpBitcast %uint %285
+        %288 = OpIAdd %uint %286 %287
+        %289 = OpBitcast %int %288
+        %290 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %291 = OpFunctionCall %int %tint_f32_to_i32 %290
+        %292 = OpBitcast %uint %289
+        %293 = OpBitcast %uint %291
+        %294 = OpIAdd %uint %292 %293
+        %295 = OpBitcast %int %294
+        %296 = OpCompositeExtract %int %struct_inner 0
+        %297 = OpBitcast %uint %295
+        %298 = OpBitcast %uint %296
+        %299 = OpIAdd %uint %297 %298
+        %300 = OpBitcast %int %299
+        %301 = OpCompositeExtract %int %array_struct_inner 0 0
+        %302 = OpBitcast %uint %300
+        %303 = OpBitcast %uint %301
+        %304 = OpIAdd %uint %302 %303
+        %305 = OpBitcast %int %304
+        %306 = OpAccessChain %_ptr_StorageBuffer_int %25 %uint_0
+               OpStore %306 %305 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %240
+%tint_f32_to_i32 = OpFunction %int None %309
       %value = OpFunctionParameter %float
-        %241 = OpLabel
-        %242 = OpExtInst %float %243 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %246 = OpConvertFToS %int %242
-               OpReturnValue %246
+        %310 = OpLabel
+        %311 = OpExtInst %float %312 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %315 = OpConvertFToS %int %311
+               OpReturnValue %315
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %248
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %317
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %249 = OpLabel
-        %250 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %252 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %254
-               OpStore %250 %tint_source
-               OpBranch %255
-        %255 = OpLabel
-               OpBranch %258
-        %258 = OpLabel
-        %260 = OpPhi %uint %uint_0 %255 %261 %257
-               OpLoopMerge %259 %257 None
-               OpBranch %256
-        %256 = OpLabel
-        %263 = OpUGreaterThanEqual %bool %260 %uint_2
-               OpSelectionMerge %265 None
-               OpBranchConditional %263 %266 %265
-        %266 = OpLabel
-               OpBranch %259
-        %265 = OpLabel
-        %267 = OpAccessChain %_ptr_Function_v3float %250 %260
-        %269 = OpLoad %v3float %267 None
-        %270 = OpAccessChain %_ptr_Function_v3float %252 %260
-               OpStore %270 %269 None
-               OpBranch %257
-        %257 = OpLabel
-        %261 = OpIAdd %uint %260 %uint_1
-               OpBranch %258
-        %259 = OpLabel
-        %262 = OpLoad %_arr_v3float_uint_2_0 %252 None
-               OpReturnValue %262
+        %318 = OpLabel
+        %319 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %321 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %323
+               OpStore %319 %tint_source
+               OpBranch %324
+        %324 = OpLabel
+               OpBranch %327
+        %327 = OpLabel
+        %329 = OpPhi %uint %uint_0 %324 %330 %326
+               OpLoopMerge %328 %326 None
+               OpBranch %325
+        %325 = OpLabel
+        %332 = OpUGreaterThanEqual %bool %329 %uint_2
+               OpSelectionMerge %334 None
+               OpBranchConditional %332 %335 %334
+        %335 = OpLabel
+               OpBranch %328
+        %334 = OpLabel
+        %336 = OpAccessChain %_ptr_Function_v3float %319 %329
+        %338 = OpLoad %v3float %336 None
+        %339 = OpAccessChain %_ptr_Function_v3float %321 %329
+               OpStore %339 %338 None
+               OpBranch %326
+        %326 = OpLabel
+        %330 = OpIAdd %uint %329 %uint_1
+               OpBranch %327
+        %328 = OpLabel
+        %331 = OpLoad %_arr_v3float_uint_2_0 %321 None
+               OpReturnValue %331
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %_arr_Inner_uint_4_0 None %272
+%tint_convert_explicit_layout_0 = OpFunction %_arr_Inner_uint_4_0 None %341
 %tint_source_0 = OpFunctionParameter %_arr_Inner_uint_4
-        %273 = OpLabel
-        %274 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
-        %276 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %278
-               OpStore %274 %tint_source_0
-               OpBranch %279
-        %279 = OpLabel
-               OpBranch %282
-        %282 = OpLabel
-        %284 = OpPhi %uint %uint_0 %279 %285 %281
-               OpLoopMerge %283 %281 None
-               OpBranch %280
-        %280 = OpLabel
-        %287 = OpUGreaterThanEqual %bool %284 %uint_4
-               OpSelectionMerge %288 None
-               OpBranchConditional %287 %289 %288
-        %289 = OpLabel
-               OpBranch %283
-        %288 = OpLabel
-        %290 = OpAccessChain %_ptr_Function_Inner %274 %284
-        %292 = OpLoad %Inner %290 None
-        %293 = OpAccessChain %_ptr_Function_Inner %276 %284
-               OpStore %293 %292 None
-               OpBranch %281
-        %281 = OpLabel
-        %285 = OpIAdd %uint %284 %uint_1
-               OpBranch %282
-        %283 = OpLabel
-        %286 = OpLoad %_arr_Inner_uint_4_0 %276 None
-               OpReturnValue %286
+        %342 = OpLabel
+        %343 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
+        %345 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %347
+               OpStore %343 %tint_source_0
+               OpBranch %348
+        %348 = OpLabel
+               OpBranch %351
+        %351 = OpLabel
+        %353 = OpPhi %uint %uint_0 %348 %354 %350
+               OpLoopMerge %352 %350 None
+               OpBranch %349
+        %349 = OpLabel
+        %356 = OpUGreaterThanEqual %bool %353 %uint_4
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %357
+        %358 = OpLabel
+               OpBranch %352
+        %357 = OpLabel
+        %359 = OpAccessChain %_ptr_Function_Inner %343 %353
+        %361 = OpLoad %Inner %359 None
+        %362 = OpAccessChain %_ptr_Function_Inner %345 %353
+               OpStore %362 %361 None
+               OpBranch %350
+        %350 = OpLabel
+        %354 = OpIAdd %uint %353 %uint_1
+               OpBranch %351
+        %352 = OpLabel
+        %355 = OpLoad %_arr_Inner_uint_4_0 %345 None
+               OpReturnValue %355
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.glsl b/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.glsl
index b794383..b6a229d 100644
--- a/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.glsl
@@ -180,36 +180,104 @@
   f16mat4x2 arr2_mat4x2_f16[2] = v_3;
   Inner struct_inner = v.inner.struct_inner;
   Inner array_struct_inner[4] = v.inner.array_struct_inner;
-  int v_6 = (tint_f32_to_i32(scalar_f32) + scalar_i32);
-  int v_7 = (v_6 + int(scalar_u32));
-  int v_8 = (v_7 + tint_f16_to_i32(scalar_f16));
-  int v_9 = ((v_8 + tint_f32_to_i32(vec2_f32.x)) + vec2_i32.x);
-  int v_10 = (v_9 + int(vec2_u32.x));
-  int v_11 = (v_10 + tint_f16_to_i32(vec2_f16.x));
-  int v_12 = ((v_11 + tint_f32_to_i32(vec3_f32.y)) + vec3_i32.y);
-  int v_13 = (v_12 + int(vec3_u32.y));
-  int v_14 = (v_13 + tint_f16_to_i32(vec3_f16.y));
-  int v_15 = ((v_14 + tint_f32_to_i32(vec4_f32.z)) + vec4_i32.z);
-  int v_16 = (v_15 + int(vec4_u32.z));
-  int v_17 = (v_16 + tint_f16_to_i32(vec4_f16.z));
-  int v_18 = (v_17 + tint_f32_to_i32(mat2x2_f32[0u].x));
-  int v_19 = (v_18 + tint_f32_to_i32(mat2x3_f32[0u].x));
-  int v_20 = (v_19 + tint_f32_to_i32(mat2x4_f32[0u].x));
-  int v_21 = (v_20 + tint_f32_to_i32(mat3x2_f32[0u].x));
-  int v_22 = (v_21 + tint_f32_to_i32(mat3x3_f32[0u].x));
-  int v_23 = (v_22 + tint_f32_to_i32(mat3x4_f32[0u].x));
-  int v_24 = (v_23 + tint_f32_to_i32(mat4x2_f32[0u].x));
-  int v_25 = (v_24 + tint_f32_to_i32(mat4x3_f32[0u].x));
-  int v_26 = (v_25 + tint_f32_to_i32(mat4x4_f32[0u].x));
-  int v_27 = (v_26 + tint_f16_to_i32(mat2x2_f16[0u].x));
-  int v_28 = (v_27 + tint_f16_to_i32(mat2x3_f16[0u].x));
-  int v_29 = (v_28 + tint_f16_to_i32(mat2x4_f16[0u].x));
-  int v_30 = (v_29 + tint_f16_to_i32(mat3x2_f16[0u].x));
-  int v_31 = (v_30 + tint_f16_to_i32(mat3x3_f16[0u].x));
-  int v_32 = (v_31 + tint_f16_to_i32(mat3x4_f16[0u].x));
-  int v_33 = (v_32 + tint_f16_to_i32(mat4x2_f16[0u].x));
-  int v_34 = (v_33 + tint_f16_to_i32(mat4x3_f16[0u].x));
-  int v_35 = (v_34 + tint_f16_to_i32(mat4x4_f16[0u].x));
-  int v_36 = (v_35 + tint_f32_to_i32(arr2_vec3_f32[0u].x));
-  v_1.inner = (((v_36 + tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x)) + struct_inner.scalar_i32) + array_struct_inner[0u].scalar_i32);
+  uint v_6 = uint(tint_f32_to_i32(scalar_f32));
+  int v_7 = int((v_6 + uint(scalar_i32)));
+  int v_8 = int(scalar_u32);
+  uint v_9 = uint(v_7);
+  int v_10 = int((v_9 + uint(v_8)));
+  int v_11 = tint_f16_to_i32(scalar_f16);
+  uint v_12 = uint(v_10);
+  int v_13 = int((v_12 + uint(v_11)));
+  int v_14 = tint_f32_to_i32(vec2_f32.x);
+  uint v_15 = uint(v_13);
+  uint v_16 = uint(int((v_15 + uint(v_14))));
+  int v_17 = int((v_16 + uint(vec2_i32.x)));
+  int v_18 = int(vec2_u32.x);
+  uint v_19 = uint(v_17);
+  int v_20 = int((v_19 + uint(v_18)));
+  int v_21 = tint_f16_to_i32(vec2_f16.x);
+  uint v_22 = uint(v_20);
+  int v_23 = int((v_22 + uint(v_21)));
+  int v_24 = tint_f32_to_i32(vec3_f32.y);
+  uint v_25 = uint(v_23);
+  uint v_26 = uint(int((v_25 + uint(v_24))));
+  int v_27 = int((v_26 + uint(vec3_i32.y)));
+  int v_28 = int(vec3_u32.y);
+  uint v_29 = uint(v_27);
+  int v_30 = int((v_29 + uint(v_28)));
+  int v_31 = tint_f16_to_i32(vec3_f16.y);
+  uint v_32 = uint(v_30);
+  int v_33 = int((v_32 + uint(v_31)));
+  int v_34 = tint_f32_to_i32(vec4_f32.z);
+  uint v_35 = uint(v_33);
+  uint v_36 = uint(int((v_35 + uint(v_34))));
+  int v_37 = int((v_36 + uint(vec4_i32.z)));
+  int v_38 = int(vec4_u32.z);
+  uint v_39 = uint(v_37);
+  int v_40 = int((v_39 + uint(v_38)));
+  int v_41 = tint_f16_to_i32(vec4_f16.z);
+  uint v_42 = uint(v_40);
+  int v_43 = int((v_42 + uint(v_41)));
+  int v_44 = tint_f32_to_i32(mat2x2_f32[0u].x);
+  uint v_45 = uint(v_43);
+  int v_46 = int((v_45 + uint(v_44)));
+  int v_47 = tint_f32_to_i32(mat2x3_f32[0u].x);
+  uint v_48 = uint(v_46);
+  int v_49 = int((v_48 + uint(v_47)));
+  int v_50 = tint_f32_to_i32(mat2x4_f32[0u].x);
+  uint v_51 = uint(v_49);
+  int v_52 = int((v_51 + uint(v_50)));
+  int v_53 = tint_f32_to_i32(mat3x2_f32[0u].x);
+  uint v_54 = uint(v_52);
+  int v_55 = int((v_54 + uint(v_53)));
+  int v_56 = tint_f32_to_i32(mat3x3_f32[0u].x);
+  uint v_57 = uint(v_55);
+  int v_58 = int((v_57 + uint(v_56)));
+  int v_59 = tint_f32_to_i32(mat3x4_f32[0u].x);
+  uint v_60 = uint(v_58);
+  int v_61 = int((v_60 + uint(v_59)));
+  int v_62 = tint_f32_to_i32(mat4x2_f32[0u].x);
+  uint v_63 = uint(v_61);
+  int v_64 = int((v_63 + uint(v_62)));
+  int v_65 = tint_f32_to_i32(mat4x3_f32[0u].x);
+  uint v_66 = uint(v_64);
+  int v_67 = int((v_66 + uint(v_65)));
+  int v_68 = tint_f32_to_i32(mat4x4_f32[0u].x);
+  uint v_69 = uint(v_67);
+  int v_70 = int((v_69 + uint(v_68)));
+  int v_71 = tint_f16_to_i32(mat2x2_f16[0u].x);
+  uint v_72 = uint(v_70);
+  int v_73 = int((v_72 + uint(v_71)));
+  int v_74 = tint_f16_to_i32(mat2x3_f16[0u].x);
+  uint v_75 = uint(v_73);
+  int v_76 = int((v_75 + uint(v_74)));
+  int v_77 = tint_f16_to_i32(mat2x4_f16[0u].x);
+  uint v_78 = uint(v_76);
+  int v_79 = int((v_78 + uint(v_77)));
+  int v_80 = tint_f16_to_i32(mat3x2_f16[0u].x);
+  uint v_81 = uint(v_79);
+  int v_82 = int((v_81 + uint(v_80)));
+  int v_83 = tint_f16_to_i32(mat3x3_f16[0u].x);
+  uint v_84 = uint(v_82);
+  int v_85 = int((v_84 + uint(v_83)));
+  int v_86 = tint_f16_to_i32(mat3x4_f16[0u].x);
+  uint v_87 = uint(v_85);
+  int v_88 = int((v_87 + uint(v_86)));
+  int v_89 = tint_f16_to_i32(mat4x2_f16[0u].x);
+  uint v_90 = uint(v_88);
+  int v_91 = int((v_90 + uint(v_89)));
+  int v_92 = tint_f16_to_i32(mat4x3_f16[0u].x);
+  uint v_93 = uint(v_91);
+  int v_94 = int((v_93 + uint(v_92)));
+  int v_95 = tint_f16_to_i32(mat4x4_f16[0u].x);
+  uint v_96 = uint(v_94);
+  int v_97 = int((v_96 + uint(v_95)));
+  int v_98 = tint_f32_to_i32(arr2_vec3_f32[0u].x);
+  uint v_99 = uint(v_97);
+  int v_100 = int((v_99 + uint(v_98)));
+  int v_101 = tint_f16_to_i32(arr2_mat4x2_f16[0u][0u].x);
+  uint v_102 = uint(v_100);
+  uint v_103 = uint(int((v_102 + uint(v_101))));
+  uint v_104 = uint(int((v_103 + uint(struct_inner.scalar_i32))));
+  v_1.inner = int((v_104 + uint(array_struct_inner[0u].scalar_i32)));
 }
diff --git a/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.spvasm b/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.spvasm
index e34513b..8ec6478 100644
--- a/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/static_index/read_f16.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 519
+; Bound: 630
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-        %441 = OpExtInstImport "GLSL.std.450"
+        %552 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
@@ -386,24 +386,24 @@
        %bool = OpTypeBool
 %_ptr_Function_mat4v2half = OpTypePointer Function %mat4v2half
 %_ptr_Function_mat4x2_f16_std140 = OpTypePointer Function %mat4x2_f16_std140
-        %438 = OpTypeFunction %int %float
+        %549 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
-        %446 = OpTypeFunction %int %half
+        %557 = OpTypeFunction %int %half
 %half_n0x1_ffcp_15 = OpConstant %half -0x1.ffcp+15
 %half_0x1_ffcp_15 = OpConstant %half 0x1.ffcp+15
-        %453 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
+        %564 = OpTypeFunction %_arr_v3float_uint_2_0 %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
 %_ptr_Function__arr_v3float_uint_2_0 = OpTypePointer Function %_arr_v3float_uint_2_0
-        %459 = OpConstantNull %_arr_v3float_uint_2_0
+        %570 = OpConstantNull %_arr_v3float_uint_2_0
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-        %476 = OpTypeFunction %_arr_mat4x2_f16_std140_uint_2_0 %_arr_mat4x2_f16_std140_uint_2
+        %587 = OpTypeFunction %_arr_mat4x2_f16_std140_uint_2_0 %_arr_mat4x2_f16_std140_uint_2
 %_ptr_Function__arr_mat4x2_f16_std140_uint_2 = OpTypePointer Function %_arr_mat4x2_f16_std140_uint_2
-        %481 = OpConstantNull %_arr_mat4x2_f16_std140_uint_2_0
-        %497 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
+        %592 = OpConstantNull %_arr_mat4x2_f16_std140_uint_2_0
+        %608 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4_0 = OpTypePointer Function %_arr_Inner_uint_4_0
-        %503 = OpConstantNull %_arr_Inner_uint_4_0
+        %614 = OpConstantNull %_arr_Inner_uint_4_0
 %_ptr_Function_Inner = OpTypePointer Function %Inner
        %main = OpFunction %void None %36
          %37 = OpLabel
@@ -567,21 +567,21 @@
                OpLoopMerge %301 %299 None
                OpBranch %298
         %298 = OpLabel
-        %423 = OpUGreaterThanEqual %bool %302 %uint_2
-               OpSelectionMerge %425 None
-               OpBranchConditional %423 %426 %425
-        %426 = OpLabel
+        %534 = OpUGreaterThanEqual %bool %302 %uint_2
+               OpSelectionMerge %536 None
+               OpBranchConditional %534 %537 %536
+        %537 = OpLabel
                OpBranch %301
-        %425 = OpLabel
-        %427 = OpAccessChain %_ptr_Function_mat4v2half %293 %302
-        %429 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %291 %302
-        %431 = OpLoad %mat4x2_f16_std140 %429 None
-        %432 = OpCompositeExtract %v2half %431 0
-        %433 = OpCompositeExtract %v2half %431 1
-        %434 = OpCompositeExtract %v2half %431 2
-        %435 = OpCompositeExtract %v2half %431 3
-        %436 = OpCompositeConstruct %mat4v2half %432 %433 %434 %435
-               OpStore %427 %436 None
+        %536 = OpLabel
+        %538 = OpAccessChain %_ptr_Function_mat4v2half %293 %302
+        %540 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %291 %302
+        %542 = OpLoad %mat4x2_f16_std140 %540 None
+        %543 = OpCompositeExtract %v2half %542 0
+        %544 = OpCompositeExtract %v2half %542 1
+        %545 = OpCompositeExtract %v2half %542 2
+        %546 = OpCompositeExtract %v2half %542 3
+        %547 = OpCompositeConstruct %mat4v2half %543 %544 %545 %546
+               OpStore %538 %547 None
                OpBranch %299
         %299 = OpLabel
         %303 = OpIAdd %uint %302 %uint_1
@@ -594,219 +594,330 @@
         %312 = OpLoad %_arr_Inner_uint_4 %309 None
 %array_struct_inner = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout_1 %312
         %316 = OpFunctionCall %int %tint_f32_to_i32 %scalar_f32
-        %318 = OpIAdd %int %316 %scalar_i32
-        %319 = OpBitcast %int %scalar_u32
-        %320 = OpIAdd %int %318 %319
-        %321 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
-        %323 = OpIAdd %int %320 %321
-        %324 = OpCompositeExtract %float %vec2_f32 0
-        %325 = OpFunctionCall %int %tint_f32_to_i32 %324
-        %326 = OpIAdd %int %323 %325
-        %327 = OpCompositeExtract %int %vec2_i32 0
-        %328 = OpIAdd %int %326 %327
-        %329 = OpCompositeExtract %uint %vec2_u32 0
-        %330 = OpBitcast %int %329
-        %331 = OpIAdd %int %328 %330
-        %332 = OpCompositeExtract %half %vec2_f16 0
-        %333 = OpFunctionCall %int %tint_f16_to_i32 %332
-        %334 = OpIAdd %int %331 %333
-        %335 = OpCompositeExtract %float %vec3_f32 1
-        %336 = OpFunctionCall %int %tint_f32_to_i32 %335
-        %337 = OpIAdd %int %334 %336
-        %338 = OpCompositeExtract %int %vec3_i32 1
-        %339 = OpIAdd %int %337 %338
-        %340 = OpCompositeExtract %uint %vec3_u32 1
-        %341 = OpBitcast %int %340
-        %342 = OpIAdd %int %339 %341
-        %343 = OpCompositeExtract %half %vec3_f16 1
-        %344 = OpFunctionCall %int %tint_f16_to_i32 %343
-        %345 = OpIAdd %int %342 %344
-        %346 = OpCompositeExtract %float %vec4_f32 2
-        %347 = OpFunctionCall %int %tint_f32_to_i32 %346
-        %348 = OpIAdd %int %345 %347
-        %349 = OpCompositeExtract %int %vec4_i32 2
-        %350 = OpIAdd %int %348 %349
-        %351 = OpCompositeExtract %uint %vec4_u32 2
-        %352 = OpBitcast %int %351
-        %353 = OpIAdd %int %350 %352
-        %354 = OpCompositeExtract %half %vec4_f16 2
-        %355 = OpFunctionCall %int %tint_f16_to_i32 %354
-        %356 = OpIAdd %int %353 %355
-        %357 = OpCompositeExtract %float %mat2x2_f32 0 0
-        %358 = OpFunctionCall %int %tint_f32_to_i32 %357
-        %359 = OpIAdd %int %356 %358
-        %360 = OpCompositeExtract %float %mat2x3_f32 0 0
-        %361 = OpFunctionCall %int %tint_f32_to_i32 %360
-        %362 = OpIAdd %int %359 %361
-        %363 = OpCompositeExtract %float %mat2x4_f32 0 0
-        %364 = OpFunctionCall %int %tint_f32_to_i32 %363
-        %365 = OpIAdd %int %362 %364
-        %366 = OpCompositeExtract %float %mat3x2_f32 0 0
-        %367 = OpFunctionCall %int %tint_f32_to_i32 %366
-        %368 = OpIAdd %int %365 %367
-        %369 = OpCompositeExtract %float %mat3x3_f32 0 0
-        %370 = OpFunctionCall %int %tint_f32_to_i32 %369
-        %371 = OpIAdd %int %368 %370
-        %372 = OpCompositeExtract %float %mat3x4_f32 0 0
-        %373 = OpFunctionCall %int %tint_f32_to_i32 %372
-        %374 = OpIAdd %int %371 %373
-        %375 = OpCompositeExtract %float %mat4x2_f32 0 0
-        %376 = OpFunctionCall %int %tint_f32_to_i32 %375
-        %377 = OpIAdd %int %374 %376
-        %378 = OpCompositeExtract %float %mat4x3_f32 0 0
-        %379 = OpFunctionCall %int %tint_f32_to_i32 %378
-        %380 = OpIAdd %int %377 %379
-        %381 = OpCompositeExtract %float %mat4x4_f32 0 0
-        %382 = OpFunctionCall %int %tint_f32_to_i32 %381
-        %383 = OpIAdd %int %380 %382
-        %384 = OpCompositeExtract %half %mat2x2_f16 0 0
-        %385 = OpFunctionCall %int %tint_f16_to_i32 %384
-        %386 = OpIAdd %int %383 %385
-        %387 = OpCompositeExtract %half %mat2x3_f16 0 0
-        %388 = OpFunctionCall %int %tint_f16_to_i32 %387
-        %389 = OpIAdd %int %386 %388
-        %390 = OpCompositeExtract %half %mat2x4_f16 0 0
-        %391 = OpFunctionCall %int %tint_f16_to_i32 %390
-        %392 = OpIAdd %int %389 %391
-        %393 = OpCompositeExtract %half %mat3x2_f16 0 0
-        %394 = OpFunctionCall %int %tint_f16_to_i32 %393
-        %395 = OpIAdd %int %392 %394
-        %396 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %318 = OpBitcast %uint %316
+        %319 = OpBitcast %uint %scalar_i32
+        %320 = OpIAdd %uint %318 %319
+        %321 = OpBitcast %int %320
+        %322 = OpBitcast %int %scalar_u32
+        %323 = OpBitcast %uint %321
+        %324 = OpBitcast %uint %322
+        %325 = OpIAdd %uint %323 %324
+        %326 = OpBitcast %int %325
+        %327 = OpFunctionCall %int %tint_f16_to_i32 %scalar_f16
+        %329 = OpBitcast %uint %326
+        %330 = OpBitcast %uint %327
+        %331 = OpIAdd %uint %329 %330
+        %332 = OpBitcast %int %331
+        %333 = OpCompositeExtract %float %vec2_f32 0
+        %334 = OpFunctionCall %int %tint_f32_to_i32 %333
+        %335 = OpBitcast %uint %332
+        %336 = OpBitcast %uint %334
+        %337 = OpIAdd %uint %335 %336
+        %338 = OpBitcast %int %337
+        %339 = OpCompositeExtract %int %vec2_i32 0
+        %340 = OpBitcast %uint %338
+        %341 = OpBitcast %uint %339
+        %342 = OpIAdd %uint %340 %341
+        %343 = OpBitcast %int %342
+        %344 = OpCompositeExtract %uint %vec2_u32 0
+        %345 = OpBitcast %int %344
+        %346 = OpBitcast %uint %343
+        %347 = OpBitcast %uint %345
+        %348 = OpIAdd %uint %346 %347
+        %349 = OpBitcast %int %348
+        %350 = OpCompositeExtract %half %vec2_f16 0
+        %351 = OpFunctionCall %int %tint_f16_to_i32 %350
+        %352 = OpBitcast %uint %349
+        %353 = OpBitcast %uint %351
+        %354 = OpIAdd %uint %352 %353
+        %355 = OpBitcast %int %354
+        %356 = OpCompositeExtract %float %vec3_f32 1
+        %357 = OpFunctionCall %int %tint_f32_to_i32 %356
+        %358 = OpBitcast %uint %355
+        %359 = OpBitcast %uint %357
+        %360 = OpIAdd %uint %358 %359
+        %361 = OpBitcast %int %360
+        %362 = OpCompositeExtract %int %vec3_i32 1
+        %363 = OpBitcast %uint %361
+        %364 = OpBitcast %uint %362
+        %365 = OpIAdd %uint %363 %364
+        %366 = OpBitcast %int %365
+        %367 = OpCompositeExtract %uint %vec3_u32 1
+        %368 = OpBitcast %int %367
+        %369 = OpBitcast %uint %366
+        %370 = OpBitcast %uint %368
+        %371 = OpIAdd %uint %369 %370
+        %372 = OpBitcast %int %371
+        %373 = OpCompositeExtract %half %vec3_f16 1
+        %374 = OpFunctionCall %int %tint_f16_to_i32 %373
+        %375 = OpBitcast %uint %372
+        %376 = OpBitcast %uint %374
+        %377 = OpIAdd %uint %375 %376
+        %378 = OpBitcast %int %377
+        %379 = OpCompositeExtract %float %vec4_f32 2
+        %380 = OpFunctionCall %int %tint_f32_to_i32 %379
+        %381 = OpBitcast %uint %378
+        %382 = OpBitcast %uint %380
+        %383 = OpIAdd %uint %381 %382
+        %384 = OpBitcast %int %383
+        %385 = OpCompositeExtract %int %vec4_i32 2
+        %386 = OpBitcast %uint %384
+        %387 = OpBitcast %uint %385
+        %388 = OpIAdd %uint %386 %387
+        %389 = OpBitcast %int %388
+        %390 = OpCompositeExtract %uint %vec4_u32 2
+        %391 = OpBitcast %int %390
+        %392 = OpBitcast %uint %389
+        %393 = OpBitcast %uint %391
+        %394 = OpIAdd %uint %392 %393
+        %395 = OpBitcast %int %394
+        %396 = OpCompositeExtract %half %vec4_f16 2
         %397 = OpFunctionCall %int %tint_f16_to_i32 %396
-        %398 = OpIAdd %int %395 %397
-        %399 = OpCompositeExtract %half %mat3x4_f16 0 0
-        %400 = OpFunctionCall %int %tint_f16_to_i32 %399
-        %401 = OpIAdd %int %398 %400
-        %402 = OpCompositeExtract %half %mat4x2_f16 0 0
-        %403 = OpFunctionCall %int %tint_f16_to_i32 %402
-        %404 = OpIAdd %int %401 %403
-        %405 = OpCompositeExtract %half %mat4x3_f16 0 0
-        %406 = OpFunctionCall %int %tint_f16_to_i32 %405
-        %407 = OpIAdd %int %404 %406
-        %408 = OpCompositeExtract %half %mat4x4_f16 0 0
-        %409 = OpFunctionCall %int %tint_f16_to_i32 %408
-        %410 = OpIAdd %int %407 %409
-        %411 = OpCompositeExtract %float %arr2_vec3_f32 0 0
-        %412 = OpFunctionCall %int %tint_f32_to_i32 %411
-        %413 = OpIAdd %int %410 %412
-        %414 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
-        %415 = OpFunctionCall %int %tint_f16_to_i32 %414
-        %416 = OpIAdd %int %413 %415
-        %417 = OpCompositeExtract %int %struct_inner 0
-        %418 = OpIAdd %int %416 %417
-        %419 = OpCompositeExtract %int %array_struct_inner 0 0
-        %420 = OpIAdd %int %418 %419
-        %421 = OpAccessChain %_ptr_StorageBuffer_int %31 %uint_0
-               OpStore %421 %420 None
+        %398 = OpBitcast %uint %395
+        %399 = OpBitcast %uint %397
+        %400 = OpIAdd %uint %398 %399
+        %401 = OpBitcast %int %400
+        %402 = OpCompositeExtract %float %mat2x2_f32 0 0
+        %403 = OpFunctionCall %int %tint_f32_to_i32 %402
+        %404 = OpBitcast %uint %401
+        %405 = OpBitcast %uint %403
+        %406 = OpIAdd %uint %404 %405
+        %407 = OpBitcast %int %406
+        %408 = OpCompositeExtract %float %mat2x3_f32 0 0
+        %409 = OpFunctionCall %int %tint_f32_to_i32 %408
+        %410 = OpBitcast %uint %407
+        %411 = OpBitcast %uint %409
+        %412 = OpIAdd %uint %410 %411
+        %413 = OpBitcast %int %412
+        %414 = OpCompositeExtract %float %mat2x4_f32 0 0
+        %415 = OpFunctionCall %int %tint_f32_to_i32 %414
+        %416 = OpBitcast %uint %413
+        %417 = OpBitcast %uint %415
+        %418 = OpIAdd %uint %416 %417
+        %419 = OpBitcast %int %418
+        %420 = OpCompositeExtract %float %mat3x2_f32 0 0
+        %421 = OpFunctionCall %int %tint_f32_to_i32 %420
+        %422 = OpBitcast %uint %419
+        %423 = OpBitcast %uint %421
+        %424 = OpIAdd %uint %422 %423
+        %425 = OpBitcast %int %424
+        %426 = OpCompositeExtract %float %mat3x3_f32 0 0
+        %427 = OpFunctionCall %int %tint_f32_to_i32 %426
+        %428 = OpBitcast %uint %425
+        %429 = OpBitcast %uint %427
+        %430 = OpIAdd %uint %428 %429
+        %431 = OpBitcast %int %430
+        %432 = OpCompositeExtract %float %mat3x4_f32 0 0
+        %433 = OpFunctionCall %int %tint_f32_to_i32 %432
+        %434 = OpBitcast %uint %431
+        %435 = OpBitcast %uint %433
+        %436 = OpIAdd %uint %434 %435
+        %437 = OpBitcast %int %436
+        %438 = OpCompositeExtract %float %mat4x2_f32 0 0
+        %439 = OpFunctionCall %int %tint_f32_to_i32 %438
+        %440 = OpBitcast %uint %437
+        %441 = OpBitcast %uint %439
+        %442 = OpIAdd %uint %440 %441
+        %443 = OpBitcast %int %442
+        %444 = OpCompositeExtract %float %mat4x3_f32 0 0
+        %445 = OpFunctionCall %int %tint_f32_to_i32 %444
+        %446 = OpBitcast %uint %443
+        %447 = OpBitcast %uint %445
+        %448 = OpIAdd %uint %446 %447
+        %449 = OpBitcast %int %448
+        %450 = OpCompositeExtract %float %mat4x4_f32 0 0
+        %451 = OpFunctionCall %int %tint_f32_to_i32 %450
+        %452 = OpBitcast %uint %449
+        %453 = OpBitcast %uint %451
+        %454 = OpIAdd %uint %452 %453
+        %455 = OpBitcast %int %454
+        %456 = OpCompositeExtract %half %mat2x2_f16 0 0
+        %457 = OpFunctionCall %int %tint_f16_to_i32 %456
+        %458 = OpBitcast %uint %455
+        %459 = OpBitcast %uint %457
+        %460 = OpIAdd %uint %458 %459
+        %461 = OpBitcast %int %460
+        %462 = OpCompositeExtract %half %mat2x3_f16 0 0
+        %463 = OpFunctionCall %int %tint_f16_to_i32 %462
+        %464 = OpBitcast %uint %461
+        %465 = OpBitcast %uint %463
+        %466 = OpIAdd %uint %464 %465
+        %467 = OpBitcast %int %466
+        %468 = OpCompositeExtract %half %mat2x4_f16 0 0
+        %469 = OpFunctionCall %int %tint_f16_to_i32 %468
+        %470 = OpBitcast %uint %467
+        %471 = OpBitcast %uint %469
+        %472 = OpIAdd %uint %470 %471
+        %473 = OpBitcast %int %472
+        %474 = OpCompositeExtract %half %mat3x2_f16 0 0
+        %475 = OpFunctionCall %int %tint_f16_to_i32 %474
+        %476 = OpBitcast %uint %473
+        %477 = OpBitcast %uint %475
+        %478 = OpIAdd %uint %476 %477
+        %479 = OpBitcast %int %478
+        %480 = OpCompositeExtract %half %mat3x3_f16 0 0
+        %481 = OpFunctionCall %int %tint_f16_to_i32 %480
+        %482 = OpBitcast %uint %479
+        %483 = OpBitcast %uint %481
+        %484 = OpIAdd %uint %482 %483
+        %485 = OpBitcast %int %484
+        %486 = OpCompositeExtract %half %mat3x4_f16 0 0
+        %487 = OpFunctionCall %int %tint_f16_to_i32 %486
+        %488 = OpBitcast %uint %485
+        %489 = OpBitcast %uint %487
+        %490 = OpIAdd %uint %488 %489
+        %491 = OpBitcast %int %490
+        %492 = OpCompositeExtract %half %mat4x2_f16 0 0
+        %493 = OpFunctionCall %int %tint_f16_to_i32 %492
+        %494 = OpBitcast %uint %491
+        %495 = OpBitcast %uint %493
+        %496 = OpIAdd %uint %494 %495
+        %497 = OpBitcast %int %496
+        %498 = OpCompositeExtract %half %mat4x3_f16 0 0
+        %499 = OpFunctionCall %int %tint_f16_to_i32 %498
+        %500 = OpBitcast %uint %497
+        %501 = OpBitcast %uint %499
+        %502 = OpIAdd %uint %500 %501
+        %503 = OpBitcast %int %502
+        %504 = OpCompositeExtract %half %mat4x4_f16 0 0
+        %505 = OpFunctionCall %int %tint_f16_to_i32 %504
+        %506 = OpBitcast %uint %503
+        %507 = OpBitcast %uint %505
+        %508 = OpIAdd %uint %506 %507
+        %509 = OpBitcast %int %508
+        %510 = OpCompositeExtract %float %arr2_vec3_f32 0 0
+        %511 = OpFunctionCall %int %tint_f32_to_i32 %510
+        %512 = OpBitcast %uint %509
+        %513 = OpBitcast %uint %511
+        %514 = OpIAdd %uint %512 %513
+        %515 = OpBitcast %int %514
+        %516 = OpCompositeExtract %half %arr2_mat4x2_f16 0 0 0
+        %517 = OpFunctionCall %int %tint_f16_to_i32 %516
+        %518 = OpBitcast %uint %515
+        %519 = OpBitcast %uint %517
+        %520 = OpIAdd %uint %518 %519
+        %521 = OpBitcast %int %520
+        %522 = OpCompositeExtract %int %struct_inner 0
+        %523 = OpBitcast %uint %521
+        %524 = OpBitcast %uint %522
+        %525 = OpIAdd %uint %523 %524
+        %526 = OpBitcast %int %525
+        %527 = OpCompositeExtract %int %array_struct_inner 0 0
+        %528 = OpBitcast %uint %526
+        %529 = OpBitcast %uint %527
+        %530 = OpIAdd %uint %528 %529
+        %531 = OpBitcast %int %530
+        %532 = OpAccessChain %_ptr_StorageBuffer_int %31 %uint_0
+               OpStore %532 %531 None
                OpReturn
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %438
+%tint_f32_to_i32 = OpFunction %int None %549
       %value = OpFunctionParameter %float
-        %439 = OpLabel
-        %440 = OpExtInst %float %441 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %444 = OpConvertFToS %int %440
-               OpReturnValue %444
+        %550 = OpLabel
+        %551 = OpExtInst %float %552 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %555 = OpConvertFToS %int %551
+               OpReturnValue %555
                OpFunctionEnd
-%tint_f16_to_i32 = OpFunction %int None %446
+%tint_f16_to_i32 = OpFunction %int None %557
     %value_0 = OpFunctionParameter %half
-        %447 = OpLabel
-        %448 = OpExtInst %half %441 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
-        %451 = OpConvertFToS %int %448
-               OpReturnValue %451
+        %558 = OpLabel
+        %559 = OpExtInst %half %552 NClamp %value_0 %half_n0x1_ffcp_15 %half_0x1_ffcp_15
+        %562 = OpConvertFToS %int %559
+               OpReturnValue %562
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %453
+%tint_convert_explicit_layout = OpFunction %_arr_v3float_uint_2_0 None %564
 %tint_source = OpFunctionParameter %_arr_v3float_uint_2
-        %454 = OpLabel
-        %455 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
-        %457 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %459
-               OpStore %455 %tint_source
-               OpBranch %460
-        %460 = OpLabel
-               OpBranch %463
-        %463 = OpLabel
-        %465 = OpPhi %uint %uint_0 %460 %466 %462
-               OpLoopMerge %464 %462 None
-               OpBranch %461
-        %461 = OpLabel
-        %468 = OpUGreaterThanEqual %bool %465 %uint_2
-               OpSelectionMerge %469 None
-               OpBranchConditional %468 %470 %469
-        %470 = OpLabel
-               OpBranch %464
-        %469 = OpLabel
-        %471 = OpAccessChain %_ptr_Function_v3float %455 %465
-        %473 = OpLoad %v3float %471 None
-        %474 = OpAccessChain %_ptr_Function_v3float %457 %465
-               OpStore %474 %473 None
-               OpBranch %462
-        %462 = OpLabel
-        %466 = OpIAdd %uint %465 %uint_1
-               OpBranch %463
-        %464 = OpLabel
-        %467 = OpLoad %_arr_v3float_uint_2_0 %457 None
-               OpReturnValue %467
+        %565 = OpLabel
+        %566 = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %568 = OpVariable %_ptr_Function__arr_v3float_uint_2_0 Function %570
+               OpStore %566 %tint_source
+               OpBranch %571
+        %571 = OpLabel
+               OpBranch %574
+        %574 = OpLabel
+        %576 = OpPhi %uint %uint_0 %571 %577 %573
+               OpLoopMerge %575 %573 None
+               OpBranch %572
+        %572 = OpLabel
+        %579 = OpUGreaterThanEqual %bool %576 %uint_2
+               OpSelectionMerge %580 None
+               OpBranchConditional %579 %581 %580
+        %581 = OpLabel
+               OpBranch %575
+        %580 = OpLabel
+        %582 = OpAccessChain %_ptr_Function_v3float %566 %576
+        %584 = OpLoad %v3float %582 None
+        %585 = OpAccessChain %_ptr_Function_v3float %568 %576
+               OpStore %585 %584 None
+               OpBranch %573
+        %573 = OpLabel
+        %577 = OpIAdd %uint %576 %uint_1
+               OpBranch %574
+        %575 = OpLabel
+        %578 = OpLoad %_arr_v3float_uint_2_0 %568 None
+               OpReturnValue %578
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4x2_f16_std140_uint_2_0 None %476
+%tint_convert_explicit_layout_0 = OpFunction %_arr_mat4x2_f16_std140_uint_2_0 None %587
 %tint_source_0 = OpFunctionParameter %_arr_mat4x2_f16_std140_uint_2
-        %477 = OpLabel
-        %478 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2 Function
-        %480 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2_0 Function %481
-               OpStore %478 %tint_source_0
-               OpBranch %482
-        %482 = OpLabel
-               OpBranch %485
-        %485 = OpLabel
-        %487 = OpPhi %uint %uint_0 %482 %488 %484
-               OpLoopMerge %486 %484 None
-               OpBranch %483
-        %483 = OpLabel
-        %490 = OpUGreaterThanEqual %bool %487 %uint_2
-               OpSelectionMerge %491 None
-               OpBranchConditional %490 %492 %491
-        %492 = OpLabel
-               OpBranch %486
-        %491 = OpLabel
-        %493 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %478 %487
-        %494 = OpLoad %mat4x2_f16_std140 %493 None
-        %495 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %480 %487
-               OpStore %495 %494 None
-               OpBranch %484
-        %484 = OpLabel
-        %488 = OpIAdd %uint %487 %uint_1
-               OpBranch %485
-        %486 = OpLabel
-        %489 = OpLoad %_arr_mat4x2_f16_std140_uint_2_0 %480 None
-               OpReturnValue %489
+        %588 = OpLabel
+        %589 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2 Function
+        %591 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_2_0 Function %592
+               OpStore %589 %tint_source_0
+               OpBranch %593
+        %593 = OpLabel
+               OpBranch %596
+        %596 = OpLabel
+        %598 = OpPhi %uint %uint_0 %593 %599 %595
+               OpLoopMerge %597 %595 None
+               OpBranch %594
+        %594 = OpLabel
+        %601 = OpUGreaterThanEqual %bool %598 %uint_2
+               OpSelectionMerge %602 None
+               OpBranchConditional %601 %603 %602
+        %603 = OpLabel
+               OpBranch %597
+        %602 = OpLabel
+        %604 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %589 %598
+        %605 = OpLoad %mat4x2_f16_std140 %604 None
+        %606 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %591 %598
+               OpStore %606 %605 None
+               OpBranch %595
+        %595 = OpLabel
+        %599 = OpIAdd %uint %598 %uint_1
+               OpBranch %596
+        %597 = OpLabel
+        %600 = OpLoad %_arr_mat4x2_f16_std140_uint_2_0 %591 None
+               OpReturnValue %600
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Inner_uint_4_0 None %497
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Inner_uint_4_0 None %608
 %tint_source_1 = OpFunctionParameter %_arr_Inner_uint_4
-        %498 = OpLabel
-        %499 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
-        %501 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %503
-               OpStore %499 %tint_source_1
-               OpBranch %504
-        %504 = OpLabel
-               OpBranch %507
-        %507 = OpLabel
-        %509 = OpPhi %uint %uint_0 %504 %510 %506
-               OpLoopMerge %508 %506 None
-               OpBranch %505
-        %505 = OpLabel
-        %512 = OpUGreaterThanEqual %bool %509 %uint_4
-               OpSelectionMerge %513 None
-               OpBranchConditional %512 %514 %513
-        %514 = OpLabel
-               OpBranch %508
-        %513 = OpLabel
-        %515 = OpAccessChain %_ptr_Function_Inner %499 %509
-        %517 = OpLoad %Inner %515 None
-        %518 = OpAccessChain %_ptr_Function_Inner %501 %509
-               OpStore %518 %517 None
-               OpBranch %506
-        %506 = OpLabel
-        %510 = OpIAdd %uint %509 %uint_1
-               OpBranch %507
-        %508 = OpLabel
-        %511 = OpLoad %_arr_Inner_uint_4_0 %501 None
-               OpReturnValue %511
+        %609 = OpLabel
+        %610 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
+        %612 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %614
+               OpStore %610 %tint_source_1
+               OpBranch %615
+        %615 = OpLabel
+               OpBranch %618
+        %618 = OpLabel
+        %620 = OpPhi %uint %uint_0 %615 %621 %617
+               OpLoopMerge %619 %617 None
+               OpBranch %616
+        %616 = OpLabel
+        %623 = OpUGreaterThanEqual %bool %620 %uint_4
+               OpSelectionMerge %624 None
+               OpBranchConditional %623 %625 %624
+        %625 = OpLabel
+               OpBranch %619
+        %624 = OpLabel
+        %626 = OpAccessChain %_ptr_Function_Inner %610 %620
+        %628 = OpLoad %Inner %626 None
+        %629 = OpAccessChain %_ptr_Function_Inner %612 %620
+               OpStore %629 %628 None
+               OpBranch %617
+        %617 = OpLabel
+        %621 = OpIAdd %uint %620 %uint_1
+               OpBranch %618
+        %619 = OpLabel
+        %622 = OpLoad %_arr_Inner_uint_4_0 %612 None
+               OpReturnValue %622
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 36287e1..6d24b36 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -16,33 +16,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  mat2 v_3 = mat2(v.inner[v_2].col0, v.inner[v_2].col1);
-  vec2 v_4 = v_3[min(uint(i()), 1u)];
-  mat2x2_f32_std140 v_5[4] = v.inner;
-  mat2 v_6[4] = mat2[4](mat2(vec2(0.0f), vec2(0.0f)), mat2(vec2(0.0f), vec2(0.0f)), mat2(vec2(0.0f), vec2(0.0f)), mat2(vec2(0.0f), vec2(0.0f)));
+  uint v_3 = min(uint(i()), 3u);
+  mat2 v_4 = mat2(v.inner[v_3].col0, v.inner[v_3].col1);
+  vec2 v_5 = v_4[min(uint(i()), 1u)];
+  mat2x2_f32_std140 v_6[4] = v.inner;
+  mat2 v_7[4] = mat2[4](mat2(vec2(0.0f), vec2(0.0f)), mat2(vec2(0.0f), vec2(0.0f)), mat2(vec2(0.0f), vec2(0.0f)), mat2(vec2(0.0f), vec2(0.0f)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = mat2(v_5[v_8].col0, v_5[v_8].col1);
+      v_7[v_9] = mat2(v_6[v_9].col0, v_6[v_9].col1);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  mat2 l_a[4] = v_6;
-  mat2 l_a_i = v_3;
-  vec2 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat2 l_a[4] = v_7;
+  mat2 l_a_i = v_4;
+  vec2 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index a6da27c..c76e05c 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 111
+; Bound: 114
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -55,7 +55,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat2x2_f32_std140_uint_4 = OpTypePointer Uniform %_arr_mat2x2_f32_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -68,111 +68,114 @@
 %_ptr_Function__arr_mat2x2_f32_std140_uint_4_0 = OpTypePointer Function %_arr_mat2x2_f32_std140_uint_4_0
 %_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4
 %_ptr_Function__arr_mat2v2float_uint_4 = OpTypePointer Function %_arr_mat2v2float_uint_4
-         %61 = OpConstantNull %_arr_mat2v2float_uint_4
+         %64 = OpConstantNull %_arr_mat2v2float_uint_4
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
        %bool = OpTypeBool
 %_ptr_Function_mat2x2_f32_std140 = OpTypePointer Function %mat2x2_f32_std140
-         %91 = OpTypeFunction %_arr_mat2x2_f32_std140_uint_4_0 %_arr_mat2x2_f32_std140_uint_4
+         %94 = OpTypeFunction %_arr_mat2x2_f32_std140_uint_4_0 %_arr_mat2x2_f32_std140_uint_4
 %_ptr_Function__arr_mat2x2_f32_std140_uint_4 = OpTypePointer Function %_arr_mat2x2_f32_std140_uint_4
-         %96 = OpConstantNull %_arr_mat2x2_f32_std140_uint_4_0
+         %99 = OpConstantNull %_arr_mat2x2_f32_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %44 = OpVariable %_ptr_Function_mat2v2float Function
-         %56 = OpVariable %_ptr_Function__arr_mat2x2_f32_std140_uint_4_0 Function
-         %58 = OpVariable %_ptr_Function__arr_mat2v2float_uint_4 Function %61
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat2x2_f32_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v2float %28 %33 %uint_0
-         %38 = OpLoad %v2float %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v2float %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %47 = OpVariable %_ptr_Function_mat2v2float Function
+         %59 = OpVariable %_ptr_Function__arr_mat2x2_f32_std140_uint_4_0 Function
+         %61 = OpVariable %_ptr_Function__arr_mat2v2float_uint_4 Function %64
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat2x2_f32_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v2float %31 %36 %uint_0
          %41 = OpLoad %v2float %39 None
-      %l_a_i = OpCompositeConstruct %mat2v2float %38 %41
-               OpStore %44 %l_a_i
-         %46 = OpFunctionCall %int %i
-         %47 = OpBitcast %uint %46
-         %48 = OpExtInst %uint %34 UMin %47 %uint_1
-         %49 = OpAccessChain %_ptr_Function_v2float %44 %48
-    %l_a_i_i = OpLoad %v2float %49 None
-         %52 = OpLoad %_arr_mat2x2_f32_std140_uint_4 %28 None
-         %53 = OpFunctionCall %_arr_mat2x2_f32_std140_uint_4_0 %tint_convert_explicit_layout %52
-               OpStore %56 %53
-               OpBranch %62
-         %62 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_v2float %31 %36 %uint_1
+         %44 = OpLoad %v2float %42 None
+      %l_a_i = OpCompositeConstruct %mat2v2float %41 %44
+               OpStore %47 %l_a_i
+         %49 = OpFunctionCall %int %i
+         %50 = OpBitcast %uint %49
+         %51 = OpExtInst %uint %37 UMin %50 %uint_1
+         %52 = OpAccessChain %_ptr_Function_v2float %47 %51
+    %l_a_i_i = OpLoad %v2float %52 None
+         %55 = OpLoad %_arr_mat2x2_f32_std140_uint_4 %31 None
+         %56 = OpFunctionCall %_arr_mat2x2_f32_std140_uint_4_0 %tint_convert_explicit_layout %55
+               OpStore %59 %56
                OpBranch %65
          %65 = OpLabel
-         %67 = OpPhi %uint %uint_0 %62 %68 %64
-               OpLoopMerge %66 %64 None
-               OpBranch %63
-         %63 = OpLabel
-         %79 = OpUGreaterThanEqual %bool %67 %uint_4
-               OpSelectionMerge %81 None
-               OpBranchConditional %79 %82 %81
-         %82 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+         %70 = OpPhi %uint %uint_0 %65 %71 %67
+               OpLoopMerge %69 %67 None
                OpBranch %66
-         %81 = OpLabel
-         %83 = OpAccessChain %_ptr_Function_mat2v2float %58 %67
-         %84 = OpAccessChain %_ptr_Function_mat2x2_f32_std140 %56 %67
-         %86 = OpLoad %mat2x2_f32_std140 %84 None
-         %87 = OpCompositeExtract %v2float %86 0
-         %88 = OpCompositeExtract %v2float %86 1
-         %89 = OpCompositeConstruct %mat2v2float %87 %88
-               OpStore %83 %89 None
-               OpBranch %64
-         %64 = OpLabel
-         %68 = OpIAdd %uint %67 %uint_1
-               OpBranch %65
          %66 = OpLabel
-        %l_a = OpLoad %_arr_mat2v2float_uint_4 %58 None
-         %70 = OpCompositeExtract %float %l_a_i_i 0
-         %71 = OpCompositeExtract %float %l_a 0 0 0
-         %72 = OpFAdd %float %70 %71
-         %73 = OpCompositeExtract %float %l_a_i 0 0
-         %74 = OpFAdd %float %72 %73
-         %75 = OpCompositeExtract %float %l_a_i_i 0
-         %76 = OpFAdd %float %74 %75
-         %77 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %77 %76 None
+         %82 = OpUGreaterThanEqual %bool %70 %uint_4
+               OpSelectionMerge %84 None
+               OpBranchConditional %82 %85 %84
+         %85 = OpLabel
+               OpBranch %69
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_mat2v2float %61 %70
+         %87 = OpAccessChain %_ptr_Function_mat2x2_f32_std140 %59 %70
+         %89 = OpLoad %mat2x2_f32_std140 %87 None
+         %90 = OpCompositeExtract %v2float %89 0
+         %91 = OpCompositeExtract %v2float %89 1
+         %92 = OpCompositeConstruct %mat2v2float %90 %91
+               OpStore %86 %92 None
+               OpBranch %67
+         %67 = OpLabel
+         %71 = OpIAdd %uint %70 %uint_1
+               OpBranch %68
+         %69 = OpLabel
+        %l_a = OpLoad %_arr_mat2v2float_uint_4 %61 None
+         %73 = OpCompositeExtract %float %l_a_i_i 0
+         %74 = OpCompositeExtract %float %l_a 0 0 0
+         %75 = OpFAdd %float %73 %74
+         %76 = OpCompositeExtract %float %l_a_i 0 0
+         %77 = OpFAdd %float %75 %76
+         %78 = OpCompositeExtract %float %l_a_i_i 0
+         %79 = OpFAdd %float %77 %78
+         %80 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %80 %79 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat2x2_f32_std140_uint_4_0 None %91
+%tint_convert_explicit_layout = OpFunction %_arr_mat2x2_f32_std140_uint_4_0 None %94
 %tint_source = OpFunctionParameter %_arr_mat2x2_f32_std140_uint_4
-         %92 = OpLabel
-         %93 = OpVariable %_ptr_Function__arr_mat2x2_f32_std140_uint_4 Function
-         %95 = OpVariable %_ptr_Function__arr_mat2x2_f32_std140_uint_4_0 Function %96
-               OpStore %93 %tint_source
-               OpBranch %97
-         %97 = OpLabel
+         %95 = OpLabel
+         %96 = OpVariable %_ptr_Function__arr_mat2x2_f32_std140_uint_4 Function
+         %98 = OpVariable %_ptr_Function__arr_mat2x2_f32_std140_uint_4_0 Function %99
+               OpStore %96 %tint_source
                OpBranch %100
         %100 = OpLabel
-        %102 = OpPhi %uint %uint_0 %97 %103 %99
-               OpLoopMerge %101 %99 None
-               OpBranch %98
-         %98 = OpLabel
-        %105 = OpUGreaterThanEqual %bool %102 %uint_4
-               OpSelectionMerge %106 None
-               OpBranchConditional %105 %107 %106
-        %107 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %105 = OpPhi %uint %uint_0 %100 %106 %102
+               OpLoopMerge %104 %102 None
                OpBranch %101
-        %106 = OpLabel
-        %108 = OpAccessChain %_ptr_Function_mat2x2_f32_std140 %93 %102
-        %109 = OpLoad %mat2x2_f32_std140 %108 None
-        %110 = OpAccessChain %_ptr_Function_mat2x2_f32_std140 %95 %102
-               OpStore %110 %109 None
-               OpBranch %99
-         %99 = OpLabel
-        %103 = OpIAdd %uint %102 %uint_1
-               OpBranch %100
         %101 = OpLabel
-        %104 = OpLoad %_arr_mat2x2_f32_std140_uint_4_0 %95 None
-               OpReturnValue %104
+        %108 = OpUGreaterThanEqual %bool %105 %uint_4
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpBranch %104
+        %109 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_mat2x2_f32_std140 %96 %105
+        %112 = OpLoad %mat2x2_f32_std140 %111 None
+        %113 = OpAccessChain %_ptr_Function_mat2x2_f32_std140 %98 %105
+               OpStore %113 %112 None
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpIAdd %uint %105 %uint_1
+               OpBranch %103
+        %104 = OpLabel
+        %107 = OpLoad %_arr_mat2x2_f32_std140_uint_4_0 %98 None
+               OpReturnValue %107
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index f14b269..3fd6b70 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -17,33 +17,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  f16mat2x3 v_3 = f16mat2x3(v.inner[v_2].col0, v.inner[v_2].col1);
-  f16vec3 v_4 = v_3[min(uint(i()), 1u)];
-  mat2x3_f16_std140 v_5[4] = v.inner;
-  f16mat2x3 v_6[4] = f16mat2x3[4](f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)));
+  uint v_3 = min(uint(i()), 3u);
+  f16mat2x3 v_4 = f16mat2x3(v.inner[v_3].col0, v.inner[v_3].col1);
+  f16vec3 v_5 = v_4[min(uint(i()), 1u)];
+  mat2x3_f16_std140 v_6[4] = v.inner;
+  f16mat2x3 v_7[4] = f16mat2x3[4](f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = f16mat2x3(v_5[v_8].col0, v_5[v_8].col1);
+      v_7[v_9] = f16mat2x3(v_6[v_9].col0, v_6[v_9].col1);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  f16mat2x3 l_a[4] = v_6;
-  f16mat2x3 l_a_i = v_3;
-  f16vec3 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  f16mat2x3 l_a[4] = v_7;
+  f16mat2x3 l_a_i = v_4;
+  f16vec3 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 1a04df5..669c2a2 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 111
+; Bound: 114
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -58,7 +58,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat2x3_f16_std140_uint_4 = OpTypePointer Uniform %_arr_mat2x3_f16_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -71,111 +71,114 @@
 %_ptr_Function__arr_mat2x3_f16_std140_uint_4_0 = OpTypePointer Function %_arr_mat2x3_f16_std140_uint_4_0
 %_arr_mat2v3half_uint_4 = OpTypeArray %mat2v3half %uint_4
 %_ptr_Function__arr_mat2v3half_uint_4 = OpTypePointer Function %_arr_mat2v3half_uint_4
-         %61 = OpConstantNull %_arr_mat2v3half_uint_4
+         %64 = OpConstantNull %_arr_mat2v3half_uint_4
 %_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
        %bool = OpTypeBool
 %_ptr_Function_mat2x3_f16_std140 = OpTypePointer Function %mat2x3_f16_std140
-         %91 = OpTypeFunction %_arr_mat2x3_f16_std140_uint_4_0 %_arr_mat2x3_f16_std140_uint_4
+         %94 = OpTypeFunction %_arr_mat2x3_f16_std140_uint_4_0 %_arr_mat2x3_f16_std140_uint_4
 %_ptr_Function__arr_mat2x3_f16_std140_uint_4 = OpTypePointer Function %_arr_mat2x3_f16_std140_uint_4
-         %96 = OpConstantNull %_arr_mat2x3_f16_std140_uint_4_0
+         %99 = OpConstantNull %_arr_mat2x3_f16_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %44 = OpVariable %_ptr_Function_mat2v3half Function
-         %56 = OpVariable %_ptr_Function__arr_mat2x3_f16_std140_uint_4_0 Function
-         %58 = OpVariable %_ptr_Function__arr_mat2v3half_uint_4 Function %61
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat2x3_f16_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v3half %28 %33 %uint_0
-         %38 = OpLoad %v3half %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v3half %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %47 = OpVariable %_ptr_Function_mat2v3half Function
+         %59 = OpVariable %_ptr_Function__arr_mat2x3_f16_std140_uint_4_0 Function
+         %61 = OpVariable %_ptr_Function__arr_mat2v3half_uint_4 Function %64
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat2x3_f16_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v3half %31 %36 %uint_0
          %41 = OpLoad %v3half %39 None
-      %l_a_i = OpCompositeConstruct %mat2v3half %38 %41
-               OpStore %44 %l_a_i
-         %46 = OpFunctionCall %int %i
-         %47 = OpBitcast %uint %46
-         %48 = OpExtInst %uint %34 UMin %47 %uint_1
-         %49 = OpAccessChain %_ptr_Function_v3half %44 %48
-    %l_a_i_i = OpLoad %v3half %49 None
-         %52 = OpLoad %_arr_mat2x3_f16_std140_uint_4 %28 None
-         %53 = OpFunctionCall %_arr_mat2x3_f16_std140_uint_4_0 %tint_convert_explicit_layout %52
-               OpStore %56 %53
-               OpBranch %62
-         %62 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_v3half %31 %36 %uint_1
+         %44 = OpLoad %v3half %42 None
+      %l_a_i = OpCompositeConstruct %mat2v3half %41 %44
+               OpStore %47 %l_a_i
+         %49 = OpFunctionCall %int %i
+         %50 = OpBitcast %uint %49
+         %51 = OpExtInst %uint %37 UMin %50 %uint_1
+         %52 = OpAccessChain %_ptr_Function_v3half %47 %51
+    %l_a_i_i = OpLoad %v3half %52 None
+         %55 = OpLoad %_arr_mat2x3_f16_std140_uint_4 %31 None
+         %56 = OpFunctionCall %_arr_mat2x3_f16_std140_uint_4_0 %tint_convert_explicit_layout %55
+               OpStore %59 %56
                OpBranch %65
          %65 = OpLabel
-         %67 = OpPhi %uint %uint_0 %62 %68 %64
-               OpLoopMerge %66 %64 None
-               OpBranch %63
-         %63 = OpLabel
-         %79 = OpUGreaterThanEqual %bool %67 %uint_4
-               OpSelectionMerge %81 None
-               OpBranchConditional %79 %82 %81
-         %82 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+         %70 = OpPhi %uint %uint_0 %65 %71 %67
+               OpLoopMerge %69 %67 None
                OpBranch %66
-         %81 = OpLabel
-         %83 = OpAccessChain %_ptr_Function_mat2v3half %58 %67
-         %84 = OpAccessChain %_ptr_Function_mat2x3_f16_std140 %56 %67
-         %86 = OpLoad %mat2x3_f16_std140 %84 None
-         %87 = OpCompositeExtract %v3half %86 0
-         %88 = OpCompositeExtract %v3half %86 1
-         %89 = OpCompositeConstruct %mat2v3half %87 %88
-               OpStore %83 %89 None
-               OpBranch %64
-         %64 = OpLabel
-         %68 = OpIAdd %uint %67 %uint_1
-               OpBranch %65
          %66 = OpLabel
-        %l_a = OpLoad %_arr_mat2v3half_uint_4 %58 None
-         %70 = OpCompositeExtract %half %l_a_i_i 0
-         %71 = OpCompositeExtract %half %l_a 0 0 0
-         %72 = OpFAdd %half %70 %71
-         %73 = OpCompositeExtract %half %l_a_i 0 0
-         %74 = OpFAdd %half %72 %73
-         %75 = OpCompositeExtract %half %l_a_i_i 0
-         %76 = OpFAdd %half %74 %75
-         %77 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
-               OpStore %77 %76 None
+         %82 = OpUGreaterThanEqual %bool %70 %uint_4
+               OpSelectionMerge %84 None
+               OpBranchConditional %82 %85 %84
+         %85 = OpLabel
+               OpBranch %69
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_mat2v3half %61 %70
+         %87 = OpAccessChain %_ptr_Function_mat2x3_f16_std140 %59 %70
+         %89 = OpLoad %mat2x3_f16_std140 %87 None
+         %90 = OpCompositeExtract %v3half %89 0
+         %91 = OpCompositeExtract %v3half %89 1
+         %92 = OpCompositeConstruct %mat2v3half %90 %91
+               OpStore %86 %92 None
+               OpBranch %67
+         %67 = OpLabel
+         %71 = OpIAdd %uint %70 %uint_1
+               OpBranch %68
+         %69 = OpLabel
+        %l_a = OpLoad %_arr_mat2v3half_uint_4 %61 None
+         %73 = OpCompositeExtract %half %l_a_i_i 0
+         %74 = OpCompositeExtract %half %l_a 0 0 0
+         %75 = OpFAdd %half %73 %74
+         %76 = OpCompositeExtract %half %l_a_i 0 0
+         %77 = OpFAdd %half %75 %76
+         %78 = OpCompositeExtract %half %l_a_i_i 0
+         %79 = OpFAdd %half %77 %78
+         %80 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
+               OpStore %80 %79 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat2x3_f16_std140_uint_4_0 None %91
+%tint_convert_explicit_layout = OpFunction %_arr_mat2x3_f16_std140_uint_4_0 None %94
 %tint_source = OpFunctionParameter %_arr_mat2x3_f16_std140_uint_4
-         %92 = OpLabel
-         %93 = OpVariable %_ptr_Function__arr_mat2x3_f16_std140_uint_4 Function
-         %95 = OpVariable %_ptr_Function__arr_mat2x3_f16_std140_uint_4_0 Function %96
-               OpStore %93 %tint_source
-               OpBranch %97
-         %97 = OpLabel
+         %95 = OpLabel
+         %96 = OpVariable %_ptr_Function__arr_mat2x3_f16_std140_uint_4 Function
+         %98 = OpVariable %_ptr_Function__arr_mat2x3_f16_std140_uint_4_0 Function %99
+               OpStore %96 %tint_source
                OpBranch %100
         %100 = OpLabel
-        %102 = OpPhi %uint %uint_0 %97 %103 %99
-               OpLoopMerge %101 %99 None
-               OpBranch %98
-         %98 = OpLabel
-        %105 = OpUGreaterThanEqual %bool %102 %uint_4
-               OpSelectionMerge %106 None
-               OpBranchConditional %105 %107 %106
-        %107 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %105 = OpPhi %uint %uint_0 %100 %106 %102
+               OpLoopMerge %104 %102 None
                OpBranch %101
-        %106 = OpLabel
-        %108 = OpAccessChain %_ptr_Function_mat2x3_f16_std140 %93 %102
-        %109 = OpLoad %mat2x3_f16_std140 %108 None
-        %110 = OpAccessChain %_ptr_Function_mat2x3_f16_std140 %95 %102
-               OpStore %110 %109 None
-               OpBranch %99
-         %99 = OpLabel
-        %103 = OpIAdd %uint %102 %uint_1
-               OpBranch %100
         %101 = OpLabel
-        %104 = OpLoad %_arr_mat2x3_f16_std140_uint_4_0 %95 None
-               OpReturnValue %104
+        %108 = OpUGreaterThanEqual %bool %105 %uint_4
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpBranch %104
+        %109 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_mat2x3_f16_std140 %96 %105
+        %112 = OpLoad %mat2x3_f16_std140 %111 None
+        %113 = OpAccessChain %_ptr_Function_mat2x3_f16_std140 %98 %105
+               OpStore %113 %112 None
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpIAdd %uint %105 %uint_1
+               OpBranch %103
+        %104 = OpLabel
+        %107 = OpLoad %_arr_mat2x3_f16_std140_uint_4_0 %98 None
+               OpReturnValue %107
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index e9d8e29..f3f5e57 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -18,33 +18,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  mat2x3 v_3 = mat2x3(v.inner[v_2].col0, v.inner[v_2].col1);
-  vec3 v_4 = v_3[min(uint(i()), 1u)];
-  mat2x3_f32_std140 v_5[4] = v.inner;
-  mat2x3 v_6[4] = mat2x3[4](mat2x3(vec3(0.0f), vec3(0.0f)), mat2x3(vec3(0.0f), vec3(0.0f)), mat2x3(vec3(0.0f), vec3(0.0f)), mat2x3(vec3(0.0f), vec3(0.0f)));
+  uint v_3 = min(uint(i()), 3u);
+  mat2x3 v_4 = mat2x3(v.inner[v_3].col0, v.inner[v_3].col1);
+  vec3 v_5 = v_4[min(uint(i()), 1u)];
+  mat2x3_f32_std140 v_6[4] = v.inner;
+  mat2x3 v_7[4] = mat2x3[4](mat2x3(vec3(0.0f), vec3(0.0f)), mat2x3(vec3(0.0f), vec3(0.0f)), mat2x3(vec3(0.0f), vec3(0.0f)), mat2x3(vec3(0.0f), vec3(0.0f)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = mat2x3(v_5[v_8].col0, v_5[v_8].col1);
+      v_7[v_9] = mat2x3(v_6[v_9].col0, v_6[v_9].col1);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  mat2x3 l_a[4] = v_6;
-  mat2x3 l_a_i = v_3;
-  vec3 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat2x3 l_a[4] = v_7;
+  mat2x3 l_a_i = v_4;
+  vec3 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 805dc2f..b08554e 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 111
+; Bound: 114
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -55,7 +55,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat2x3_f32_std140_uint_4 = OpTypePointer Uniform %_arr_mat2x3_f32_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -68,111 +68,114 @@
 %_ptr_Function__arr_mat2x3_f32_std140_uint_4_0 = OpTypePointer Function %_arr_mat2x3_f32_std140_uint_4_0
 %_arr_mat2v3float_uint_4 = OpTypeArray %mat2v3float %uint_4
 %_ptr_Function__arr_mat2v3float_uint_4 = OpTypePointer Function %_arr_mat2v3float_uint_4
-         %61 = OpConstantNull %_arr_mat2v3float_uint_4
+         %64 = OpConstantNull %_arr_mat2v3float_uint_4
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
        %bool = OpTypeBool
 %_ptr_Function_mat2x3_f32_std140 = OpTypePointer Function %mat2x3_f32_std140
-         %91 = OpTypeFunction %_arr_mat2x3_f32_std140_uint_4_0 %_arr_mat2x3_f32_std140_uint_4
+         %94 = OpTypeFunction %_arr_mat2x3_f32_std140_uint_4_0 %_arr_mat2x3_f32_std140_uint_4
 %_ptr_Function__arr_mat2x3_f32_std140_uint_4 = OpTypePointer Function %_arr_mat2x3_f32_std140_uint_4
-         %96 = OpConstantNull %_arr_mat2x3_f32_std140_uint_4_0
+         %99 = OpConstantNull %_arr_mat2x3_f32_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %44 = OpVariable %_ptr_Function_mat2v3float Function
-         %56 = OpVariable %_ptr_Function__arr_mat2x3_f32_std140_uint_4_0 Function
-         %58 = OpVariable %_ptr_Function__arr_mat2v3float_uint_4 Function %61
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat2x3_f32_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_0
-         %38 = OpLoad %v3float %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %47 = OpVariable %_ptr_Function_mat2v3float Function
+         %59 = OpVariable %_ptr_Function__arr_mat2x3_f32_std140_uint_4_0 Function
+         %61 = OpVariable %_ptr_Function__arr_mat2v3float_uint_4 Function %64
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat2x3_f32_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_0
          %41 = OpLoad %v3float %39 None
-      %l_a_i = OpCompositeConstruct %mat2v3float %38 %41
-               OpStore %44 %l_a_i
-         %46 = OpFunctionCall %int %i
-         %47 = OpBitcast %uint %46
-         %48 = OpExtInst %uint %34 UMin %47 %uint_1
-         %49 = OpAccessChain %_ptr_Function_v3float %44 %48
-    %l_a_i_i = OpLoad %v3float %49 None
-         %52 = OpLoad %_arr_mat2x3_f32_std140_uint_4 %28 None
-         %53 = OpFunctionCall %_arr_mat2x3_f32_std140_uint_4_0 %tint_convert_explicit_layout %52
-               OpStore %56 %53
-               OpBranch %62
-         %62 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_1
+         %44 = OpLoad %v3float %42 None
+      %l_a_i = OpCompositeConstruct %mat2v3float %41 %44
+               OpStore %47 %l_a_i
+         %49 = OpFunctionCall %int %i
+         %50 = OpBitcast %uint %49
+         %51 = OpExtInst %uint %37 UMin %50 %uint_1
+         %52 = OpAccessChain %_ptr_Function_v3float %47 %51
+    %l_a_i_i = OpLoad %v3float %52 None
+         %55 = OpLoad %_arr_mat2x3_f32_std140_uint_4 %31 None
+         %56 = OpFunctionCall %_arr_mat2x3_f32_std140_uint_4_0 %tint_convert_explicit_layout %55
+               OpStore %59 %56
                OpBranch %65
          %65 = OpLabel
-         %67 = OpPhi %uint %uint_0 %62 %68 %64
-               OpLoopMerge %66 %64 None
-               OpBranch %63
-         %63 = OpLabel
-         %79 = OpUGreaterThanEqual %bool %67 %uint_4
-               OpSelectionMerge %81 None
-               OpBranchConditional %79 %82 %81
-         %82 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+         %70 = OpPhi %uint %uint_0 %65 %71 %67
+               OpLoopMerge %69 %67 None
                OpBranch %66
-         %81 = OpLabel
-         %83 = OpAccessChain %_ptr_Function_mat2v3float %58 %67
-         %84 = OpAccessChain %_ptr_Function_mat2x3_f32_std140 %56 %67
-         %86 = OpLoad %mat2x3_f32_std140 %84 None
-         %87 = OpCompositeExtract %v3float %86 0
-         %88 = OpCompositeExtract %v3float %86 1
-         %89 = OpCompositeConstruct %mat2v3float %87 %88
-               OpStore %83 %89 None
-               OpBranch %64
-         %64 = OpLabel
-         %68 = OpIAdd %uint %67 %uint_1
-               OpBranch %65
          %66 = OpLabel
-        %l_a = OpLoad %_arr_mat2v3float_uint_4 %58 None
-         %70 = OpCompositeExtract %float %l_a_i_i 0
-         %71 = OpCompositeExtract %float %l_a 0 0 0
-         %72 = OpFAdd %float %70 %71
-         %73 = OpCompositeExtract %float %l_a_i 0 0
-         %74 = OpFAdd %float %72 %73
-         %75 = OpCompositeExtract %float %l_a_i_i 0
-         %76 = OpFAdd %float %74 %75
-         %77 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %77 %76 None
+         %82 = OpUGreaterThanEqual %bool %70 %uint_4
+               OpSelectionMerge %84 None
+               OpBranchConditional %82 %85 %84
+         %85 = OpLabel
+               OpBranch %69
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_mat2v3float %61 %70
+         %87 = OpAccessChain %_ptr_Function_mat2x3_f32_std140 %59 %70
+         %89 = OpLoad %mat2x3_f32_std140 %87 None
+         %90 = OpCompositeExtract %v3float %89 0
+         %91 = OpCompositeExtract %v3float %89 1
+         %92 = OpCompositeConstruct %mat2v3float %90 %91
+               OpStore %86 %92 None
+               OpBranch %67
+         %67 = OpLabel
+         %71 = OpIAdd %uint %70 %uint_1
+               OpBranch %68
+         %69 = OpLabel
+        %l_a = OpLoad %_arr_mat2v3float_uint_4 %61 None
+         %73 = OpCompositeExtract %float %l_a_i_i 0
+         %74 = OpCompositeExtract %float %l_a 0 0 0
+         %75 = OpFAdd %float %73 %74
+         %76 = OpCompositeExtract %float %l_a_i 0 0
+         %77 = OpFAdd %float %75 %76
+         %78 = OpCompositeExtract %float %l_a_i_i 0
+         %79 = OpFAdd %float %77 %78
+         %80 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %80 %79 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat2x3_f32_std140_uint_4_0 None %91
+%tint_convert_explicit_layout = OpFunction %_arr_mat2x3_f32_std140_uint_4_0 None %94
 %tint_source = OpFunctionParameter %_arr_mat2x3_f32_std140_uint_4
-         %92 = OpLabel
-         %93 = OpVariable %_ptr_Function__arr_mat2x3_f32_std140_uint_4 Function
-         %95 = OpVariable %_ptr_Function__arr_mat2x3_f32_std140_uint_4_0 Function %96
-               OpStore %93 %tint_source
-               OpBranch %97
-         %97 = OpLabel
+         %95 = OpLabel
+         %96 = OpVariable %_ptr_Function__arr_mat2x3_f32_std140_uint_4 Function
+         %98 = OpVariable %_ptr_Function__arr_mat2x3_f32_std140_uint_4_0 Function %99
+               OpStore %96 %tint_source
                OpBranch %100
         %100 = OpLabel
-        %102 = OpPhi %uint %uint_0 %97 %103 %99
-               OpLoopMerge %101 %99 None
-               OpBranch %98
-         %98 = OpLabel
-        %105 = OpUGreaterThanEqual %bool %102 %uint_4
-               OpSelectionMerge %106 None
-               OpBranchConditional %105 %107 %106
-        %107 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %105 = OpPhi %uint %uint_0 %100 %106 %102
+               OpLoopMerge %104 %102 None
                OpBranch %101
-        %106 = OpLabel
-        %108 = OpAccessChain %_ptr_Function_mat2x3_f32_std140 %93 %102
-        %109 = OpLoad %mat2x3_f32_std140 %108 None
-        %110 = OpAccessChain %_ptr_Function_mat2x3_f32_std140 %95 %102
-               OpStore %110 %109 None
-               OpBranch %99
-         %99 = OpLabel
-        %103 = OpIAdd %uint %102 %uint_1
-               OpBranch %100
         %101 = OpLabel
-        %104 = OpLoad %_arr_mat2x3_f32_std140_uint_4_0 %95 None
-               OpReturnValue %104
+        %108 = OpUGreaterThanEqual %bool %105 %uint_4
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpBranch %104
+        %109 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_mat2x3_f32_std140 %96 %105
+        %112 = OpLoad %mat2x3_f32_std140 %111 None
+        %113 = OpAccessChain %_ptr_Function_mat2x3_f32_std140 %98 %105
+               OpStore %113 %112 None
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpIAdd %uint %105 %uint_1
+               OpBranch %103
+        %104 = OpLabel
+        %107 = OpLoad %_arr_mat2x3_f32_std140_uint_4_0 %98 None
+               OpReturnValue %107
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index f1aaa4e..7f8cd057 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -17,33 +17,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  f16mat2x4 v_3 = f16mat2x4(v.inner[v_2].col0, v.inner[v_2].col1);
-  f16vec4 v_4 = v_3[min(uint(i()), 1u)];
-  mat2x4_f16_std140 v_5[4] = v.inner;
-  f16mat2x4 v_6[4] = f16mat2x4[4](f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)));
+  uint v_3 = min(uint(i()), 3u);
+  f16mat2x4 v_4 = f16mat2x4(v.inner[v_3].col0, v.inner[v_3].col1);
+  f16vec4 v_5 = v_4[min(uint(i()), 1u)];
+  mat2x4_f16_std140 v_6[4] = v.inner;
+  f16mat2x4 v_7[4] = f16mat2x4[4](f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = f16mat2x4(v_5[v_8].col0, v_5[v_8].col1);
+      v_7[v_9] = f16mat2x4(v_6[v_9].col0, v_6[v_9].col1);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  f16mat2x4 l_a[4] = v_6;
-  f16mat2x4 l_a_i = v_3;
-  f16vec4 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  f16mat2x4 l_a[4] = v_7;
+  f16mat2x4 l_a_i = v_4;
+  f16vec4 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index c0d9b1c..8dc778a 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 111
+; Bound: 114
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -58,7 +58,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat2x4_f16_std140_uint_4 = OpTypePointer Uniform %_arr_mat2x4_f16_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -71,111 +71,114 @@
 %_ptr_Function__arr_mat2x4_f16_std140_uint_4_0 = OpTypePointer Function %_arr_mat2x4_f16_std140_uint_4_0
 %_arr_mat2v4half_uint_4 = OpTypeArray %mat2v4half %uint_4
 %_ptr_Function__arr_mat2v4half_uint_4 = OpTypePointer Function %_arr_mat2v4half_uint_4
-         %61 = OpConstantNull %_arr_mat2v4half_uint_4
+         %64 = OpConstantNull %_arr_mat2v4half_uint_4
 %_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
        %bool = OpTypeBool
 %_ptr_Function_mat2x4_f16_std140 = OpTypePointer Function %mat2x4_f16_std140
-         %91 = OpTypeFunction %_arr_mat2x4_f16_std140_uint_4_0 %_arr_mat2x4_f16_std140_uint_4
+         %94 = OpTypeFunction %_arr_mat2x4_f16_std140_uint_4_0 %_arr_mat2x4_f16_std140_uint_4
 %_ptr_Function__arr_mat2x4_f16_std140_uint_4 = OpTypePointer Function %_arr_mat2x4_f16_std140_uint_4
-         %96 = OpConstantNull %_arr_mat2x4_f16_std140_uint_4_0
+         %99 = OpConstantNull %_arr_mat2x4_f16_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %44 = OpVariable %_ptr_Function_mat2v4half Function
-         %56 = OpVariable %_ptr_Function__arr_mat2x4_f16_std140_uint_4_0 Function
-         %58 = OpVariable %_ptr_Function__arr_mat2v4half_uint_4 Function %61
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat2x4_f16_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v4half %28 %33 %uint_0
-         %38 = OpLoad %v4half %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v4half %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %47 = OpVariable %_ptr_Function_mat2v4half Function
+         %59 = OpVariable %_ptr_Function__arr_mat2x4_f16_std140_uint_4_0 Function
+         %61 = OpVariable %_ptr_Function__arr_mat2v4half_uint_4 Function %64
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat2x4_f16_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v4half %31 %36 %uint_0
          %41 = OpLoad %v4half %39 None
-      %l_a_i = OpCompositeConstruct %mat2v4half %38 %41
-               OpStore %44 %l_a_i
-         %46 = OpFunctionCall %int %i
-         %47 = OpBitcast %uint %46
-         %48 = OpExtInst %uint %34 UMin %47 %uint_1
-         %49 = OpAccessChain %_ptr_Function_v4half %44 %48
-    %l_a_i_i = OpLoad %v4half %49 None
-         %52 = OpLoad %_arr_mat2x4_f16_std140_uint_4 %28 None
-         %53 = OpFunctionCall %_arr_mat2x4_f16_std140_uint_4_0 %tint_convert_explicit_layout %52
-               OpStore %56 %53
-               OpBranch %62
-         %62 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_v4half %31 %36 %uint_1
+         %44 = OpLoad %v4half %42 None
+      %l_a_i = OpCompositeConstruct %mat2v4half %41 %44
+               OpStore %47 %l_a_i
+         %49 = OpFunctionCall %int %i
+         %50 = OpBitcast %uint %49
+         %51 = OpExtInst %uint %37 UMin %50 %uint_1
+         %52 = OpAccessChain %_ptr_Function_v4half %47 %51
+    %l_a_i_i = OpLoad %v4half %52 None
+         %55 = OpLoad %_arr_mat2x4_f16_std140_uint_4 %31 None
+         %56 = OpFunctionCall %_arr_mat2x4_f16_std140_uint_4_0 %tint_convert_explicit_layout %55
+               OpStore %59 %56
                OpBranch %65
          %65 = OpLabel
-         %67 = OpPhi %uint %uint_0 %62 %68 %64
-               OpLoopMerge %66 %64 None
-               OpBranch %63
-         %63 = OpLabel
-         %79 = OpUGreaterThanEqual %bool %67 %uint_4
-               OpSelectionMerge %81 None
-               OpBranchConditional %79 %82 %81
-         %82 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+         %70 = OpPhi %uint %uint_0 %65 %71 %67
+               OpLoopMerge %69 %67 None
                OpBranch %66
-         %81 = OpLabel
-         %83 = OpAccessChain %_ptr_Function_mat2v4half %58 %67
-         %84 = OpAccessChain %_ptr_Function_mat2x4_f16_std140 %56 %67
-         %86 = OpLoad %mat2x4_f16_std140 %84 None
-         %87 = OpCompositeExtract %v4half %86 0
-         %88 = OpCompositeExtract %v4half %86 1
-         %89 = OpCompositeConstruct %mat2v4half %87 %88
-               OpStore %83 %89 None
-               OpBranch %64
-         %64 = OpLabel
-         %68 = OpIAdd %uint %67 %uint_1
-               OpBranch %65
          %66 = OpLabel
-        %l_a = OpLoad %_arr_mat2v4half_uint_4 %58 None
-         %70 = OpCompositeExtract %half %l_a_i_i 0
-         %71 = OpCompositeExtract %half %l_a 0 0 0
-         %72 = OpFAdd %half %70 %71
-         %73 = OpCompositeExtract %half %l_a_i 0 0
-         %74 = OpFAdd %half %72 %73
-         %75 = OpCompositeExtract %half %l_a_i_i 0
-         %76 = OpFAdd %half %74 %75
-         %77 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
-               OpStore %77 %76 None
+         %82 = OpUGreaterThanEqual %bool %70 %uint_4
+               OpSelectionMerge %84 None
+               OpBranchConditional %82 %85 %84
+         %85 = OpLabel
+               OpBranch %69
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_mat2v4half %61 %70
+         %87 = OpAccessChain %_ptr_Function_mat2x4_f16_std140 %59 %70
+         %89 = OpLoad %mat2x4_f16_std140 %87 None
+         %90 = OpCompositeExtract %v4half %89 0
+         %91 = OpCompositeExtract %v4half %89 1
+         %92 = OpCompositeConstruct %mat2v4half %90 %91
+               OpStore %86 %92 None
+               OpBranch %67
+         %67 = OpLabel
+         %71 = OpIAdd %uint %70 %uint_1
+               OpBranch %68
+         %69 = OpLabel
+        %l_a = OpLoad %_arr_mat2v4half_uint_4 %61 None
+         %73 = OpCompositeExtract %half %l_a_i_i 0
+         %74 = OpCompositeExtract %half %l_a 0 0 0
+         %75 = OpFAdd %half %73 %74
+         %76 = OpCompositeExtract %half %l_a_i 0 0
+         %77 = OpFAdd %half %75 %76
+         %78 = OpCompositeExtract %half %l_a_i_i 0
+         %79 = OpFAdd %half %77 %78
+         %80 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
+               OpStore %80 %79 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat2x4_f16_std140_uint_4_0 None %91
+%tint_convert_explicit_layout = OpFunction %_arr_mat2x4_f16_std140_uint_4_0 None %94
 %tint_source = OpFunctionParameter %_arr_mat2x4_f16_std140_uint_4
-         %92 = OpLabel
-         %93 = OpVariable %_ptr_Function__arr_mat2x4_f16_std140_uint_4 Function
-         %95 = OpVariable %_ptr_Function__arr_mat2x4_f16_std140_uint_4_0 Function %96
-               OpStore %93 %tint_source
-               OpBranch %97
-         %97 = OpLabel
+         %95 = OpLabel
+         %96 = OpVariable %_ptr_Function__arr_mat2x4_f16_std140_uint_4 Function
+         %98 = OpVariable %_ptr_Function__arr_mat2x4_f16_std140_uint_4_0 Function %99
+               OpStore %96 %tint_source
                OpBranch %100
         %100 = OpLabel
-        %102 = OpPhi %uint %uint_0 %97 %103 %99
-               OpLoopMerge %101 %99 None
-               OpBranch %98
-         %98 = OpLabel
-        %105 = OpUGreaterThanEqual %bool %102 %uint_4
-               OpSelectionMerge %106 None
-               OpBranchConditional %105 %107 %106
-        %107 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %105 = OpPhi %uint %uint_0 %100 %106 %102
+               OpLoopMerge %104 %102 None
                OpBranch %101
-        %106 = OpLabel
-        %108 = OpAccessChain %_ptr_Function_mat2x4_f16_std140 %93 %102
-        %109 = OpLoad %mat2x4_f16_std140 %108 None
-        %110 = OpAccessChain %_ptr_Function_mat2x4_f16_std140 %95 %102
-               OpStore %110 %109 None
-               OpBranch %99
-         %99 = OpLabel
-        %103 = OpIAdd %uint %102 %uint_1
-               OpBranch %100
         %101 = OpLabel
-        %104 = OpLoad %_arr_mat2x4_f16_std140_uint_4_0 %95 None
-               OpReturnValue %104
+        %108 = OpUGreaterThanEqual %bool %105 %uint_4
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpBranch %104
+        %109 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_mat2x4_f16_std140 %96 %105
+        %112 = OpLoad %mat2x4_f16_std140 %111 None
+        %113 = OpAccessChain %_ptr_Function_mat2x4_f16_std140 %98 %105
+               OpStore %113 %112 None
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpIAdd %uint %105 %uint_1
+               OpBranch %103
+        %104 = OpLabel
+        %107 = OpLoad %_arr_mat2x4_f16_std140_uint_4_0 %98 None
+               OpReturnValue %107
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 766a0a9..fae4d36 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -10,15 +10,16 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  uint v_3 = min(uint(i()), 1u);
+  uint v_3 = min(uint(i()), 3u);
+  uint v_4 = min(uint(i()), 1u);
   mat2x4 l_a[4] = v.inner;
-  mat2x4 l_a_i = v.inner[v_2];
-  vec4 l_a_i_i = v.inner[v_2][v_3];
-  v_1.inner = (((v.inner[v_2][v_3].x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat2x4 l_a_i = v.inner[v_3];
+  vec4 l_a_i_i = v.inner[v_3][v_4];
+  v_1.inner = (((v.inner[v_3][v_4].x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index f4bf821..f43bf49 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 85
+; Bound: 88
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -55,7 +55,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat2v4float_uint_4 = OpTypePointer Uniform %_arr_mat2v4float_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -65,76 +65,79 @@
 %_arr_mat2v4float_uint_4_0 = OpTypeArray %mat2v4float %uint_4
 %_ptr_Uniform_float = OpTypePointer Uniform %float
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
-         %62 = OpTypeFunction %_arr_mat2v4float_uint_4_0 %_arr_mat2v4float_uint_4
+         %65 = OpTypeFunction %_arr_mat2v4float_uint_4_0 %_arr_mat2v4float_uint_4
 %_ptr_Function__arr_mat2v4float_uint_4 = OpTypePointer Function %_arr_mat2v4float_uint_4
 %_ptr_Function__arr_mat2v4float_uint_4_0 = OpTypePointer Function %_arr_mat2v4float_uint_4_0
-         %68 = OpConstantNull %_arr_mat2v4float_uint_4_0
+         %71 = OpConstantNull %_arr_mat2v4float_uint_4_0
        %bool = OpTypeBool
 %_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
+          %f = OpFunction %void None %29
+         %30 = OpLabel
         %p_a = OpAccessChain %_ptr_Uniform__arr_mat2v4float_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-      %p_a_i = OpAccessChain %_ptr_Uniform_mat2v4float %p_a %33
-         %38 = OpFunctionCall %int %i
-         %39 = OpBitcast %uint %38
-         %40 = OpExtInst %uint %34 UMin %39 %uint_1
-    %p_a_i_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i %40
-         %44 = OpLoad %_arr_mat2v4float_uint_4 %p_a None
-        %l_a = OpFunctionCall %_arr_mat2v4float_uint_4_0 %tint_convert_explicit_layout %44
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+      %p_a_i = OpAccessChain %_ptr_Uniform_mat2v4float %p_a %36
+         %41 = OpFunctionCall %int %i
+         %42 = OpBitcast %uint %41
+         %43 = OpExtInst %uint %37 UMin %42 %uint_1
+    %p_a_i_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i %43
+         %47 = OpLoad %_arr_mat2v4float_uint_4 %p_a None
+        %l_a = OpFunctionCall %_arr_mat2v4float_uint_4_0 %tint_convert_explicit_layout %47
       %l_a_i = OpLoad %mat2v4float %p_a_i None
     %l_a_i_i = OpLoad %v4float %p_a_i_i None
-         %50 = OpAccessChain %_ptr_Uniform_float %p_a_i_i %uint_0
-         %52 = OpLoad %float %50 None
-         %53 = OpCompositeExtract %float %l_a 0 0 0
-         %54 = OpFAdd %float %52 %53
-         %55 = OpCompositeExtract %float %l_a_i 0 0
-         %56 = OpFAdd %float %54 %55
-         %57 = OpCompositeExtract %float %l_a_i_i 0
-         %58 = OpFAdd %float %56 %57
-         %59 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %59 %58 None
+         %53 = OpAccessChain %_ptr_Uniform_float %p_a_i_i %uint_0
+         %55 = OpLoad %float %53 None
+         %56 = OpCompositeExtract %float %l_a 0 0 0
+         %57 = OpFAdd %float %55 %56
+         %58 = OpCompositeExtract %float %l_a_i 0 0
+         %59 = OpFAdd %float %57 %58
+         %60 = OpCompositeExtract %float %l_a_i_i 0
+         %61 = OpFAdd %float %59 %60
+         %62 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %62 %61 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat2v4float_uint_4_0 None %62
+%tint_convert_explicit_layout = OpFunction %_arr_mat2v4float_uint_4_0 None %65
 %tint_source = OpFunctionParameter %_arr_mat2v4float_uint_4
-         %63 = OpLabel
-         %64 = OpVariable %_ptr_Function__arr_mat2v4float_uint_4 Function
-         %66 = OpVariable %_ptr_Function__arr_mat2v4float_uint_4_0 Function %68
-               OpStore %64 %tint_source
-               OpBranch %69
-         %69 = OpLabel
+         %66 = OpLabel
+         %67 = OpVariable %_ptr_Function__arr_mat2v4float_uint_4 Function
+         %69 = OpVariable %_ptr_Function__arr_mat2v4float_uint_4_0 Function %71
+               OpStore %67 %tint_source
                OpBranch %72
          %72 = OpLabel
-         %74 = OpPhi %uint %uint_0 %69 %75 %71
-               OpLoopMerge %73 %71 None
-               OpBranch %70
-         %70 = OpLabel
-         %77 = OpUGreaterThanEqual %bool %74 %uint_4
-               OpSelectionMerge %79 None
-               OpBranchConditional %77 %80 %79
-         %80 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+         %77 = OpPhi %uint %uint_0 %72 %78 %74
+               OpLoopMerge %76 %74 None
                OpBranch %73
-         %79 = OpLabel
-         %81 = OpAccessChain %_ptr_Function_mat2v4float %64 %74
-         %83 = OpLoad %mat2v4float %81 None
-         %84 = OpAccessChain %_ptr_Function_mat2v4float %66 %74
-               OpStore %84 %83 None
-               OpBranch %71
-         %71 = OpLabel
-         %75 = OpIAdd %uint %74 %uint_1
-               OpBranch %72
          %73 = OpLabel
-         %76 = OpLoad %_arr_mat2v4float_uint_4_0 %66 None
-               OpReturnValue %76
+         %80 = OpUGreaterThanEqual %bool %77 %uint_4
+               OpSelectionMerge %82 None
+               OpBranchConditional %80 %83 %82
+         %83 = OpLabel
+               OpBranch %76
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_mat2v4float %67 %77
+         %86 = OpLoad %mat2v4float %84 None
+         %87 = OpAccessChain %_ptr_Function_mat2v4float %69 %77
+               OpStore %87 %86 None
+               OpBranch %74
+         %74 = OpLabel
+         %78 = OpIAdd %uint %77 %uint_1
+               OpBranch %75
+         %76 = OpLabel
+         %79 = OpLoad %_arr_mat2v4float_uint_4_0 %69 None
+               OpReturnValue %79
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 9160a6c..a795335 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -20,33 +20,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  mat3 v_3 = mat3(v.inner[v_2].col0, v.inner[v_2].col1, v.inner[v_2].col2);
-  vec3 v_4 = v_3[min(uint(i()), 2u)];
-  mat3x3_f32_std140 v_5[4] = v.inner;
-  mat3 v_6[4] = mat3[4](mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)));
+  uint v_3 = min(uint(i()), 3u);
+  mat3 v_4 = mat3(v.inner[v_3].col0, v.inner[v_3].col1, v.inner[v_3].col2);
+  vec3 v_5 = v_4[min(uint(i()), 2u)];
+  mat3x3_f32_std140 v_6[4] = v.inner;
+  mat3 v_7[4] = mat3[4](mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = mat3(v_5[v_8].col0, v_5[v_8].col1, v_5[v_8].col2);
+      v_7[v_9] = mat3(v_6[v_9].col0, v_6[v_9].col1, v_6[v_9].col2);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  mat3 l_a[4] = v_6;
-  mat3 l_a_i = v_3;
-  vec3 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat3 l_a[4] = v_7;
+  mat3 l_a_i = v_4;
+  vec3 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 81a5773..3833506 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 115
+; Bound: 118
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -57,7 +57,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat3x3_f32_std140_uint_4 = OpTypePointer Uniform %_arr_mat3x3_f32_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -71,114 +71,117 @@
 %_ptr_Function__arr_mat3x3_f32_std140_uint_4_0 = OpTypePointer Function %_arr_mat3x3_f32_std140_uint_4_0
 %_arr_mat3v3float_uint_4 = OpTypeArray %mat3v3float %uint_4
 %_ptr_Function__arr_mat3v3float_uint_4 = OpTypePointer Function %_arr_mat3v3float_uint_4
-         %64 = OpConstantNull %_arr_mat3v3float_uint_4
+         %67 = OpConstantNull %_arr_mat3v3float_uint_4
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
        %bool = OpTypeBool
 %_ptr_Function_mat3x3_f32_std140 = OpTypePointer Function %mat3x3_f32_std140
-         %95 = OpTypeFunction %_arr_mat3x3_f32_std140_uint_4_0 %_arr_mat3x3_f32_std140_uint_4
+         %98 = OpTypeFunction %_arr_mat3x3_f32_std140_uint_4_0 %_arr_mat3x3_f32_std140_uint_4
 %_ptr_Function__arr_mat3x3_f32_std140_uint_4 = OpTypePointer Function %_arr_mat3x3_f32_std140_uint_4
-        %100 = OpConstantNull %_arr_mat3x3_f32_std140_uint_4_0
+        %103 = OpConstantNull %_arr_mat3x3_f32_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %47 = OpVariable %_ptr_Function_mat3v3float Function
-         %59 = OpVariable %_ptr_Function__arr_mat3x3_f32_std140_uint_4_0 Function
-         %61 = OpVariable %_ptr_Function__arr_mat3v3float_uint_4 Function %64
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat3x3_f32_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_0
-         %38 = OpLoad %v3float %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %50 = OpVariable %_ptr_Function_mat3v3float Function
+         %62 = OpVariable %_ptr_Function__arr_mat3x3_f32_std140_uint_4_0 Function
+         %64 = OpVariable %_ptr_Function__arr_mat3v3float_uint_4 Function %67
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat3x3_f32_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_0
          %41 = OpLoad %v3float %39 None
-         %42 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_2
+         %42 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_1
          %44 = OpLoad %v3float %42 None
-      %l_a_i = OpCompositeConstruct %mat3v3float %38 %41 %44
-               OpStore %47 %l_a_i
-         %49 = OpFunctionCall %int %i
-         %50 = OpBitcast %uint %49
-         %51 = OpExtInst %uint %34 UMin %50 %uint_2
-         %52 = OpAccessChain %_ptr_Function_v3float %47 %51
-    %l_a_i_i = OpLoad %v3float %52 None
-         %55 = OpLoad %_arr_mat3x3_f32_std140_uint_4 %28 None
-         %56 = OpFunctionCall %_arr_mat3x3_f32_std140_uint_4_0 %tint_convert_explicit_layout %55
-               OpStore %59 %56
-               OpBranch %65
-         %65 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_2
+         %47 = OpLoad %v3float %45 None
+      %l_a_i = OpCompositeConstruct %mat3v3float %41 %44 %47
+               OpStore %50 %l_a_i
+         %52 = OpFunctionCall %int %i
+         %53 = OpBitcast %uint %52
+         %54 = OpExtInst %uint %37 UMin %53 %uint_2
+         %55 = OpAccessChain %_ptr_Function_v3float %50 %54
+    %l_a_i_i = OpLoad %v3float %55 None
+         %58 = OpLoad %_arr_mat3x3_f32_std140_uint_4 %31 None
+         %59 = OpFunctionCall %_arr_mat3x3_f32_std140_uint_4_0 %tint_convert_explicit_layout %58
+               OpStore %62 %59
                OpBranch %68
          %68 = OpLabel
-         %70 = OpPhi %uint %uint_0 %65 %71 %67
-               OpLoopMerge %69 %67 None
-               OpBranch %66
-         %66 = OpLabel
-         %82 = OpUGreaterThanEqual %bool %70 %uint_4
-               OpSelectionMerge %84 None
-               OpBranchConditional %82 %85 %84
-         %85 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+         %73 = OpPhi %uint %uint_0 %68 %74 %70
+               OpLoopMerge %72 %70 None
                OpBranch %69
-         %84 = OpLabel
-         %86 = OpAccessChain %_ptr_Function_mat3v3float %61 %70
-         %87 = OpAccessChain %_ptr_Function_mat3x3_f32_std140 %59 %70
-         %89 = OpLoad %mat3x3_f32_std140 %87 None
-         %90 = OpCompositeExtract %v3float %89 0
-         %91 = OpCompositeExtract %v3float %89 1
-         %92 = OpCompositeExtract %v3float %89 2
-         %93 = OpCompositeConstruct %mat3v3float %90 %91 %92
-               OpStore %86 %93 None
-               OpBranch %67
-         %67 = OpLabel
-         %71 = OpIAdd %uint %70 %uint_1
-               OpBranch %68
          %69 = OpLabel
-        %l_a = OpLoad %_arr_mat3v3float_uint_4 %61 None
-         %73 = OpCompositeExtract %float %l_a_i_i 0
-         %74 = OpCompositeExtract %float %l_a 0 0 0
-         %75 = OpFAdd %float %73 %74
-         %76 = OpCompositeExtract %float %l_a_i 0 0
-         %77 = OpFAdd %float %75 %76
-         %78 = OpCompositeExtract %float %l_a_i_i 0
-         %79 = OpFAdd %float %77 %78
-         %80 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %80 %79 None
+         %85 = OpUGreaterThanEqual %bool %73 %uint_4
+               OpSelectionMerge %87 None
+               OpBranchConditional %85 %88 %87
+         %88 = OpLabel
+               OpBranch %72
+         %87 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_mat3v3float %64 %73
+         %90 = OpAccessChain %_ptr_Function_mat3x3_f32_std140 %62 %73
+         %92 = OpLoad %mat3x3_f32_std140 %90 None
+         %93 = OpCompositeExtract %v3float %92 0
+         %94 = OpCompositeExtract %v3float %92 1
+         %95 = OpCompositeExtract %v3float %92 2
+         %96 = OpCompositeConstruct %mat3v3float %93 %94 %95
+               OpStore %89 %96 None
+               OpBranch %70
+         %70 = OpLabel
+         %74 = OpIAdd %uint %73 %uint_1
+               OpBranch %71
+         %72 = OpLabel
+        %l_a = OpLoad %_arr_mat3v3float_uint_4 %64 None
+         %76 = OpCompositeExtract %float %l_a_i_i 0
+         %77 = OpCompositeExtract %float %l_a 0 0 0
+         %78 = OpFAdd %float %76 %77
+         %79 = OpCompositeExtract %float %l_a_i 0 0
+         %80 = OpFAdd %float %78 %79
+         %81 = OpCompositeExtract %float %l_a_i_i 0
+         %82 = OpFAdd %float %80 %81
+         %83 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %83 %82 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat3x3_f32_std140_uint_4_0 None %95
+%tint_convert_explicit_layout = OpFunction %_arr_mat3x3_f32_std140_uint_4_0 None %98
 %tint_source = OpFunctionParameter %_arr_mat3x3_f32_std140_uint_4
-         %96 = OpLabel
-         %97 = OpVariable %_ptr_Function__arr_mat3x3_f32_std140_uint_4 Function
-         %99 = OpVariable %_ptr_Function__arr_mat3x3_f32_std140_uint_4_0 Function %100
-               OpStore %97 %tint_source
-               OpBranch %101
-        %101 = OpLabel
+         %99 = OpLabel
+        %100 = OpVariable %_ptr_Function__arr_mat3x3_f32_std140_uint_4 Function
+        %102 = OpVariable %_ptr_Function__arr_mat3x3_f32_std140_uint_4_0 Function %103
+               OpStore %100 %tint_source
                OpBranch %104
         %104 = OpLabel
-        %106 = OpPhi %uint %uint_0 %101 %107 %103
-               OpLoopMerge %105 %103 None
-               OpBranch %102
-        %102 = OpLabel
-        %109 = OpUGreaterThanEqual %bool %106 %uint_4
-               OpSelectionMerge %110 None
-               OpBranchConditional %109 %111 %110
-        %111 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %109 = OpPhi %uint %uint_0 %104 %110 %106
+               OpLoopMerge %108 %106 None
                OpBranch %105
-        %110 = OpLabel
-        %112 = OpAccessChain %_ptr_Function_mat3x3_f32_std140 %97 %106
-        %113 = OpLoad %mat3x3_f32_std140 %112 None
-        %114 = OpAccessChain %_ptr_Function_mat3x3_f32_std140 %99 %106
-               OpStore %114 %113 None
-               OpBranch %103
-        %103 = OpLabel
-        %107 = OpIAdd %uint %106 %uint_1
-               OpBranch %104
         %105 = OpLabel
-        %108 = OpLoad %_arr_mat3x3_f32_std140_uint_4_0 %99 None
-               OpReturnValue %108
+        %112 = OpUGreaterThanEqual %bool %109 %uint_4
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+               OpBranch %108
+        %113 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_mat3x3_f32_std140 %100 %109
+        %116 = OpLoad %mat3x3_f32_std140 %115 None
+        %117 = OpAccessChain %_ptr_Function_mat3x3_f32_std140 %102 %109
+               OpStore %117 %116 None
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpIAdd %uint %109 %uint_1
+               OpBranch %107
+        %108 = OpLabel
+        %111 = OpLoad %_arr_mat3x3_f32_std140_uint_4_0 %102 None
+               OpReturnValue %111
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 0e02c7d..3dec4d6 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -10,15 +10,16 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  uint v_3 = min(uint(i()), 2u);
+  uint v_3 = min(uint(i()), 3u);
+  uint v_4 = min(uint(i()), 2u);
   mat3x4 l_a[4] = v.inner;
-  mat3x4 l_a_i = v.inner[v_2];
-  vec4 l_a_i_i = v.inner[v_2][v_3];
-  v_1.inner = (((v.inner[v_2][v_3].x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat3x4 l_a_i = v.inner[v_3];
+  vec4 l_a_i_i = v.inner[v_3][v_4];
+  v_1.inner = (((v.inner[v_3][v_4].x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 2ac6f4f..32e7e93 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 86
+; Bound: 89
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -55,7 +55,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat3v4float_uint_4 = OpTypePointer Uniform %_arr_mat3v4float_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -65,77 +65,80 @@
 %_arr_mat3v4float_uint_4_0 = OpTypeArray %mat3v4float %uint_4
 %_ptr_Uniform_float = OpTypePointer Uniform %float
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
-         %62 = OpTypeFunction %_arr_mat3v4float_uint_4_0 %_arr_mat3v4float_uint_4
+         %65 = OpTypeFunction %_arr_mat3v4float_uint_4_0 %_arr_mat3v4float_uint_4
 %_ptr_Function__arr_mat3v4float_uint_4 = OpTypePointer Function %_arr_mat3v4float_uint_4
 %_ptr_Function__arr_mat3v4float_uint_4_0 = OpTypePointer Function %_arr_mat3v4float_uint_4_0
-         %68 = OpConstantNull %_arr_mat3v4float_uint_4_0
+         %71 = OpConstantNull %_arr_mat3v4float_uint_4_0
        %bool = OpTypeBool
 %_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
      %uint_1 = OpConstant %uint 1
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
+          %f = OpFunction %void None %29
+         %30 = OpLabel
         %p_a = OpAccessChain %_ptr_Uniform__arr_mat3v4float_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-      %p_a_i = OpAccessChain %_ptr_Uniform_mat3v4float %p_a %33
-         %38 = OpFunctionCall %int %i
-         %39 = OpBitcast %uint %38
-         %40 = OpExtInst %uint %34 UMin %39 %uint_2
-    %p_a_i_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i %40
-         %44 = OpLoad %_arr_mat3v4float_uint_4 %p_a None
-        %l_a = OpFunctionCall %_arr_mat3v4float_uint_4_0 %tint_convert_explicit_layout %44
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+      %p_a_i = OpAccessChain %_ptr_Uniform_mat3v4float %p_a %36
+         %41 = OpFunctionCall %int %i
+         %42 = OpBitcast %uint %41
+         %43 = OpExtInst %uint %37 UMin %42 %uint_2
+    %p_a_i_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i %43
+         %47 = OpLoad %_arr_mat3v4float_uint_4 %p_a None
+        %l_a = OpFunctionCall %_arr_mat3v4float_uint_4_0 %tint_convert_explicit_layout %47
       %l_a_i = OpLoad %mat3v4float %p_a_i None
     %l_a_i_i = OpLoad %v4float %p_a_i_i None
-         %50 = OpAccessChain %_ptr_Uniform_float %p_a_i_i %uint_0
-         %52 = OpLoad %float %50 None
-         %53 = OpCompositeExtract %float %l_a 0 0 0
-         %54 = OpFAdd %float %52 %53
-         %55 = OpCompositeExtract %float %l_a_i 0 0
-         %56 = OpFAdd %float %54 %55
-         %57 = OpCompositeExtract %float %l_a_i_i 0
-         %58 = OpFAdd %float %56 %57
-         %59 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %59 %58 None
+         %53 = OpAccessChain %_ptr_Uniform_float %p_a_i_i %uint_0
+         %55 = OpLoad %float %53 None
+         %56 = OpCompositeExtract %float %l_a 0 0 0
+         %57 = OpFAdd %float %55 %56
+         %58 = OpCompositeExtract %float %l_a_i 0 0
+         %59 = OpFAdd %float %57 %58
+         %60 = OpCompositeExtract %float %l_a_i_i 0
+         %61 = OpFAdd %float %59 %60
+         %62 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %62 %61 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat3v4float_uint_4_0 None %62
+%tint_convert_explicit_layout = OpFunction %_arr_mat3v4float_uint_4_0 None %65
 %tint_source = OpFunctionParameter %_arr_mat3v4float_uint_4
-         %63 = OpLabel
-         %64 = OpVariable %_ptr_Function__arr_mat3v4float_uint_4 Function
-         %66 = OpVariable %_ptr_Function__arr_mat3v4float_uint_4_0 Function %68
-               OpStore %64 %tint_source
-               OpBranch %69
-         %69 = OpLabel
+         %66 = OpLabel
+         %67 = OpVariable %_ptr_Function__arr_mat3v4float_uint_4 Function
+         %69 = OpVariable %_ptr_Function__arr_mat3v4float_uint_4_0 Function %71
+               OpStore %67 %tint_source
                OpBranch %72
          %72 = OpLabel
-         %74 = OpPhi %uint %uint_0 %69 %75 %71
-               OpLoopMerge %73 %71 None
-               OpBranch %70
-         %70 = OpLabel
-         %77 = OpUGreaterThanEqual %bool %74 %uint_4
-               OpSelectionMerge %79 None
-               OpBranchConditional %77 %80 %79
-         %80 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+         %77 = OpPhi %uint %uint_0 %72 %78 %74
+               OpLoopMerge %76 %74 None
                OpBranch %73
-         %79 = OpLabel
-         %81 = OpAccessChain %_ptr_Function_mat3v4float %64 %74
-         %83 = OpLoad %mat3v4float %81 None
-         %84 = OpAccessChain %_ptr_Function_mat3v4float %66 %74
-               OpStore %84 %83 None
-               OpBranch %71
-         %71 = OpLabel
-         %75 = OpIAdd %uint %74 %uint_1
-               OpBranch %72
          %73 = OpLabel
-         %76 = OpLoad %_arr_mat3v4float_uint_4_0 %66 None
-               OpReturnValue %76
+         %80 = OpUGreaterThanEqual %bool %77 %uint_4
+               OpSelectionMerge %82 None
+               OpBranchConditional %80 %83 %82
+         %83 = OpLabel
+               OpBranch %76
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_mat3v4float %67 %77
+         %86 = OpLoad %mat3v4float %84 None
+         %87 = OpAccessChain %_ptr_Function_mat3v4float %69 %77
+               OpStore %87 %86 None
+               OpBranch %74
+         %74 = OpLabel
+         %78 = OpIAdd %uint %77 %uint_1
+               OpBranch %75
+         %76 = OpLabel
+         %79 = OpLoad %_arr_mat3v4float_uint_4_0 %69 None
+               OpReturnValue %79
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 2282894..928ecfc 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -19,33 +19,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  f16mat4x2 v_3 = f16mat4x2(v.inner[v_2].col0, v.inner[v_2].col1, v.inner[v_2].col2, v.inner[v_2].col3);
-  f16vec2 v_4 = v_3[min(uint(i()), 3u)];
-  mat4x2_f16_std140 v_5[4] = v.inner;
-  f16mat4x2 v_6[4] = f16mat4x2[4](f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)));
+  uint v_3 = min(uint(i()), 3u);
+  f16mat4x2 v_4 = f16mat4x2(v.inner[v_3].col0, v.inner[v_3].col1, v.inner[v_3].col2, v.inner[v_3].col3);
+  f16vec2 v_5 = v_4[min(uint(i()), 3u)];
+  mat4x2_f16_std140 v_6[4] = v.inner;
+  f16mat4x2 v_7[4] = f16mat4x2[4](f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = f16mat4x2(v_5[v_8].col0, v_5[v_8].col1, v_5[v_8].col2, v_5[v_8].col3);
+      v_7[v_9] = f16mat4x2(v_6[v_9].col0, v_6[v_9].col1, v_6[v_9].col2, v_6[v_9].col3);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  f16mat4x2 l_a[4] = v_6;
-  f16mat4x2 l_a_i = v_3;
-  f16vec2 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  f16mat4x2 l_a[4] = v_7;
+  f16mat4x2 l_a_i = v_4;
+  f16vec2 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 167cfdc..681edc1 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 118
+; Bound: 121
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -62,7 +62,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat4x2_f16_std140_uint_4 = OpTypePointer Uniform %_arr_mat4x2_f16_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -76,117 +76,120 @@
 %_ptr_Function__arr_mat4x2_f16_std140_uint_4_0 = OpTypePointer Function %_arr_mat4x2_f16_std140_uint_4_0
 %_arr_mat4v2half_uint_4 = OpTypeArray %mat4v2half %uint_4
 %_ptr_Function__arr_mat4v2half_uint_4 = OpTypePointer Function %_arr_mat4v2half_uint_4
-         %66 = OpConstantNull %_arr_mat4v2half_uint_4
+         %69 = OpConstantNull %_arr_mat4v2half_uint_4
 %_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
        %bool = OpTypeBool
 %_ptr_Function_mat4x2_f16_std140 = OpTypePointer Function %mat4x2_f16_std140
-         %98 = OpTypeFunction %_arr_mat4x2_f16_std140_uint_4_0 %_arr_mat4x2_f16_std140_uint_4
+        %101 = OpTypeFunction %_arr_mat4x2_f16_std140_uint_4_0 %_arr_mat4x2_f16_std140_uint_4
 %_ptr_Function__arr_mat4x2_f16_std140_uint_4 = OpTypePointer Function %_arr_mat4x2_f16_std140_uint_4
-        %103 = OpConstantNull %_arr_mat4x2_f16_std140_uint_4_0
+        %106 = OpConstantNull %_arr_mat4x2_f16_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %49 = OpVariable %_ptr_Function_mat4v2half Function
-         %61 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_4_0 Function
-         %63 = OpVariable %_ptr_Function__arr_mat4v2half_uint_4 Function %66
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat4x2_f16_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v2half %28 %33 %uint_0
-         %38 = OpLoad %v2half %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v2half %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %52 = OpVariable %_ptr_Function_mat4v2half Function
+         %64 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_4_0 Function
+         %66 = OpVariable %_ptr_Function__arr_mat4v2half_uint_4 Function %69
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat4x2_f16_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v2half %31 %36 %uint_0
          %41 = OpLoad %v2half %39 None
-         %42 = OpAccessChain %_ptr_Uniform_v2half %28 %33 %uint_2
+         %42 = OpAccessChain %_ptr_Uniform_v2half %31 %36 %uint_1
          %44 = OpLoad %v2half %42 None
-         %45 = OpAccessChain %_ptr_Uniform_v2half %28 %33 %uint_3
-         %46 = OpLoad %v2half %45 None
-      %l_a_i = OpCompositeConstruct %mat4v2half %38 %41 %44 %46
-               OpStore %49 %l_a_i
-         %51 = OpFunctionCall %int %i
-         %52 = OpBitcast %uint %51
-         %53 = OpExtInst %uint %34 UMin %52 %uint_3
-         %54 = OpAccessChain %_ptr_Function_v2half %49 %53
-    %l_a_i_i = OpLoad %v2half %54 None
-         %57 = OpLoad %_arr_mat4x2_f16_std140_uint_4 %28 None
-         %58 = OpFunctionCall %_arr_mat4x2_f16_std140_uint_4_0 %tint_convert_explicit_layout %57
-               OpStore %61 %58
-               OpBranch %67
-         %67 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_v2half %31 %36 %uint_2
+         %47 = OpLoad %v2half %45 None
+         %48 = OpAccessChain %_ptr_Uniform_v2half %31 %36 %uint_3
+         %49 = OpLoad %v2half %48 None
+      %l_a_i = OpCompositeConstruct %mat4v2half %41 %44 %47 %49
+               OpStore %52 %l_a_i
+         %54 = OpFunctionCall %int %i
+         %55 = OpBitcast %uint %54
+         %56 = OpExtInst %uint %37 UMin %55 %uint_3
+         %57 = OpAccessChain %_ptr_Function_v2half %52 %56
+    %l_a_i_i = OpLoad %v2half %57 None
+         %60 = OpLoad %_arr_mat4x2_f16_std140_uint_4 %31 None
+         %61 = OpFunctionCall %_arr_mat4x2_f16_std140_uint_4_0 %tint_convert_explicit_layout %60
+               OpStore %64 %61
                OpBranch %70
          %70 = OpLabel
-         %72 = OpPhi %uint %uint_0 %67 %73 %69
-               OpLoopMerge %71 %69 None
-               OpBranch %68
-         %68 = OpLabel
-         %84 = OpUGreaterThanEqual %bool %72 %uint_4
-               OpSelectionMerge %86 None
-               OpBranchConditional %84 %87 %86
-         %87 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %75 = OpPhi %uint %uint_0 %70 %76 %72
+               OpLoopMerge %74 %72 None
                OpBranch %71
-         %86 = OpLabel
-         %88 = OpAccessChain %_ptr_Function_mat4v2half %63 %72
-         %89 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %61 %72
-         %91 = OpLoad %mat4x2_f16_std140 %89 None
-         %92 = OpCompositeExtract %v2half %91 0
-         %93 = OpCompositeExtract %v2half %91 1
-         %94 = OpCompositeExtract %v2half %91 2
-         %95 = OpCompositeExtract %v2half %91 3
-         %96 = OpCompositeConstruct %mat4v2half %92 %93 %94 %95
-               OpStore %88 %96 None
-               OpBranch %69
-         %69 = OpLabel
-         %73 = OpIAdd %uint %72 %uint_1
-               OpBranch %70
          %71 = OpLabel
-        %l_a = OpLoad %_arr_mat4v2half_uint_4 %63 None
-         %75 = OpCompositeExtract %half %l_a_i_i 0
-         %76 = OpCompositeExtract %half %l_a 0 0 0
-         %77 = OpFAdd %half %75 %76
-         %78 = OpCompositeExtract %half %l_a_i 0 0
-         %79 = OpFAdd %half %77 %78
-         %80 = OpCompositeExtract %half %l_a_i_i 0
-         %81 = OpFAdd %half %79 %80
-         %82 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
-               OpStore %82 %81 None
+         %87 = OpUGreaterThanEqual %bool %75 %uint_4
+               OpSelectionMerge %89 None
+               OpBranchConditional %87 %90 %89
+         %90 = OpLabel
+               OpBranch %74
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_mat4v2half %66 %75
+         %92 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %64 %75
+         %94 = OpLoad %mat4x2_f16_std140 %92 None
+         %95 = OpCompositeExtract %v2half %94 0
+         %96 = OpCompositeExtract %v2half %94 1
+         %97 = OpCompositeExtract %v2half %94 2
+         %98 = OpCompositeExtract %v2half %94 3
+         %99 = OpCompositeConstruct %mat4v2half %95 %96 %97 %98
+               OpStore %91 %99 None
+               OpBranch %72
+         %72 = OpLabel
+         %76 = OpIAdd %uint %75 %uint_1
+               OpBranch %73
+         %74 = OpLabel
+        %l_a = OpLoad %_arr_mat4v2half_uint_4 %66 None
+         %78 = OpCompositeExtract %half %l_a_i_i 0
+         %79 = OpCompositeExtract %half %l_a 0 0 0
+         %80 = OpFAdd %half %78 %79
+         %81 = OpCompositeExtract %half %l_a_i 0 0
+         %82 = OpFAdd %half %80 %81
+         %83 = OpCompositeExtract %half %l_a_i_i 0
+         %84 = OpFAdd %half %82 %83
+         %85 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
+               OpStore %85 %84 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat4x2_f16_std140_uint_4_0 None %98
+%tint_convert_explicit_layout = OpFunction %_arr_mat4x2_f16_std140_uint_4_0 None %101
 %tint_source = OpFunctionParameter %_arr_mat4x2_f16_std140_uint_4
-         %99 = OpLabel
-        %100 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_4 Function
-        %102 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_4_0 Function %103
-               OpStore %100 %tint_source
-               OpBranch %104
-        %104 = OpLabel
+        %102 = OpLabel
+        %103 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_4 Function
+        %105 = OpVariable %_ptr_Function__arr_mat4x2_f16_std140_uint_4_0 Function %106
+               OpStore %103 %tint_source
                OpBranch %107
         %107 = OpLabel
-        %109 = OpPhi %uint %uint_0 %104 %110 %106
-               OpLoopMerge %108 %106 None
-               OpBranch %105
-        %105 = OpLabel
-        %112 = OpUGreaterThanEqual %bool %109 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %112 %114 %113
-        %114 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %112 = OpPhi %uint %uint_0 %107 %113 %109
+               OpLoopMerge %111 %109 None
                OpBranch %108
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %100 %109
-        %116 = OpLoad %mat4x2_f16_std140 %115 None
-        %117 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %102 %109
-               OpStore %117 %116 None
-               OpBranch %106
-        %106 = OpLabel
-        %110 = OpIAdd %uint %109 %uint_1
-               OpBranch %107
         %108 = OpLabel
-        %111 = OpLoad %_arr_mat4x2_f16_std140_uint_4_0 %102 None
-               OpReturnValue %111
+        %115 = OpUGreaterThanEqual %bool %112 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %111
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %103 %112
+        %119 = OpLoad %mat4x2_f16_std140 %118 None
+        %120 = OpAccessChain %_ptr_Function_mat4x2_f16_std140 %105 %112
+               OpStore %120 %119 None
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpIAdd %uint %112 %uint_1
+               OpBranch %110
+        %111 = OpLabel
+        %114 = OpLoad %_arr_mat4x2_f16_std140_uint_4_0 %105 None
+               OpReturnValue %114
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 09bd5a1..b3f67ae 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -18,33 +18,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  mat4x2 v_3 = mat4x2(v.inner[v_2].col0, v.inner[v_2].col1, v.inner[v_2].col2, v.inner[v_2].col3);
-  vec2 v_4 = v_3[min(uint(i()), 3u)];
-  mat4x2_f32_std140 v_5[4] = v.inner;
-  mat4x2 v_6[4] = mat4x2[4](mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)));
+  uint v_3 = min(uint(i()), 3u);
+  mat4x2 v_4 = mat4x2(v.inner[v_3].col0, v.inner[v_3].col1, v.inner[v_3].col2, v.inner[v_3].col3);
+  vec2 v_5 = v_4[min(uint(i()), 3u)];
+  mat4x2_f32_std140 v_6[4] = v.inner;
+  mat4x2 v_7[4] = mat4x2[4](mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = mat4x2(v_5[v_8].col0, v_5[v_8].col1, v_5[v_8].col2, v_5[v_8].col3);
+      v_7[v_9] = mat4x2(v_6[v_9].col0, v_6[v_9].col1, v_6[v_9].col2, v_6[v_9].col3);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  mat4x2 l_a[4] = v_6;
-  mat4x2 l_a_i = v_3;
-  vec2 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat4x2 l_a[4] = v_7;
+  mat4x2 l_a_i = v_4;
+  vec2 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index e397eba..c7cec0f 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 118
+; Bound: 121
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -59,7 +59,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat4x2_f32_std140_uint_4 = OpTypePointer Uniform %_arr_mat4x2_f32_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -73,117 +73,120 @@
 %_ptr_Function__arr_mat4x2_f32_std140_uint_4_0 = OpTypePointer Function %_arr_mat4x2_f32_std140_uint_4_0
 %_arr_mat4v2float_uint_4 = OpTypeArray %mat4v2float %uint_4
 %_ptr_Function__arr_mat4v2float_uint_4 = OpTypePointer Function %_arr_mat4v2float_uint_4
-         %66 = OpConstantNull %_arr_mat4v2float_uint_4
+         %69 = OpConstantNull %_arr_mat4v2float_uint_4
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
        %bool = OpTypeBool
 %_ptr_Function_mat4x2_f32_std140 = OpTypePointer Function %mat4x2_f32_std140
-         %98 = OpTypeFunction %_arr_mat4x2_f32_std140_uint_4_0 %_arr_mat4x2_f32_std140_uint_4
+        %101 = OpTypeFunction %_arr_mat4x2_f32_std140_uint_4_0 %_arr_mat4x2_f32_std140_uint_4
 %_ptr_Function__arr_mat4x2_f32_std140_uint_4 = OpTypePointer Function %_arr_mat4x2_f32_std140_uint_4
-        %103 = OpConstantNull %_arr_mat4x2_f32_std140_uint_4_0
+        %106 = OpConstantNull %_arr_mat4x2_f32_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %49 = OpVariable %_ptr_Function_mat4v2float Function
-         %61 = OpVariable %_ptr_Function__arr_mat4x2_f32_std140_uint_4_0 Function
-         %63 = OpVariable %_ptr_Function__arr_mat4v2float_uint_4 Function %66
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat4x2_f32_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v2float %28 %33 %uint_0
-         %38 = OpLoad %v2float %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v2float %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %52 = OpVariable %_ptr_Function_mat4v2float Function
+         %64 = OpVariable %_ptr_Function__arr_mat4x2_f32_std140_uint_4_0 Function
+         %66 = OpVariable %_ptr_Function__arr_mat4v2float_uint_4 Function %69
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat4x2_f32_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v2float %31 %36 %uint_0
          %41 = OpLoad %v2float %39 None
-         %42 = OpAccessChain %_ptr_Uniform_v2float %28 %33 %uint_2
+         %42 = OpAccessChain %_ptr_Uniform_v2float %31 %36 %uint_1
          %44 = OpLoad %v2float %42 None
-         %45 = OpAccessChain %_ptr_Uniform_v2float %28 %33 %uint_3
-         %46 = OpLoad %v2float %45 None
-      %l_a_i = OpCompositeConstruct %mat4v2float %38 %41 %44 %46
-               OpStore %49 %l_a_i
-         %51 = OpFunctionCall %int %i
-         %52 = OpBitcast %uint %51
-         %53 = OpExtInst %uint %34 UMin %52 %uint_3
-         %54 = OpAccessChain %_ptr_Function_v2float %49 %53
-    %l_a_i_i = OpLoad %v2float %54 None
-         %57 = OpLoad %_arr_mat4x2_f32_std140_uint_4 %28 None
-         %58 = OpFunctionCall %_arr_mat4x2_f32_std140_uint_4_0 %tint_convert_explicit_layout %57
-               OpStore %61 %58
-               OpBranch %67
-         %67 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_v2float %31 %36 %uint_2
+         %47 = OpLoad %v2float %45 None
+         %48 = OpAccessChain %_ptr_Uniform_v2float %31 %36 %uint_3
+         %49 = OpLoad %v2float %48 None
+      %l_a_i = OpCompositeConstruct %mat4v2float %41 %44 %47 %49
+               OpStore %52 %l_a_i
+         %54 = OpFunctionCall %int %i
+         %55 = OpBitcast %uint %54
+         %56 = OpExtInst %uint %37 UMin %55 %uint_3
+         %57 = OpAccessChain %_ptr_Function_v2float %52 %56
+    %l_a_i_i = OpLoad %v2float %57 None
+         %60 = OpLoad %_arr_mat4x2_f32_std140_uint_4 %31 None
+         %61 = OpFunctionCall %_arr_mat4x2_f32_std140_uint_4_0 %tint_convert_explicit_layout %60
+               OpStore %64 %61
                OpBranch %70
          %70 = OpLabel
-         %72 = OpPhi %uint %uint_0 %67 %73 %69
-               OpLoopMerge %71 %69 None
-               OpBranch %68
-         %68 = OpLabel
-         %84 = OpUGreaterThanEqual %bool %72 %uint_4
-               OpSelectionMerge %86 None
-               OpBranchConditional %84 %87 %86
-         %87 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %75 = OpPhi %uint %uint_0 %70 %76 %72
+               OpLoopMerge %74 %72 None
                OpBranch %71
-         %86 = OpLabel
-         %88 = OpAccessChain %_ptr_Function_mat4v2float %63 %72
-         %89 = OpAccessChain %_ptr_Function_mat4x2_f32_std140 %61 %72
-         %91 = OpLoad %mat4x2_f32_std140 %89 None
-         %92 = OpCompositeExtract %v2float %91 0
-         %93 = OpCompositeExtract %v2float %91 1
-         %94 = OpCompositeExtract %v2float %91 2
-         %95 = OpCompositeExtract %v2float %91 3
-         %96 = OpCompositeConstruct %mat4v2float %92 %93 %94 %95
-               OpStore %88 %96 None
-               OpBranch %69
-         %69 = OpLabel
-         %73 = OpIAdd %uint %72 %uint_1
-               OpBranch %70
          %71 = OpLabel
-        %l_a = OpLoad %_arr_mat4v2float_uint_4 %63 None
-         %75 = OpCompositeExtract %float %l_a_i_i 0
-         %76 = OpCompositeExtract %float %l_a 0 0 0
-         %77 = OpFAdd %float %75 %76
-         %78 = OpCompositeExtract %float %l_a_i 0 0
-         %79 = OpFAdd %float %77 %78
-         %80 = OpCompositeExtract %float %l_a_i_i 0
-         %81 = OpFAdd %float %79 %80
-         %82 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %82 %81 None
+         %87 = OpUGreaterThanEqual %bool %75 %uint_4
+               OpSelectionMerge %89 None
+               OpBranchConditional %87 %90 %89
+         %90 = OpLabel
+               OpBranch %74
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_mat4v2float %66 %75
+         %92 = OpAccessChain %_ptr_Function_mat4x2_f32_std140 %64 %75
+         %94 = OpLoad %mat4x2_f32_std140 %92 None
+         %95 = OpCompositeExtract %v2float %94 0
+         %96 = OpCompositeExtract %v2float %94 1
+         %97 = OpCompositeExtract %v2float %94 2
+         %98 = OpCompositeExtract %v2float %94 3
+         %99 = OpCompositeConstruct %mat4v2float %95 %96 %97 %98
+               OpStore %91 %99 None
+               OpBranch %72
+         %72 = OpLabel
+         %76 = OpIAdd %uint %75 %uint_1
+               OpBranch %73
+         %74 = OpLabel
+        %l_a = OpLoad %_arr_mat4v2float_uint_4 %66 None
+         %78 = OpCompositeExtract %float %l_a_i_i 0
+         %79 = OpCompositeExtract %float %l_a 0 0 0
+         %80 = OpFAdd %float %78 %79
+         %81 = OpCompositeExtract %float %l_a_i 0 0
+         %82 = OpFAdd %float %80 %81
+         %83 = OpCompositeExtract %float %l_a_i_i 0
+         %84 = OpFAdd %float %82 %83
+         %85 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %85 %84 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat4x2_f32_std140_uint_4_0 None %98
+%tint_convert_explicit_layout = OpFunction %_arr_mat4x2_f32_std140_uint_4_0 None %101
 %tint_source = OpFunctionParameter %_arr_mat4x2_f32_std140_uint_4
-         %99 = OpLabel
-        %100 = OpVariable %_ptr_Function__arr_mat4x2_f32_std140_uint_4 Function
-        %102 = OpVariable %_ptr_Function__arr_mat4x2_f32_std140_uint_4_0 Function %103
-               OpStore %100 %tint_source
-               OpBranch %104
-        %104 = OpLabel
+        %102 = OpLabel
+        %103 = OpVariable %_ptr_Function__arr_mat4x2_f32_std140_uint_4 Function
+        %105 = OpVariable %_ptr_Function__arr_mat4x2_f32_std140_uint_4_0 Function %106
+               OpStore %103 %tint_source
                OpBranch %107
         %107 = OpLabel
-        %109 = OpPhi %uint %uint_0 %104 %110 %106
-               OpLoopMerge %108 %106 None
-               OpBranch %105
-        %105 = OpLabel
-        %112 = OpUGreaterThanEqual %bool %109 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %112 %114 %113
-        %114 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %112 = OpPhi %uint %uint_0 %107 %113 %109
+               OpLoopMerge %111 %109 None
                OpBranch %108
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_mat4x2_f32_std140 %100 %109
-        %116 = OpLoad %mat4x2_f32_std140 %115 None
-        %117 = OpAccessChain %_ptr_Function_mat4x2_f32_std140 %102 %109
-               OpStore %117 %116 None
-               OpBranch %106
-        %106 = OpLabel
-        %110 = OpIAdd %uint %109 %uint_1
-               OpBranch %107
         %108 = OpLabel
-        %111 = OpLoad %_arr_mat4x2_f32_std140_uint_4_0 %102 None
-               OpReturnValue %111
+        %115 = OpUGreaterThanEqual %bool %112 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %111
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_mat4x2_f32_std140 %103 %112
+        %119 = OpLoad %mat4x2_f32_std140 %118 None
+        %120 = OpAccessChain %_ptr_Function_mat4x2_f32_std140 %105 %112
+               OpStore %120 %119 None
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpIAdd %uint %112 %uint_1
+               OpBranch %110
+        %111 = OpLabel
+        %114 = OpLoad %_arr_mat4x2_f32_std140_uint_4_0 %105 None
+               OpReturnValue %114
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index a7beaaa..cfe27b8 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -19,33 +19,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  f16mat4x3 v_3 = f16mat4x3(v.inner[v_2].col0, v.inner[v_2].col1, v.inner[v_2].col2, v.inner[v_2].col3);
-  f16vec3 v_4 = v_3[min(uint(i()), 3u)];
-  mat4x3_f16_std140 v_5[4] = v.inner;
-  f16mat4x3 v_6[4] = f16mat4x3[4](f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)));
+  uint v_3 = min(uint(i()), 3u);
+  f16mat4x3 v_4 = f16mat4x3(v.inner[v_3].col0, v.inner[v_3].col1, v.inner[v_3].col2, v.inner[v_3].col3);
+  f16vec3 v_5 = v_4[min(uint(i()), 3u)];
+  mat4x3_f16_std140 v_6[4] = v.inner;
+  f16mat4x3 v_7[4] = f16mat4x3[4](f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = f16mat4x3(v_5[v_8].col0, v_5[v_8].col1, v_5[v_8].col2, v_5[v_8].col3);
+      v_7[v_9] = f16mat4x3(v_6[v_9].col0, v_6[v_9].col1, v_6[v_9].col2, v_6[v_9].col3);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  f16mat4x3 l_a[4] = v_6;
-  f16mat4x3 l_a_i = v_3;
-  f16vec3 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  f16mat4x3 l_a[4] = v_7;
+  f16mat4x3 l_a_i = v_4;
+  f16vec3 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index efa2753..338b387 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 118
+; Bound: 121
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -62,7 +62,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat4x3_f16_std140_uint_4 = OpTypePointer Uniform %_arr_mat4x3_f16_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -76,117 +76,120 @@
 %_ptr_Function__arr_mat4x3_f16_std140_uint_4_0 = OpTypePointer Function %_arr_mat4x3_f16_std140_uint_4_0
 %_arr_mat4v3half_uint_4 = OpTypeArray %mat4v3half %uint_4
 %_ptr_Function__arr_mat4v3half_uint_4 = OpTypePointer Function %_arr_mat4v3half_uint_4
-         %66 = OpConstantNull %_arr_mat4v3half_uint_4
+         %69 = OpConstantNull %_arr_mat4v3half_uint_4
 %_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
        %bool = OpTypeBool
 %_ptr_Function_mat4x3_f16_std140 = OpTypePointer Function %mat4x3_f16_std140
-         %98 = OpTypeFunction %_arr_mat4x3_f16_std140_uint_4_0 %_arr_mat4x3_f16_std140_uint_4
+        %101 = OpTypeFunction %_arr_mat4x3_f16_std140_uint_4_0 %_arr_mat4x3_f16_std140_uint_4
 %_ptr_Function__arr_mat4x3_f16_std140_uint_4 = OpTypePointer Function %_arr_mat4x3_f16_std140_uint_4
-        %103 = OpConstantNull %_arr_mat4x3_f16_std140_uint_4_0
+        %106 = OpConstantNull %_arr_mat4x3_f16_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %49 = OpVariable %_ptr_Function_mat4v3half Function
-         %61 = OpVariable %_ptr_Function__arr_mat4x3_f16_std140_uint_4_0 Function
-         %63 = OpVariable %_ptr_Function__arr_mat4v3half_uint_4 Function %66
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat4x3_f16_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v3half %28 %33 %uint_0
-         %38 = OpLoad %v3half %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v3half %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %52 = OpVariable %_ptr_Function_mat4v3half Function
+         %64 = OpVariable %_ptr_Function__arr_mat4x3_f16_std140_uint_4_0 Function
+         %66 = OpVariable %_ptr_Function__arr_mat4v3half_uint_4 Function %69
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat4x3_f16_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v3half %31 %36 %uint_0
          %41 = OpLoad %v3half %39 None
-         %42 = OpAccessChain %_ptr_Uniform_v3half %28 %33 %uint_2
+         %42 = OpAccessChain %_ptr_Uniform_v3half %31 %36 %uint_1
          %44 = OpLoad %v3half %42 None
-         %45 = OpAccessChain %_ptr_Uniform_v3half %28 %33 %uint_3
-         %46 = OpLoad %v3half %45 None
-      %l_a_i = OpCompositeConstruct %mat4v3half %38 %41 %44 %46
-               OpStore %49 %l_a_i
-         %51 = OpFunctionCall %int %i
-         %52 = OpBitcast %uint %51
-         %53 = OpExtInst %uint %34 UMin %52 %uint_3
-         %54 = OpAccessChain %_ptr_Function_v3half %49 %53
-    %l_a_i_i = OpLoad %v3half %54 None
-         %57 = OpLoad %_arr_mat4x3_f16_std140_uint_4 %28 None
-         %58 = OpFunctionCall %_arr_mat4x3_f16_std140_uint_4_0 %tint_convert_explicit_layout %57
-               OpStore %61 %58
-               OpBranch %67
-         %67 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_v3half %31 %36 %uint_2
+         %47 = OpLoad %v3half %45 None
+         %48 = OpAccessChain %_ptr_Uniform_v3half %31 %36 %uint_3
+         %49 = OpLoad %v3half %48 None
+      %l_a_i = OpCompositeConstruct %mat4v3half %41 %44 %47 %49
+               OpStore %52 %l_a_i
+         %54 = OpFunctionCall %int %i
+         %55 = OpBitcast %uint %54
+         %56 = OpExtInst %uint %37 UMin %55 %uint_3
+         %57 = OpAccessChain %_ptr_Function_v3half %52 %56
+    %l_a_i_i = OpLoad %v3half %57 None
+         %60 = OpLoad %_arr_mat4x3_f16_std140_uint_4 %31 None
+         %61 = OpFunctionCall %_arr_mat4x3_f16_std140_uint_4_0 %tint_convert_explicit_layout %60
+               OpStore %64 %61
                OpBranch %70
          %70 = OpLabel
-         %72 = OpPhi %uint %uint_0 %67 %73 %69
-               OpLoopMerge %71 %69 None
-               OpBranch %68
-         %68 = OpLabel
-         %84 = OpUGreaterThanEqual %bool %72 %uint_4
-               OpSelectionMerge %86 None
-               OpBranchConditional %84 %87 %86
-         %87 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %75 = OpPhi %uint %uint_0 %70 %76 %72
+               OpLoopMerge %74 %72 None
                OpBranch %71
-         %86 = OpLabel
-         %88 = OpAccessChain %_ptr_Function_mat4v3half %63 %72
-         %89 = OpAccessChain %_ptr_Function_mat4x3_f16_std140 %61 %72
-         %91 = OpLoad %mat4x3_f16_std140 %89 None
-         %92 = OpCompositeExtract %v3half %91 0
-         %93 = OpCompositeExtract %v3half %91 1
-         %94 = OpCompositeExtract %v3half %91 2
-         %95 = OpCompositeExtract %v3half %91 3
-         %96 = OpCompositeConstruct %mat4v3half %92 %93 %94 %95
-               OpStore %88 %96 None
-               OpBranch %69
-         %69 = OpLabel
-         %73 = OpIAdd %uint %72 %uint_1
-               OpBranch %70
          %71 = OpLabel
-        %l_a = OpLoad %_arr_mat4v3half_uint_4 %63 None
-         %75 = OpCompositeExtract %half %l_a_i_i 0
-         %76 = OpCompositeExtract %half %l_a 0 0 0
-         %77 = OpFAdd %half %75 %76
-         %78 = OpCompositeExtract %half %l_a_i 0 0
-         %79 = OpFAdd %half %77 %78
-         %80 = OpCompositeExtract %half %l_a_i_i 0
-         %81 = OpFAdd %half %79 %80
-         %82 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
-               OpStore %82 %81 None
+         %87 = OpUGreaterThanEqual %bool %75 %uint_4
+               OpSelectionMerge %89 None
+               OpBranchConditional %87 %90 %89
+         %90 = OpLabel
+               OpBranch %74
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_mat4v3half %66 %75
+         %92 = OpAccessChain %_ptr_Function_mat4x3_f16_std140 %64 %75
+         %94 = OpLoad %mat4x3_f16_std140 %92 None
+         %95 = OpCompositeExtract %v3half %94 0
+         %96 = OpCompositeExtract %v3half %94 1
+         %97 = OpCompositeExtract %v3half %94 2
+         %98 = OpCompositeExtract %v3half %94 3
+         %99 = OpCompositeConstruct %mat4v3half %95 %96 %97 %98
+               OpStore %91 %99 None
+               OpBranch %72
+         %72 = OpLabel
+         %76 = OpIAdd %uint %75 %uint_1
+               OpBranch %73
+         %74 = OpLabel
+        %l_a = OpLoad %_arr_mat4v3half_uint_4 %66 None
+         %78 = OpCompositeExtract %half %l_a_i_i 0
+         %79 = OpCompositeExtract %half %l_a 0 0 0
+         %80 = OpFAdd %half %78 %79
+         %81 = OpCompositeExtract %half %l_a_i 0 0
+         %82 = OpFAdd %half %80 %81
+         %83 = OpCompositeExtract %half %l_a_i_i 0
+         %84 = OpFAdd %half %82 %83
+         %85 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
+               OpStore %85 %84 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat4x3_f16_std140_uint_4_0 None %98
+%tint_convert_explicit_layout = OpFunction %_arr_mat4x3_f16_std140_uint_4_0 None %101
 %tint_source = OpFunctionParameter %_arr_mat4x3_f16_std140_uint_4
-         %99 = OpLabel
-        %100 = OpVariable %_ptr_Function__arr_mat4x3_f16_std140_uint_4 Function
-        %102 = OpVariable %_ptr_Function__arr_mat4x3_f16_std140_uint_4_0 Function %103
-               OpStore %100 %tint_source
-               OpBranch %104
-        %104 = OpLabel
+        %102 = OpLabel
+        %103 = OpVariable %_ptr_Function__arr_mat4x3_f16_std140_uint_4 Function
+        %105 = OpVariable %_ptr_Function__arr_mat4x3_f16_std140_uint_4_0 Function %106
+               OpStore %103 %tint_source
                OpBranch %107
         %107 = OpLabel
-        %109 = OpPhi %uint %uint_0 %104 %110 %106
-               OpLoopMerge %108 %106 None
-               OpBranch %105
-        %105 = OpLabel
-        %112 = OpUGreaterThanEqual %bool %109 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %112 %114 %113
-        %114 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %112 = OpPhi %uint %uint_0 %107 %113 %109
+               OpLoopMerge %111 %109 None
                OpBranch %108
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_mat4x3_f16_std140 %100 %109
-        %116 = OpLoad %mat4x3_f16_std140 %115 None
-        %117 = OpAccessChain %_ptr_Function_mat4x3_f16_std140 %102 %109
-               OpStore %117 %116 None
-               OpBranch %106
-        %106 = OpLabel
-        %110 = OpIAdd %uint %109 %uint_1
-               OpBranch %107
         %108 = OpLabel
-        %111 = OpLoad %_arr_mat4x3_f16_std140_uint_4_0 %102 None
-               OpReturnValue %111
+        %115 = OpUGreaterThanEqual %bool %112 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %111
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_mat4x3_f16_std140 %103 %112
+        %119 = OpLoad %mat4x3_f16_std140 %118 None
+        %120 = OpAccessChain %_ptr_Function_mat4x3_f16_std140 %105 %112
+               OpStore %120 %119 None
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpIAdd %uint %112 %uint_1
+               OpBranch %110
+        %111 = OpLabel
+        %114 = OpLoad %_arr_mat4x3_f16_std140_uint_4_0 %105 None
+               OpReturnValue %114
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 96c174b..c8c3030 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -22,33 +22,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  mat4x3 v_3 = mat4x3(v.inner[v_2].col0, v.inner[v_2].col1, v.inner[v_2].col2, v.inner[v_2].col3);
-  vec3 v_4 = v_3[min(uint(i()), 3u)];
-  mat4x3_f32_std140 v_5[4] = v.inner;
-  mat4x3 v_6[4] = mat4x3[4](mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)));
+  uint v_3 = min(uint(i()), 3u);
+  mat4x3 v_4 = mat4x3(v.inner[v_3].col0, v.inner[v_3].col1, v.inner[v_3].col2, v.inner[v_3].col3);
+  vec3 v_5 = v_4[min(uint(i()), 3u)];
+  mat4x3_f32_std140 v_6[4] = v.inner;
+  mat4x3 v_7[4] = mat4x3[4](mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = mat4x3(v_5[v_8].col0, v_5[v_8].col1, v_5[v_8].col2, v_5[v_8].col3);
+      v_7[v_9] = mat4x3(v_6[v_9].col0, v_6[v_9].col1, v_6[v_9].col2, v_6[v_9].col3);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  mat4x3 l_a[4] = v_6;
-  mat4x3 l_a_i = v_3;
-  vec3 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat4x3 l_a[4] = v_7;
+  mat4x3 l_a_i = v_4;
+  vec3 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index d664283..532c497 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 118
+; Bound: 121
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -59,7 +59,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat4x3_f32_std140_uint_4 = OpTypePointer Uniform %_arr_mat4x3_f32_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -73,117 +73,120 @@
 %_ptr_Function__arr_mat4x3_f32_std140_uint_4_0 = OpTypePointer Function %_arr_mat4x3_f32_std140_uint_4_0
 %_arr_mat4v3float_uint_4 = OpTypeArray %mat4v3float %uint_4
 %_ptr_Function__arr_mat4v3float_uint_4 = OpTypePointer Function %_arr_mat4v3float_uint_4
-         %66 = OpConstantNull %_arr_mat4v3float_uint_4
+         %69 = OpConstantNull %_arr_mat4v3float_uint_4
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
        %bool = OpTypeBool
 %_ptr_Function_mat4x3_f32_std140 = OpTypePointer Function %mat4x3_f32_std140
-         %98 = OpTypeFunction %_arr_mat4x3_f32_std140_uint_4_0 %_arr_mat4x3_f32_std140_uint_4
+        %101 = OpTypeFunction %_arr_mat4x3_f32_std140_uint_4_0 %_arr_mat4x3_f32_std140_uint_4
 %_ptr_Function__arr_mat4x3_f32_std140_uint_4 = OpTypePointer Function %_arr_mat4x3_f32_std140_uint_4
-        %103 = OpConstantNull %_arr_mat4x3_f32_std140_uint_4_0
+        %106 = OpConstantNull %_arr_mat4x3_f32_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %49 = OpVariable %_ptr_Function_mat4v3float Function
-         %61 = OpVariable %_ptr_Function__arr_mat4x3_f32_std140_uint_4_0 Function
-         %63 = OpVariable %_ptr_Function__arr_mat4v3float_uint_4 Function %66
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat4x3_f32_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_0
-         %38 = OpLoad %v3float %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %52 = OpVariable %_ptr_Function_mat4v3float Function
+         %64 = OpVariable %_ptr_Function__arr_mat4x3_f32_std140_uint_4_0 Function
+         %66 = OpVariable %_ptr_Function__arr_mat4v3float_uint_4 Function %69
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat4x3_f32_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_0
          %41 = OpLoad %v3float %39 None
-         %42 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_2
+         %42 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_1
          %44 = OpLoad %v3float %42 None
-         %45 = OpAccessChain %_ptr_Uniform_v3float %28 %33 %uint_3
-         %46 = OpLoad %v3float %45 None
-      %l_a_i = OpCompositeConstruct %mat4v3float %38 %41 %44 %46
-               OpStore %49 %l_a_i
-         %51 = OpFunctionCall %int %i
-         %52 = OpBitcast %uint %51
-         %53 = OpExtInst %uint %34 UMin %52 %uint_3
-         %54 = OpAccessChain %_ptr_Function_v3float %49 %53
-    %l_a_i_i = OpLoad %v3float %54 None
-         %57 = OpLoad %_arr_mat4x3_f32_std140_uint_4 %28 None
-         %58 = OpFunctionCall %_arr_mat4x3_f32_std140_uint_4_0 %tint_convert_explicit_layout %57
-               OpStore %61 %58
-               OpBranch %67
-         %67 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_2
+         %47 = OpLoad %v3float %45 None
+         %48 = OpAccessChain %_ptr_Uniform_v3float %31 %36 %uint_3
+         %49 = OpLoad %v3float %48 None
+      %l_a_i = OpCompositeConstruct %mat4v3float %41 %44 %47 %49
+               OpStore %52 %l_a_i
+         %54 = OpFunctionCall %int %i
+         %55 = OpBitcast %uint %54
+         %56 = OpExtInst %uint %37 UMin %55 %uint_3
+         %57 = OpAccessChain %_ptr_Function_v3float %52 %56
+    %l_a_i_i = OpLoad %v3float %57 None
+         %60 = OpLoad %_arr_mat4x3_f32_std140_uint_4 %31 None
+         %61 = OpFunctionCall %_arr_mat4x3_f32_std140_uint_4_0 %tint_convert_explicit_layout %60
+               OpStore %64 %61
                OpBranch %70
          %70 = OpLabel
-         %72 = OpPhi %uint %uint_0 %67 %73 %69
-               OpLoopMerge %71 %69 None
-               OpBranch %68
-         %68 = OpLabel
-         %84 = OpUGreaterThanEqual %bool %72 %uint_4
-               OpSelectionMerge %86 None
-               OpBranchConditional %84 %87 %86
-         %87 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %75 = OpPhi %uint %uint_0 %70 %76 %72
+               OpLoopMerge %74 %72 None
                OpBranch %71
-         %86 = OpLabel
-         %88 = OpAccessChain %_ptr_Function_mat4v3float %63 %72
-         %89 = OpAccessChain %_ptr_Function_mat4x3_f32_std140 %61 %72
-         %91 = OpLoad %mat4x3_f32_std140 %89 None
-         %92 = OpCompositeExtract %v3float %91 0
-         %93 = OpCompositeExtract %v3float %91 1
-         %94 = OpCompositeExtract %v3float %91 2
-         %95 = OpCompositeExtract %v3float %91 3
-         %96 = OpCompositeConstruct %mat4v3float %92 %93 %94 %95
-               OpStore %88 %96 None
-               OpBranch %69
-         %69 = OpLabel
-         %73 = OpIAdd %uint %72 %uint_1
-               OpBranch %70
          %71 = OpLabel
-        %l_a = OpLoad %_arr_mat4v3float_uint_4 %63 None
-         %75 = OpCompositeExtract %float %l_a_i_i 0
-         %76 = OpCompositeExtract %float %l_a 0 0 0
-         %77 = OpFAdd %float %75 %76
-         %78 = OpCompositeExtract %float %l_a_i 0 0
-         %79 = OpFAdd %float %77 %78
-         %80 = OpCompositeExtract %float %l_a_i_i 0
-         %81 = OpFAdd %float %79 %80
-         %82 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %82 %81 None
+         %87 = OpUGreaterThanEqual %bool %75 %uint_4
+               OpSelectionMerge %89 None
+               OpBranchConditional %87 %90 %89
+         %90 = OpLabel
+               OpBranch %74
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_mat4v3float %66 %75
+         %92 = OpAccessChain %_ptr_Function_mat4x3_f32_std140 %64 %75
+         %94 = OpLoad %mat4x3_f32_std140 %92 None
+         %95 = OpCompositeExtract %v3float %94 0
+         %96 = OpCompositeExtract %v3float %94 1
+         %97 = OpCompositeExtract %v3float %94 2
+         %98 = OpCompositeExtract %v3float %94 3
+         %99 = OpCompositeConstruct %mat4v3float %95 %96 %97 %98
+               OpStore %91 %99 None
+               OpBranch %72
+         %72 = OpLabel
+         %76 = OpIAdd %uint %75 %uint_1
+               OpBranch %73
+         %74 = OpLabel
+        %l_a = OpLoad %_arr_mat4v3float_uint_4 %66 None
+         %78 = OpCompositeExtract %float %l_a_i_i 0
+         %79 = OpCompositeExtract %float %l_a 0 0 0
+         %80 = OpFAdd %float %78 %79
+         %81 = OpCompositeExtract %float %l_a_i 0 0
+         %82 = OpFAdd %float %80 %81
+         %83 = OpCompositeExtract %float %l_a_i_i 0
+         %84 = OpFAdd %float %82 %83
+         %85 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %85 %84 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat4x3_f32_std140_uint_4_0 None %98
+%tint_convert_explicit_layout = OpFunction %_arr_mat4x3_f32_std140_uint_4_0 None %101
 %tint_source = OpFunctionParameter %_arr_mat4x3_f32_std140_uint_4
-         %99 = OpLabel
-        %100 = OpVariable %_ptr_Function__arr_mat4x3_f32_std140_uint_4 Function
-        %102 = OpVariable %_ptr_Function__arr_mat4x3_f32_std140_uint_4_0 Function %103
-               OpStore %100 %tint_source
-               OpBranch %104
-        %104 = OpLabel
+        %102 = OpLabel
+        %103 = OpVariable %_ptr_Function__arr_mat4x3_f32_std140_uint_4 Function
+        %105 = OpVariable %_ptr_Function__arr_mat4x3_f32_std140_uint_4_0 Function %106
+               OpStore %103 %tint_source
                OpBranch %107
         %107 = OpLabel
-        %109 = OpPhi %uint %uint_0 %104 %110 %106
-               OpLoopMerge %108 %106 None
-               OpBranch %105
-        %105 = OpLabel
-        %112 = OpUGreaterThanEqual %bool %109 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %112 %114 %113
-        %114 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %112 = OpPhi %uint %uint_0 %107 %113 %109
+               OpLoopMerge %111 %109 None
                OpBranch %108
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_mat4x3_f32_std140 %100 %109
-        %116 = OpLoad %mat4x3_f32_std140 %115 None
-        %117 = OpAccessChain %_ptr_Function_mat4x3_f32_std140 %102 %109
-               OpStore %117 %116 None
-               OpBranch %106
-        %106 = OpLabel
-        %110 = OpIAdd %uint %109 %uint_1
-               OpBranch %107
         %108 = OpLabel
-        %111 = OpLoad %_arr_mat4x3_f32_std140_uint_4_0 %102 None
-               OpReturnValue %111
+        %115 = OpUGreaterThanEqual %bool %112 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %111
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_mat4x3_f32_std140 %103 %112
+        %119 = OpLoad %mat4x3_f32_std140 %118 None
+        %120 = OpAccessChain %_ptr_Function_mat4x3_f32_std140 %105 %112
+               OpStore %120 %119 None
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpIAdd %uint %112 %uint_1
+               OpBranch %110
+        %111 = OpLabel
+        %114 = OpLoad %_arr_mat4x3_f32_std140_uint_4_0 %105 None
+               OpReturnValue %114
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 3b4d863..81b6530 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -19,33 +19,34 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
-  f16mat4 v_3 = f16mat4(v.inner[v_2].col0, v.inner[v_2].col1, v.inner[v_2].col2, v.inner[v_2].col3);
-  f16vec4 v_4 = v_3[min(uint(i()), 3u)];
-  mat4x4_f16_std140 v_5[4] = v.inner;
-  f16mat4 v_6[4] = f16mat4[4](f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)));
+  uint v_3 = min(uint(i()), 3u);
+  f16mat4 v_4 = f16mat4(v.inner[v_3].col0, v.inner[v_3].col1, v.inner[v_3].col2, v.inner[v_3].col3);
+  f16vec4 v_5 = v_4[min(uint(i()), 3u)];
+  mat4x4_f16_std140 v_6[4] = v.inner;
+  f16mat4 v_7[4] = f16mat4[4](f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)));
   {
-    uint v_7 = 0u;
-    v_7 = 0u;
+    uint v_8 = 0u;
+    v_8 = 0u;
     while(true) {
-      uint v_8 = v_7;
-      if ((v_8 >= 4u)) {
+      uint v_9 = v_8;
+      if ((v_9 >= 4u)) {
         break;
       }
-      v_6[v_8] = f16mat4(v_5[v_8].col0, v_5[v_8].col1, v_5[v_8].col2, v_5[v_8].col3);
+      v_7[v_9] = f16mat4(v_6[v_9].col0, v_6[v_9].col1, v_6[v_9].col2, v_6[v_9].col3);
       {
-        v_7 = (v_8 + 1u);
+        v_8 = (v_9 + 1u);
       }
       continue;
     }
   }
-  f16mat4 l_a[4] = v_6;
-  f16mat4 l_a_i = v_3;
-  f16vec4 l_a_i_i = v_4;
-  v_1.inner = (((v_4.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  f16mat4 l_a[4] = v_7;
+  f16mat4 l_a_i = v_4;
+  f16vec4 l_a_i_i = v_5;
+  v_1.inner = (((v_5.x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 0eec30d..a4b2311 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 118
+; Bound: 121
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -62,7 +62,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat4x4_f16_std140_uint_4 = OpTypePointer Uniform %_arr_mat4x4_f16_std140_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -76,117 +76,120 @@
 %_ptr_Function__arr_mat4x4_f16_std140_uint_4_0 = OpTypePointer Function %_arr_mat4x4_f16_std140_uint_4_0
 %_arr_mat4v4half_uint_4 = OpTypeArray %mat4v4half %uint_4
 %_ptr_Function__arr_mat4v4half_uint_4 = OpTypePointer Function %_arr_mat4v4half_uint_4
-         %66 = OpConstantNull %_arr_mat4v4half_uint_4
+         %69 = OpConstantNull %_arr_mat4v4half_uint_4
 %_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
        %bool = OpTypeBool
 %_ptr_Function_mat4x4_f16_std140 = OpTypePointer Function %mat4x4_f16_std140
-         %98 = OpTypeFunction %_arr_mat4x4_f16_std140_uint_4_0 %_arr_mat4x4_f16_std140_uint_4
+        %101 = OpTypeFunction %_arr_mat4x4_f16_std140_uint_4_0 %_arr_mat4x4_f16_std140_uint_4
 %_ptr_Function__arr_mat4x4_f16_std140_uint_4 = OpTypePointer Function %_arr_mat4x4_f16_std140_uint_4
-        %103 = OpConstantNull %_arr_mat4x4_f16_std140_uint_4_0
+        %106 = OpConstantNull %_arr_mat4x4_f16_std140_uint_4_0
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
-         %49 = OpVariable %_ptr_Function_mat4v4half Function
-         %61 = OpVariable %_ptr_Function__arr_mat4x4_f16_std140_uint_4_0 Function
-         %63 = OpVariable %_ptr_Function__arr_mat4v4half_uint_4 Function %66
-         %28 = OpAccessChain %_ptr_Uniform__arr_mat4x4_f16_std140_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-         %36 = OpAccessChain %_ptr_Uniform_v4half %28 %33 %uint_0
-         %38 = OpLoad %v4half %36 None
-         %39 = OpAccessChain %_ptr_Uniform_v4half %28 %33 %uint_1
+          %f = OpFunction %void None %29
+         %30 = OpLabel
+         %52 = OpVariable %_ptr_Function_mat4v4half Function
+         %64 = OpVariable %_ptr_Function__arr_mat4x4_f16_std140_uint_4_0 Function
+         %66 = OpVariable %_ptr_Function__arr_mat4v4half_uint_4 Function %69
+         %31 = OpAccessChain %_ptr_Uniform__arr_mat4x4_f16_std140_uint_4 %1 %uint_0
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+         %39 = OpAccessChain %_ptr_Uniform_v4half %31 %36 %uint_0
          %41 = OpLoad %v4half %39 None
-         %42 = OpAccessChain %_ptr_Uniform_v4half %28 %33 %uint_2
+         %42 = OpAccessChain %_ptr_Uniform_v4half %31 %36 %uint_1
          %44 = OpLoad %v4half %42 None
-         %45 = OpAccessChain %_ptr_Uniform_v4half %28 %33 %uint_3
-         %46 = OpLoad %v4half %45 None
-      %l_a_i = OpCompositeConstruct %mat4v4half %38 %41 %44 %46
-               OpStore %49 %l_a_i
-         %51 = OpFunctionCall %int %i
-         %52 = OpBitcast %uint %51
-         %53 = OpExtInst %uint %34 UMin %52 %uint_3
-         %54 = OpAccessChain %_ptr_Function_v4half %49 %53
-    %l_a_i_i = OpLoad %v4half %54 None
-         %57 = OpLoad %_arr_mat4x4_f16_std140_uint_4 %28 None
-         %58 = OpFunctionCall %_arr_mat4x4_f16_std140_uint_4_0 %tint_convert_explicit_layout %57
-               OpStore %61 %58
-               OpBranch %67
-         %67 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_v4half %31 %36 %uint_2
+         %47 = OpLoad %v4half %45 None
+         %48 = OpAccessChain %_ptr_Uniform_v4half %31 %36 %uint_3
+         %49 = OpLoad %v4half %48 None
+      %l_a_i = OpCompositeConstruct %mat4v4half %41 %44 %47 %49
+               OpStore %52 %l_a_i
+         %54 = OpFunctionCall %int %i
+         %55 = OpBitcast %uint %54
+         %56 = OpExtInst %uint %37 UMin %55 %uint_3
+         %57 = OpAccessChain %_ptr_Function_v4half %52 %56
+    %l_a_i_i = OpLoad %v4half %57 None
+         %60 = OpLoad %_arr_mat4x4_f16_std140_uint_4 %31 None
+         %61 = OpFunctionCall %_arr_mat4x4_f16_std140_uint_4_0 %tint_convert_explicit_layout %60
+               OpStore %64 %61
                OpBranch %70
          %70 = OpLabel
-         %72 = OpPhi %uint %uint_0 %67 %73 %69
-               OpLoopMerge %71 %69 None
-               OpBranch %68
-         %68 = OpLabel
-         %84 = OpUGreaterThanEqual %bool %72 %uint_4
-               OpSelectionMerge %86 None
-               OpBranchConditional %84 %87 %86
-         %87 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %75 = OpPhi %uint %uint_0 %70 %76 %72
+               OpLoopMerge %74 %72 None
                OpBranch %71
-         %86 = OpLabel
-         %88 = OpAccessChain %_ptr_Function_mat4v4half %63 %72
-         %89 = OpAccessChain %_ptr_Function_mat4x4_f16_std140 %61 %72
-         %91 = OpLoad %mat4x4_f16_std140 %89 None
-         %92 = OpCompositeExtract %v4half %91 0
-         %93 = OpCompositeExtract %v4half %91 1
-         %94 = OpCompositeExtract %v4half %91 2
-         %95 = OpCompositeExtract %v4half %91 3
-         %96 = OpCompositeConstruct %mat4v4half %92 %93 %94 %95
-               OpStore %88 %96 None
-               OpBranch %69
-         %69 = OpLabel
-         %73 = OpIAdd %uint %72 %uint_1
-               OpBranch %70
          %71 = OpLabel
-        %l_a = OpLoad %_arr_mat4v4half_uint_4 %63 None
-         %75 = OpCompositeExtract %half %l_a_i_i 0
-         %76 = OpCompositeExtract %half %l_a 0 0 0
-         %77 = OpFAdd %half %75 %76
-         %78 = OpCompositeExtract %half %l_a_i 0 0
-         %79 = OpFAdd %half %77 %78
-         %80 = OpCompositeExtract %half %l_a_i_i 0
-         %81 = OpFAdd %half %79 %80
-         %82 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
-               OpStore %82 %81 None
+         %87 = OpUGreaterThanEqual %bool %75 %uint_4
+               OpSelectionMerge %89 None
+               OpBranchConditional %87 %90 %89
+         %90 = OpLabel
+               OpBranch %74
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_mat4v4half %66 %75
+         %92 = OpAccessChain %_ptr_Function_mat4x4_f16_std140 %64 %75
+         %94 = OpLoad %mat4x4_f16_std140 %92 None
+         %95 = OpCompositeExtract %v4half %94 0
+         %96 = OpCompositeExtract %v4half %94 1
+         %97 = OpCompositeExtract %v4half %94 2
+         %98 = OpCompositeExtract %v4half %94 3
+         %99 = OpCompositeConstruct %mat4v4half %95 %96 %97 %98
+               OpStore %91 %99 None
+               OpBranch %72
+         %72 = OpLabel
+         %76 = OpIAdd %uint %75 %uint_1
+               OpBranch %73
+         %74 = OpLabel
+        %l_a = OpLoad %_arr_mat4v4half_uint_4 %66 None
+         %78 = OpCompositeExtract %half %l_a_i_i 0
+         %79 = OpCompositeExtract %half %l_a 0 0 0
+         %80 = OpFAdd %half %78 %79
+         %81 = OpCompositeExtract %half %l_a_i 0 0
+         %82 = OpFAdd %half %80 %81
+         %83 = OpCompositeExtract %half %l_a_i_i 0
+         %84 = OpFAdd %half %82 %83
+         %85 = OpAccessChain %_ptr_StorageBuffer_half %10 %uint_0
+               OpStore %85 %84 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat4x4_f16_std140_uint_4_0 None %98
+%tint_convert_explicit_layout = OpFunction %_arr_mat4x4_f16_std140_uint_4_0 None %101
 %tint_source = OpFunctionParameter %_arr_mat4x4_f16_std140_uint_4
-         %99 = OpLabel
-        %100 = OpVariable %_ptr_Function__arr_mat4x4_f16_std140_uint_4 Function
-        %102 = OpVariable %_ptr_Function__arr_mat4x4_f16_std140_uint_4_0 Function %103
-               OpStore %100 %tint_source
-               OpBranch %104
-        %104 = OpLabel
+        %102 = OpLabel
+        %103 = OpVariable %_ptr_Function__arr_mat4x4_f16_std140_uint_4 Function
+        %105 = OpVariable %_ptr_Function__arr_mat4x4_f16_std140_uint_4_0 Function %106
+               OpStore %103 %tint_source
                OpBranch %107
         %107 = OpLabel
-        %109 = OpPhi %uint %uint_0 %104 %110 %106
-               OpLoopMerge %108 %106 None
-               OpBranch %105
-        %105 = OpLabel
-        %112 = OpUGreaterThanEqual %bool %109 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %112 %114 %113
-        %114 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %112 = OpPhi %uint %uint_0 %107 %113 %109
+               OpLoopMerge %111 %109 None
                OpBranch %108
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_mat4x4_f16_std140 %100 %109
-        %116 = OpLoad %mat4x4_f16_std140 %115 None
-        %117 = OpAccessChain %_ptr_Function_mat4x4_f16_std140 %102 %109
-               OpStore %117 %116 None
-               OpBranch %106
-        %106 = OpLabel
-        %110 = OpIAdd %uint %109 %uint_1
-               OpBranch %107
         %108 = OpLabel
-        %111 = OpLoad %_arr_mat4x4_f16_std140_uint_4_0 %102 None
-               OpReturnValue %111
+        %115 = OpUGreaterThanEqual %bool %112 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %111
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_mat4x4_f16_std140 %103 %112
+        %119 = OpLoad %mat4x4_f16_std140 %118 None
+        %120 = OpAccessChain %_ptr_Function_mat4x4_f16_std140 %105 %112
+               OpStore %120 %119 None
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpIAdd %uint %112 %uint_1
+               OpBranch %110
+        %111 = OpLabel
+        %114 = OpLoad %_arr_mat4x4_f16_std140_uint_4_0 %105 None
+               OpReturnValue %114
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 2bc80cf..2755577 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -10,15 +10,16 @@
 } v_1;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_2 = uint(counter);
+  counter = int((v_2 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_2 = min(uint(i()), 3u);
   uint v_3 = min(uint(i()), 3u);
+  uint v_4 = min(uint(i()), 3u);
   mat4 l_a[4] = v.inner;
-  mat4 l_a_i = v.inner[v_2];
-  vec4 l_a_i_i = v.inner[v_2][v_3];
-  v_1.inner = (((v.inner[v_2][v_3].x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
+  mat4 l_a_i = v.inner[v_3];
+  vec4 l_a_i_i = v.inner[v_3][v_4];
+  v_1.inner = (((v.inner[v_3][v_4].x + l_a[0u][0u].x) + l_a_i[0u].x) + l_a_i_i.x);
 }
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index ce91537..3c3b565 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 85
+; Bound: 88
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -55,7 +55,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_mat4v4float_uint_4 = OpTypePointer Uniform %_arr_mat4v4float_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -64,77 +64,80 @@
 %_arr_mat4v4float_uint_4_0 = OpTypeArray %mat4v4float %uint_4
 %_ptr_Uniform_float = OpTypePointer Uniform %float
 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
-         %61 = OpTypeFunction %_arr_mat4v4float_uint_4_0 %_arr_mat4v4float_uint_4
+         %64 = OpTypeFunction %_arr_mat4v4float_uint_4_0 %_arr_mat4v4float_uint_4
 %_ptr_Function__arr_mat4v4float_uint_4 = OpTypePointer Function %_arr_mat4v4float_uint_4
 %_ptr_Function__arr_mat4v4float_uint_4_0 = OpTypePointer Function %_arr_mat4v4float_uint_4_0
-         %67 = OpConstantNull %_arr_mat4v4float_uint_4_0
+         %70 = OpConstantNull %_arr_mat4v4float_uint_4_0
        %bool = OpTypeBool
 %_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
      %uint_1 = OpConstant %uint 1
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
+          %f = OpFunction %void None %29
+         %30 = OpLabel
         %p_a = OpAccessChain %_ptr_Uniform__arr_mat4v4float_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-      %p_a_i = OpAccessChain %_ptr_Uniform_mat4v4float %p_a %33
-         %38 = OpFunctionCall %int %i
-         %39 = OpBitcast %uint %38
-         %40 = OpExtInst %uint %34 UMin %39 %uint_3
-    %p_a_i_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i %40
-         %43 = OpLoad %_arr_mat4v4float_uint_4 %p_a None
-        %l_a = OpFunctionCall %_arr_mat4v4float_uint_4_0 %tint_convert_explicit_layout %43
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+      %p_a_i = OpAccessChain %_ptr_Uniform_mat4v4float %p_a %36
+         %41 = OpFunctionCall %int %i
+         %42 = OpBitcast %uint %41
+         %43 = OpExtInst %uint %37 UMin %42 %uint_3
+    %p_a_i_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i %43
+         %46 = OpLoad %_arr_mat4v4float_uint_4 %p_a None
+        %l_a = OpFunctionCall %_arr_mat4v4float_uint_4_0 %tint_convert_explicit_layout %46
       %l_a_i = OpLoad %mat4v4float %p_a_i None
     %l_a_i_i = OpLoad %v4float %p_a_i_i None
-         %49 = OpAccessChain %_ptr_Uniform_float %p_a_i_i %uint_0
-         %51 = OpLoad %float %49 None
-         %52 = OpCompositeExtract %float %l_a 0 0 0
-         %53 = OpFAdd %float %51 %52
-         %54 = OpCompositeExtract %float %l_a_i 0 0
-         %55 = OpFAdd %float %53 %54
-         %56 = OpCompositeExtract %float %l_a_i_i 0
-         %57 = OpFAdd %float %55 %56
-         %58 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
-               OpStore %58 %57 None
+         %52 = OpAccessChain %_ptr_Uniform_float %p_a_i_i %uint_0
+         %54 = OpLoad %float %52 None
+         %55 = OpCompositeExtract %float %l_a 0 0 0
+         %56 = OpFAdd %float %54 %55
+         %57 = OpCompositeExtract %float %l_a_i 0 0
+         %58 = OpFAdd %float %56 %57
+         %59 = OpCompositeExtract %float %l_a_i_i 0
+         %60 = OpFAdd %float %58 %59
+         %61 = OpAccessChain %_ptr_StorageBuffer_float %10 %uint_0
+               OpStore %61 %60 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_mat4v4float_uint_4_0 None %61
+%tint_convert_explicit_layout = OpFunction %_arr_mat4v4float_uint_4_0 None %64
 %tint_source = OpFunctionParameter %_arr_mat4v4float_uint_4
-         %62 = OpLabel
-         %63 = OpVariable %_ptr_Function__arr_mat4v4float_uint_4 Function
-         %65 = OpVariable %_ptr_Function__arr_mat4v4float_uint_4_0 Function %67
-               OpStore %63 %tint_source
-               OpBranch %68
-         %68 = OpLabel
+         %65 = OpLabel
+         %66 = OpVariable %_ptr_Function__arr_mat4v4float_uint_4 Function
+         %68 = OpVariable %_ptr_Function__arr_mat4v4float_uint_4_0 Function %70
+               OpStore %66 %tint_source
                OpBranch %71
          %71 = OpLabel
-         %73 = OpPhi %uint %uint_0 %68 %74 %70
-               OpLoopMerge %72 %70 None
-               OpBranch %69
-         %69 = OpLabel
-         %76 = OpUGreaterThanEqual %bool %73 %uint_4
-               OpSelectionMerge %78 None
-               OpBranchConditional %76 %79 %78
-         %79 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+         %76 = OpPhi %uint %uint_0 %71 %77 %73
+               OpLoopMerge %75 %73 None
                OpBranch %72
-         %78 = OpLabel
-         %80 = OpAccessChain %_ptr_Function_mat4v4float %63 %73
-         %82 = OpLoad %mat4v4float %80 None
-         %83 = OpAccessChain %_ptr_Function_mat4v4float %65 %73
-               OpStore %83 %82 None
-               OpBranch %70
-         %70 = OpLabel
-         %74 = OpIAdd %uint %73 %uint_1
-               OpBranch %71
          %72 = OpLabel
-         %75 = OpLoad %_arr_mat4v4float_uint_4_0 %65 None
-               OpReturnValue %75
+         %79 = OpUGreaterThanEqual %bool %76 %uint_4
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %81
+         %82 = OpLabel
+               OpBranch %75
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_mat4v4float %66 %76
+         %85 = OpLoad %mat4v4float %83 None
+         %86 = OpAccessChain %_ptr_Function_mat4v4float %68 %76
+               OpStore %86 %85 None
+               OpBranch %73
+         %73 = OpLabel
+         %77 = OpIAdd %uint %76 %uint_1
+               OpBranch %74
+         %75 = OpLabel
+         %78 = OpLoad %_arr_mat4v4float_uint_4_0 %68 None
+               OpReturnValue %78
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index ccab01e..02e4c81 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -39,76 +39,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat2(tint_input.m_col0, tint_input.m_col1));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat2 v_6 = f16mat2(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1);
-  f16vec2 v_7 = v_6[min(uint(i()), 1u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat2 v_7 = f16mat2(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1);
+  f16vec2 v_8 = v_7[min(uint(i()), 1u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat2(f16vec2(0.0hf), f16vec2(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat2 l_a_i_a_i_m = v_6;
-  f16vec2 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 1u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat2 l_a_i_a_i_m = v_7;
+  f16vec2 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 30d14d1..e548a8e 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 209
+; Bound: 212
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -72,7 +72,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -93,242 +93,245 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %74 = OpConstantNull %_arr_Outer_uint_4
+         %77 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %95 = OpConstantNull %_arr_Inner_uint_4
+         %98 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %131 = OpTypeFunction %Inner %Inner_std140
-        %138 = OpTypeFunction %Outer %Outer_std140
-        %160 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %134 = OpTypeFunction %Inner %Inner_std140
+        %141 = OpTypeFunction %Outer %Outer_std140
+        %163 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %165 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %181 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %187 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %168 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %184 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %190 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpConstantNull %_arr_Outer_std140_uint_4
+        %195 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %52 = OpVariable %_ptr_Function_mat2v2half Function
-         %66 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %68 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %74
-         %91 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %93 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_0
-         %46 = OpLoad %v2half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %55 = OpVariable %_ptr_Function_mat2v2half Function
+         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
+         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_0
          %49 = OpLoad %v2half %47 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat2v2half %46 %49
-               OpStore %52 %l_a_i_a_i_m
-         %54 = OpFunctionCall %int %i
-         %55 = OpBitcast %uint %54
-         %56 = OpExtInst %uint %33 UMin %55 %uint_1
-         %57 = OpAccessChain %_ptr_Function_v2half %52 %56
-%l_a_i_a_i_m_i = OpLoad %v2half %57 None
-         %60 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %61 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %60
-               OpStore %66 %61
-               OpBranch %75
-         %75 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_1
+         %52 = OpLoad %v2half %50 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat2v2half %49 %52
+               OpStore %55 %l_a_i_a_i_m
+         %57 = OpFunctionCall %int %i
+         %58 = OpBitcast %uint %57
+         %59 = OpExtInst %uint %36 UMin %58 %uint_1
+         %60 = OpAccessChain %_ptr_Function_v2half %55 %59
+%l_a_i_a_i_m_i = OpLoad %v2half %60 None
+         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
+               OpStore %69 %64
                OpBranch %78
          %78 = OpLabel
-         %80 = OpPhi %uint %uint_0 %75 %81 %77
-               OpLoopMerge %79 %77 None
-               OpBranch %76
-         %76 = OpLabel
-        %111 = OpUGreaterThanEqual %bool %80 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %111 %114 %113
-        %114 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %83 = OpPhi %uint %uint_0 %78 %84 %80
+               OpLoopMerge %82 %80 None
                OpBranch %79
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_Outer %68 %80
-        %117 = OpAccessChain %_ptr_Function_Outer_std140 %66 %80
-        %119 = OpLoad %Outer_std140 %117 None
-        %120 = OpFunctionCall %Outer %tint_convert_Outer %119
-               OpStore %115 %120 None
-               OpBranch %77
-         %77 = OpLabel
-         %81 = OpIAdd %uint %80 %uint_1
-               OpBranch %78
          %79 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %68 None
-         %83 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %84 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %83
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %84
-         %88 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %89 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %88
-               OpStore %91 %89
-               OpBranch %96
-         %96 = OpLabel
+        %114 = OpUGreaterThanEqual %bool %83 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %114 %117 %116
+        %117 = OpLabel
+               OpBranch %82
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
+        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
+        %122 = OpLoad %Outer_std140 %120 None
+        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
+               OpStore %118 %123 None
+               OpBranch %80
+         %80 = OpLabel
+         %84 = OpIAdd %uint %83 %uint_1
+               OpBranch %81
+         %82 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
+         %86 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
+         %91 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
+               OpStore %94 %92
                OpBranch %99
          %99 = OpLabel
-        %101 = OpPhi %uint %uint_0 %96 %102 %98
-               OpLoopMerge %100 %98 None
-               OpBranch %97
-         %97 = OpLabel
-        %121 = OpUGreaterThanEqual %bool %101 %uint_4
-               OpSelectionMerge %122 None
-               OpBranchConditional %121 %123 %122
-        %123 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %104 = OpPhi %uint %uint_0 %99 %105 %101
+               OpLoopMerge %103 %101 None
                OpBranch %100
-        %122 = OpLabel
-        %124 = OpAccessChain %_ptr_Function_Inner %93 %101
-        %126 = OpAccessChain %_ptr_Function_Inner_std140 %91 %101
-        %128 = OpLoad %Inner_std140 %126 None
-        %129 = OpFunctionCall %Inner %tint_convert_Inner %128
-               OpStore %124 %129 None
-               OpBranch %98
-         %98 = OpLabel
-        %102 = OpIAdd %uint %101 %uint_1
-               OpBranch %99
         %100 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %93 None
-        %104 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %104
-        %107 = OpFunctionCall %int %i
-        %108 = OpBitcast %uint %107
-        %109 = OpExtInst %uint %33 UMin %108 %uint_1
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %109
+        %124 = OpUGreaterThanEqual %bool %104 %uint_4
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %103
+        %125 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
+        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
+        %131 = OpLoad %Inner_std140 %129 None
+        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
+               OpStore %127 %132 None
+               OpBranch %101
+        %101 = OpLabel
+        %105 = OpIAdd %uint %104 %uint_1
+               OpBranch %102
+        %103 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
+        %107 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
+        %110 = OpFunctionCall %int %i
+        %111 = OpBitcast %uint %110
+        %112 = OpExtInst %uint %36 UMin %111 %uint_1
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %112
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %131
+%tint_convert_Inner = OpFunction %Inner None %134
  %tint_input = OpFunctionParameter %Inner_std140
-        %132 = OpLabel
-        %133 = OpCompositeExtract %v2half %tint_input 0
-        %134 = OpCompositeExtract %v2half %tint_input 1
-        %135 = OpCompositeConstruct %mat2v2half %133 %134
-        %136 = OpCompositeConstruct %Inner %135
-               OpReturnValue %136
+        %135 = OpLabel
+        %136 = OpCompositeExtract %v2half %tint_input 0
+        %137 = OpCompositeExtract %v2half %tint_input 1
+        %138 = OpCompositeConstruct %mat2v2half %136 %137
+        %139 = OpCompositeConstruct %Inner %138
+               OpReturnValue %139
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %138
+%tint_convert_Outer = OpFunction %Outer None %141
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %139 = OpLabel
-        %141 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %142 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-        %140 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %141 %140
-               OpBranch %143
-        %143 = OpLabel
+        %142 = OpLabel
+        %144 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %145 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+        %143 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %144 %143
                OpBranch %146
         %146 = OpLabel
-        %148 = OpPhi %uint %uint_0 %143 %149 %145
-               OpLoopMerge %147 %145 None
-               OpBranch %144
-        %144 = OpLabel
-        %152 = OpUGreaterThanEqual %bool %148 %uint_4
-               OpSelectionMerge %153 None
-               OpBranchConditional %152 %154 %153
-        %154 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %151 = OpPhi %uint %uint_0 %146 %152 %148
+               OpLoopMerge %150 %148 None
                OpBranch %147
-        %153 = OpLabel
-        %155 = OpAccessChain %_ptr_Function_Inner %142 %148
-        %156 = OpAccessChain %_ptr_Function_Inner_std140 %141 %148
-        %157 = OpLoad %Inner_std140 %156 None
-        %158 = OpFunctionCall %Inner %tint_convert_Inner %157
-               OpStore %155 %158 None
-               OpBranch %145
-        %145 = OpLabel
-        %149 = OpIAdd %uint %148 %uint_1
-               OpBranch %146
         %147 = OpLabel
-        %150 = OpLoad %_arr_Inner_uint_4 %142 None
-        %151 = OpCompositeConstruct %Outer %150
-               OpReturnValue %151
+        %155 = OpUGreaterThanEqual %bool %151 %uint_4
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %156
+        %157 = OpLabel
+               OpBranch %150
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Function_Inner %145 %151
+        %159 = OpAccessChain %_ptr_Function_Inner_std140 %144 %151
+        %160 = OpLoad %Inner_std140 %159 None
+        %161 = OpFunctionCall %Inner %tint_convert_Inner %160
+               OpStore %158 %161 None
+               OpBranch %148
+        %148 = OpLabel
+        %152 = OpIAdd %uint %151 %uint_1
+               OpBranch %149
+        %150 = OpLabel
+        %153 = OpLoad %_arr_Inner_uint_4 %145 None
+        %154 = OpCompositeConstruct %Outer %153
+               OpReturnValue %154
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %160
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %163
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %161 = OpLabel
-        %162 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %164 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %165
-               OpStore %162 %tint_source
-               OpBranch %166
-        %166 = OpLabel
+        %164 = OpLabel
+        %165 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %167 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %168
+               OpStore %165 %tint_source
                OpBranch %169
         %169 = OpLabel
-        %171 = OpPhi %uint %uint_0 %166 %172 %168
-               OpLoopMerge %170 %168 None
-               OpBranch %167
-        %167 = OpLabel
-        %174 = OpUGreaterThanEqual %bool %171 %uint_4
-               OpSelectionMerge %175 None
-               OpBranchConditional %174 %176 %175
-        %176 = OpLabel
+               OpBranch %172
+        %172 = OpLabel
+        %174 = OpPhi %uint %uint_0 %169 %175 %171
+               OpLoopMerge %173 %171 None
                OpBranch %170
-        %175 = OpLabel
-        %177 = OpAccessChain %_ptr_Function_Inner_std140 %162 %171
-        %178 = OpLoad %Inner_std140 %177 None
-        %179 = OpAccessChain %_ptr_Function_Inner_std140 %164 %171
-               OpStore %179 %178 None
-               OpBranch %168
-        %168 = OpLabel
-        %172 = OpIAdd %uint %171 %uint_1
-               OpBranch %169
         %170 = OpLabel
-        %173 = OpLoad %_arr_Inner_std140_uint_4_0 %164 None
-               OpReturnValue %173
+        %177 = OpUGreaterThanEqual %bool %174 %uint_4
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+               OpBranch %173
+        %178 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_Inner_std140 %165 %174
+        %181 = OpLoad %Inner_std140 %180 None
+        %182 = OpAccessChain %_ptr_Function_Inner_std140 %167 %174
+               OpStore %182 %181 None
+               OpBranch %171
+        %171 = OpLabel
+        %175 = OpIAdd %uint %174 %uint_1
+               OpBranch %172
+        %173 = OpLabel
+        %176 = OpLoad %_arr_Inner_std140_uint_4_0 %167 None
+               OpReturnValue %176
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %181
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %184
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %182 = OpLabel
-        %183 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %184 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %183
-        %185 = OpCompositeConstruct %Outer_std140 %184
-               OpReturnValue %185
+        %185 = OpLabel
+        %186 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %187 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %186
+        %188 = OpCompositeConstruct %Outer_std140 %187
+               OpReturnValue %188
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %187
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %190
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %188 = OpLabel
-        %189 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %191 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %192
-               OpStore %189 %tint_source_1
-               OpBranch %193
-        %193 = OpLabel
+        %191 = OpLabel
+        %192 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %194 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %195
+               OpStore %192 %tint_source_1
                OpBranch %196
         %196 = OpLabel
-        %198 = OpPhi %uint %uint_0 %193 %199 %195
-               OpLoopMerge %197 %195 None
-               OpBranch %194
-        %194 = OpLabel
-        %201 = OpUGreaterThanEqual %bool %198 %uint_4
-               OpSelectionMerge %202 None
-               OpBranchConditional %201 %203 %202
-        %203 = OpLabel
+               OpBranch %199
+        %199 = OpLabel
+        %201 = OpPhi %uint %uint_0 %196 %202 %198
+               OpLoopMerge %200 %198 None
                OpBranch %197
-        %202 = OpLabel
-        %204 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %189 %198
-        %206 = OpLoad %Outer_std140_tint_explicit_layout %204 None
-        %207 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %206
-        %208 = OpAccessChain %_ptr_Function_Outer_std140 %191 %198
-               OpStore %208 %207 None
-               OpBranch %195
-        %195 = OpLabel
-        %199 = OpIAdd %uint %198 %uint_1
-               OpBranch %196
         %197 = OpLabel
-        %200 = OpLoad %_arr_Outer_std140_uint_4 %191 None
-               OpReturnValue %200
+        %204 = OpUGreaterThanEqual %bool %201 %uint_4
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %205
+        %206 = OpLabel
+               OpBranch %200
+        %205 = OpLabel
+        %207 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %192 %201
+        %209 = OpLoad %Outer_std140_tint_explicit_layout %207 None
+        %210 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %209
+        %211 = OpAccessChain %_ptr_Function_Outer_std140 %194 %201
+               OpStore %211 %210 None
+               OpBranch %198
+        %198 = OpLabel
+        %202 = OpIAdd %uint %201 %uint_1
+               OpBranch %199
+        %200 = OpLabel
+        %203 = OpLoad %_arr_Outer_std140_uint_4 %194 None
+               OpReturnValue %203
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 9fec8d2..0d86ec7 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -36,76 +36,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(mat2(tint_input.m_col0, tint_input.m_col1));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))));
+  Inner v_2[4] = Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  mat2 v_6 = mat2(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1);
-  vec2 v_7 = v_6[min(uint(i()), 1u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))));
+  uint v_6 = min(uint(i()), 3u);
+  mat2 v_7 = mat2(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1);
+  vec2 v_8 = v_7[min(uint(i()), 1u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))), Inner(mat2(vec2(0.0f), vec2(0.0f))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  mat2 l_a_i_a_i_m = v_6;
-  vec2 l_a_i_a_i_m_i = v_7;
-  float l_a_i_a_i_m_i_i = v_7[min(uint(i()), 1u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  mat2 l_a_i_a_i_m = v_7;
+  vec2 l_a_i_a_i_m_i = v_8;
+  float l_a_i_a_i_m_i_i = v_8[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 0306c28..82ab8a0 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 209
+; Bound: 212
 ; Schema: 0
                OpCapability Shader
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -69,7 +69,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -90,242 +90,245 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %74 = OpConstantNull %_arr_Outer_uint_4
+         %77 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %95 = OpConstantNull %_arr_Inner_uint_4
+         %98 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %131 = OpTypeFunction %Inner %Inner_std140
-        %138 = OpTypeFunction %Outer %Outer_std140
-        %160 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %134 = OpTypeFunction %Inner %Inner_std140
+        %141 = OpTypeFunction %Outer %Outer_std140
+        %163 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %165 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %181 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %187 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %168 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %184 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %190 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpConstantNull %_arr_Outer_std140_uint_4
+        %195 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %52 = OpVariable %_ptr_Function_mat2v2float Function
-         %66 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %68 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %74
-         %91 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %93 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_0
-         %46 = OpLoad %v2float %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %55 = OpVariable %_ptr_Function_mat2v2float Function
+         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
+         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_0
          %49 = OpLoad %v2float %47 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat2v2float %46 %49
-               OpStore %52 %l_a_i_a_i_m
-         %54 = OpFunctionCall %int %i
-         %55 = OpBitcast %uint %54
-         %56 = OpExtInst %uint %33 UMin %55 %uint_1
-         %57 = OpAccessChain %_ptr_Function_v2float %52 %56
-%l_a_i_a_i_m_i = OpLoad %v2float %57 None
-         %60 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %61 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %60
-               OpStore %66 %61
-               OpBranch %75
-         %75 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_1
+         %52 = OpLoad %v2float %50 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat2v2float %49 %52
+               OpStore %55 %l_a_i_a_i_m
+         %57 = OpFunctionCall %int %i
+         %58 = OpBitcast %uint %57
+         %59 = OpExtInst %uint %36 UMin %58 %uint_1
+         %60 = OpAccessChain %_ptr_Function_v2float %55 %59
+%l_a_i_a_i_m_i = OpLoad %v2float %60 None
+         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
+               OpStore %69 %64
                OpBranch %78
          %78 = OpLabel
-         %80 = OpPhi %uint %uint_0 %75 %81 %77
-               OpLoopMerge %79 %77 None
-               OpBranch %76
-         %76 = OpLabel
-        %111 = OpUGreaterThanEqual %bool %80 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %111 %114 %113
-        %114 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %83 = OpPhi %uint %uint_0 %78 %84 %80
+               OpLoopMerge %82 %80 None
                OpBranch %79
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_Outer %68 %80
-        %117 = OpAccessChain %_ptr_Function_Outer_std140 %66 %80
-        %119 = OpLoad %Outer_std140 %117 None
-        %120 = OpFunctionCall %Outer %tint_convert_Outer %119
-               OpStore %115 %120 None
-               OpBranch %77
-         %77 = OpLabel
-         %81 = OpIAdd %uint %80 %uint_1
-               OpBranch %78
          %79 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %68 None
-         %83 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %84 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %83
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %84
-         %88 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %89 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %88
-               OpStore %91 %89
-               OpBranch %96
-         %96 = OpLabel
+        %114 = OpUGreaterThanEqual %bool %83 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %114 %117 %116
+        %117 = OpLabel
+               OpBranch %82
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
+        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
+        %122 = OpLoad %Outer_std140 %120 None
+        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
+               OpStore %118 %123 None
+               OpBranch %80
+         %80 = OpLabel
+         %84 = OpIAdd %uint %83 %uint_1
+               OpBranch %81
+         %82 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
+         %86 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
+         %91 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
+               OpStore %94 %92
                OpBranch %99
          %99 = OpLabel
-        %101 = OpPhi %uint %uint_0 %96 %102 %98
-               OpLoopMerge %100 %98 None
-               OpBranch %97
-         %97 = OpLabel
-        %121 = OpUGreaterThanEqual %bool %101 %uint_4
-               OpSelectionMerge %122 None
-               OpBranchConditional %121 %123 %122
-        %123 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %104 = OpPhi %uint %uint_0 %99 %105 %101
+               OpLoopMerge %103 %101 None
                OpBranch %100
-        %122 = OpLabel
-        %124 = OpAccessChain %_ptr_Function_Inner %93 %101
-        %126 = OpAccessChain %_ptr_Function_Inner_std140 %91 %101
-        %128 = OpLoad %Inner_std140 %126 None
-        %129 = OpFunctionCall %Inner %tint_convert_Inner %128
-               OpStore %124 %129 None
-               OpBranch %98
-         %98 = OpLabel
-        %102 = OpIAdd %uint %101 %uint_1
-               OpBranch %99
         %100 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %93 None
-        %104 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %104
-        %107 = OpFunctionCall %int %i
-        %108 = OpBitcast %uint %107
-        %109 = OpExtInst %uint %33 UMin %108 %uint_1
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %109
+        %124 = OpUGreaterThanEqual %bool %104 %uint_4
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %103
+        %125 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
+        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
+        %131 = OpLoad %Inner_std140 %129 None
+        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
+               OpStore %127 %132 None
+               OpBranch %101
+        %101 = OpLabel
+        %105 = OpIAdd %uint %104 %uint_1
+               OpBranch %102
+        %103 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
+        %107 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
+        %110 = OpFunctionCall %int %i
+        %111 = OpBitcast %uint %110
+        %112 = OpExtInst %uint %36 UMin %111 %uint_1
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %112
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %131
+%tint_convert_Inner = OpFunction %Inner None %134
  %tint_input = OpFunctionParameter %Inner_std140
-        %132 = OpLabel
-        %133 = OpCompositeExtract %v2float %tint_input 0
-        %134 = OpCompositeExtract %v2float %tint_input 1
-        %135 = OpCompositeConstruct %mat2v2float %133 %134
-        %136 = OpCompositeConstruct %Inner %135
-               OpReturnValue %136
+        %135 = OpLabel
+        %136 = OpCompositeExtract %v2float %tint_input 0
+        %137 = OpCompositeExtract %v2float %tint_input 1
+        %138 = OpCompositeConstruct %mat2v2float %136 %137
+        %139 = OpCompositeConstruct %Inner %138
+               OpReturnValue %139
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %138
+%tint_convert_Outer = OpFunction %Outer None %141
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %139 = OpLabel
-        %141 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %142 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-        %140 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %141 %140
-               OpBranch %143
-        %143 = OpLabel
+        %142 = OpLabel
+        %144 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %145 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+        %143 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %144 %143
                OpBranch %146
         %146 = OpLabel
-        %148 = OpPhi %uint %uint_0 %143 %149 %145
-               OpLoopMerge %147 %145 None
-               OpBranch %144
-        %144 = OpLabel
-        %152 = OpUGreaterThanEqual %bool %148 %uint_4
-               OpSelectionMerge %153 None
-               OpBranchConditional %152 %154 %153
-        %154 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %151 = OpPhi %uint %uint_0 %146 %152 %148
+               OpLoopMerge %150 %148 None
                OpBranch %147
-        %153 = OpLabel
-        %155 = OpAccessChain %_ptr_Function_Inner %142 %148
-        %156 = OpAccessChain %_ptr_Function_Inner_std140 %141 %148
-        %157 = OpLoad %Inner_std140 %156 None
-        %158 = OpFunctionCall %Inner %tint_convert_Inner %157
-               OpStore %155 %158 None
-               OpBranch %145
-        %145 = OpLabel
-        %149 = OpIAdd %uint %148 %uint_1
-               OpBranch %146
         %147 = OpLabel
-        %150 = OpLoad %_arr_Inner_uint_4 %142 None
-        %151 = OpCompositeConstruct %Outer %150
-               OpReturnValue %151
+        %155 = OpUGreaterThanEqual %bool %151 %uint_4
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %156
+        %157 = OpLabel
+               OpBranch %150
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Function_Inner %145 %151
+        %159 = OpAccessChain %_ptr_Function_Inner_std140 %144 %151
+        %160 = OpLoad %Inner_std140 %159 None
+        %161 = OpFunctionCall %Inner %tint_convert_Inner %160
+               OpStore %158 %161 None
+               OpBranch %148
+        %148 = OpLabel
+        %152 = OpIAdd %uint %151 %uint_1
+               OpBranch %149
+        %150 = OpLabel
+        %153 = OpLoad %_arr_Inner_uint_4 %145 None
+        %154 = OpCompositeConstruct %Outer %153
+               OpReturnValue %154
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %160
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %163
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %161 = OpLabel
-        %162 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %164 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %165
-               OpStore %162 %tint_source
-               OpBranch %166
-        %166 = OpLabel
+        %164 = OpLabel
+        %165 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %167 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %168
+               OpStore %165 %tint_source
                OpBranch %169
         %169 = OpLabel
-        %171 = OpPhi %uint %uint_0 %166 %172 %168
-               OpLoopMerge %170 %168 None
-               OpBranch %167
-        %167 = OpLabel
-        %174 = OpUGreaterThanEqual %bool %171 %uint_4
-               OpSelectionMerge %175 None
-               OpBranchConditional %174 %176 %175
-        %176 = OpLabel
+               OpBranch %172
+        %172 = OpLabel
+        %174 = OpPhi %uint %uint_0 %169 %175 %171
+               OpLoopMerge %173 %171 None
                OpBranch %170
-        %175 = OpLabel
-        %177 = OpAccessChain %_ptr_Function_Inner_std140 %162 %171
-        %178 = OpLoad %Inner_std140 %177 None
-        %179 = OpAccessChain %_ptr_Function_Inner_std140 %164 %171
-               OpStore %179 %178 None
-               OpBranch %168
-        %168 = OpLabel
-        %172 = OpIAdd %uint %171 %uint_1
-               OpBranch %169
         %170 = OpLabel
-        %173 = OpLoad %_arr_Inner_std140_uint_4_0 %164 None
-               OpReturnValue %173
+        %177 = OpUGreaterThanEqual %bool %174 %uint_4
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+               OpBranch %173
+        %178 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_Inner_std140 %165 %174
+        %181 = OpLoad %Inner_std140 %180 None
+        %182 = OpAccessChain %_ptr_Function_Inner_std140 %167 %174
+               OpStore %182 %181 None
+               OpBranch %171
+        %171 = OpLabel
+        %175 = OpIAdd %uint %174 %uint_1
+               OpBranch %172
+        %173 = OpLabel
+        %176 = OpLoad %_arr_Inner_std140_uint_4_0 %167 None
+               OpReturnValue %176
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %181
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %184
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %182 = OpLabel
-        %183 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %184 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %183
-        %185 = OpCompositeConstruct %Outer_std140 %184
-               OpReturnValue %185
+        %185 = OpLabel
+        %186 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %187 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %186
+        %188 = OpCompositeConstruct %Outer_std140 %187
+               OpReturnValue %188
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %187
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %190
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %188 = OpLabel
-        %189 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %191 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %192
-               OpStore %189 %tint_source_1
-               OpBranch %193
-        %193 = OpLabel
+        %191 = OpLabel
+        %192 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %194 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %195
+               OpStore %192 %tint_source_1
                OpBranch %196
         %196 = OpLabel
-        %198 = OpPhi %uint %uint_0 %193 %199 %195
-               OpLoopMerge %197 %195 None
-               OpBranch %194
-        %194 = OpLabel
-        %201 = OpUGreaterThanEqual %bool %198 %uint_4
-               OpSelectionMerge %202 None
-               OpBranchConditional %201 %203 %202
-        %203 = OpLabel
+               OpBranch %199
+        %199 = OpLabel
+        %201 = OpPhi %uint %uint_0 %196 %202 %198
+               OpLoopMerge %200 %198 None
                OpBranch %197
-        %202 = OpLabel
-        %204 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %189 %198
-        %206 = OpLoad %Outer_std140_tint_explicit_layout %204 None
-        %207 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %206
-        %208 = OpAccessChain %_ptr_Function_Outer_std140 %191 %198
-               OpStore %208 %207 None
-               OpBranch %195
-        %195 = OpLabel
-        %199 = OpIAdd %uint %198 %uint_1
-               OpBranch %196
         %197 = OpLabel
-        %200 = OpLoad %_arr_Outer_std140_uint_4 %191 None
-               OpReturnValue %200
+        %204 = OpUGreaterThanEqual %bool %201 %uint_4
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %205
+        %206 = OpLabel
+               OpBranch %200
+        %205 = OpLabel
+        %207 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %192 %201
+        %209 = OpLoad %Outer_std140_tint_explicit_layout %207 None
+        %210 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %209
+        %211 = OpAccessChain %_ptr_Function_Outer_std140 %194 %201
+               OpStore %211 %210 None
+               OpBranch %198
+        %198 = OpLabel
+        %202 = OpIAdd %uint %201 %uint_1
+               OpBranch %199
+        %200 = OpLabel
+        %203 = OpLoad %_arr_Outer_std140_uint_4 %194 None
+               OpReturnValue %203
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 02d1955..de776fb 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -37,76 +37,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat2x3(tint_input.m_col0, tint_input.m_col1));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat2x3 v_6 = f16mat2x3(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1);
-  f16vec3 v_7 = v_6[min(uint(i()), 1u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat2x3 v_7 = f16mat2x3(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1);
+  f16vec3 v_8 = v_7[min(uint(i()), 1u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat2x3 l_a_i_a_i_m = v_6;
-  f16vec3 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 2u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat2x3 l_a_i_a_i_m = v_7;
+  f16vec3 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index c104b7a..c711321 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 210
+; Bound: 213
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -72,7 +72,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -93,243 +93,246 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %74 = OpConstantNull %_arr_Outer_uint_4
+         %77 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %95 = OpConstantNull %_arr_Inner_uint_4
+         %98 = OpConstantNull %_arr_Inner_uint_4
      %uint_2 = OpConstant %uint 2
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %132 = OpTypeFunction %Inner %Inner_std140
-        %139 = OpTypeFunction %Outer %Outer_std140
-        %161 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %135 = OpTypeFunction %Inner %Inner_std140
+        %142 = OpTypeFunction %Outer %Outer_std140
+        %164 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %166 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %182 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %188 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %169 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %185 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %191 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %193 = OpConstantNull %_arr_Outer_std140_uint_4
+        %196 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %52 = OpVariable %_ptr_Function_mat2v3half Function
-         %66 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %68 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %74
-         %91 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %93 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_0
-         %46 = OpLoad %v3half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %55 = OpVariable %_ptr_Function_mat2v3half Function
+         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
+         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_0
          %49 = OpLoad %v3half %47 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat2v3half %46 %49
-               OpStore %52 %l_a_i_a_i_m
-         %54 = OpFunctionCall %int %i
-         %55 = OpBitcast %uint %54
-         %56 = OpExtInst %uint %33 UMin %55 %uint_1
-         %57 = OpAccessChain %_ptr_Function_v3half %52 %56
-%l_a_i_a_i_m_i = OpLoad %v3half %57 None
-         %60 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %61 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %60
-               OpStore %66 %61
-               OpBranch %75
-         %75 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_1
+         %52 = OpLoad %v3half %50 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat2v3half %49 %52
+               OpStore %55 %l_a_i_a_i_m
+         %57 = OpFunctionCall %int %i
+         %58 = OpBitcast %uint %57
+         %59 = OpExtInst %uint %36 UMin %58 %uint_1
+         %60 = OpAccessChain %_ptr_Function_v3half %55 %59
+%l_a_i_a_i_m_i = OpLoad %v3half %60 None
+         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
+               OpStore %69 %64
                OpBranch %78
          %78 = OpLabel
-         %80 = OpPhi %uint %uint_0 %75 %81 %77
-               OpLoopMerge %79 %77 None
-               OpBranch %76
-         %76 = OpLabel
-        %112 = OpUGreaterThanEqual %bool %80 %uint_4
-               OpSelectionMerge %114 None
-               OpBranchConditional %112 %115 %114
-        %115 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %83 = OpPhi %uint %uint_0 %78 %84 %80
+               OpLoopMerge %82 %80 None
                OpBranch %79
-        %114 = OpLabel
-        %116 = OpAccessChain %_ptr_Function_Outer %68 %80
-        %118 = OpAccessChain %_ptr_Function_Outer_std140 %66 %80
-        %120 = OpLoad %Outer_std140 %118 None
-        %121 = OpFunctionCall %Outer %tint_convert_Outer %120
-               OpStore %116 %121 None
-               OpBranch %77
-         %77 = OpLabel
-         %81 = OpIAdd %uint %80 %uint_1
-               OpBranch %78
          %79 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %68 None
-         %83 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %84 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %83
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %84
-         %88 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %89 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %88
-               OpStore %91 %89
-               OpBranch %96
-         %96 = OpLabel
+        %115 = OpUGreaterThanEqual %bool %83 %uint_4
+               OpSelectionMerge %117 None
+               OpBranchConditional %115 %118 %117
+        %118 = OpLabel
+               OpBranch %82
+        %117 = OpLabel
+        %119 = OpAccessChain %_ptr_Function_Outer %71 %83
+        %121 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
+        %123 = OpLoad %Outer_std140 %121 None
+        %124 = OpFunctionCall %Outer %tint_convert_Outer %123
+               OpStore %119 %124 None
+               OpBranch %80
+         %80 = OpLabel
+         %84 = OpIAdd %uint %83 %uint_1
+               OpBranch %81
+         %82 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
+         %86 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
+         %91 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
+               OpStore %94 %92
                OpBranch %99
          %99 = OpLabel
-        %101 = OpPhi %uint %uint_0 %96 %102 %98
-               OpLoopMerge %100 %98 None
-               OpBranch %97
-         %97 = OpLabel
-        %122 = OpUGreaterThanEqual %bool %101 %uint_4
-               OpSelectionMerge %123 None
-               OpBranchConditional %122 %124 %123
-        %124 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %104 = OpPhi %uint %uint_0 %99 %105 %101
+               OpLoopMerge %103 %101 None
                OpBranch %100
-        %123 = OpLabel
-        %125 = OpAccessChain %_ptr_Function_Inner %93 %101
-        %127 = OpAccessChain %_ptr_Function_Inner_std140 %91 %101
-        %129 = OpLoad %Inner_std140 %127 None
-        %130 = OpFunctionCall %Inner %tint_convert_Inner %129
-               OpStore %125 %130 None
-               OpBranch %98
-         %98 = OpLabel
-        %102 = OpIAdd %uint %101 %uint_1
-               OpBranch %99
         %100 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %93 None
-        %104 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %104
-        %107 = OpFunctionCall %int %i
-        %108 = OpBitcast %uint %107
-        %109 = OpExtInst %uint %33 UMin %108 %uint_2
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %109
+        %125 = OpUGreaterThanEqual %bool %104 %uint_4
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+               OpBranch %103
+        %126 = OpLabel
+        %128 = OpAccessChain %_ptr_Function_Inner %96 %104
+        %130 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
+        %132 = OpLoad %Inner_std140 %130 None
+        %133 = OpFunctionCall %Inner %tint_convert_Inner %132
+               OpStore %128 %133 None
+               OpBranch %101
+        %101 = OpLabel
+        %105 = OpIAdd %uint %104 %uint_1
+               OpBranch %102
+        %103 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
+        %107 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
+        %110 = OpFunctionCall %int %i
+        %111 = OpBitcast %uint %110
+        %112 = OpExtInst %uint %36 UMin %111 %uint_2
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %112
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %132
+%tint_convert_Inner = OpFunction %Inner None %135
  %tint_input = OpFunctionParameter %Inner_std140
-        %133 = OpLabel
-        %134 = OpCompositeExtract %v3half %tint_input 0
-        %135 = OpCompositeExtract %v3half %tint_input 1
-        %136 = OpCompositeConstruct %mat2v3half %134 %135
-        %137 = OpCompositeConstruct %Inner %136
-               OpReturnValue %137
+        %136 = OpLabel
+        %137 = OpCompositeExtract %v3half %tint_input 0
+        %138 = OpCompositeExtract %v3half %tint_input 1
+        %139 = OpCompositeConstruct %mat2v3half %137 %138
+        %140 = OpCompositeConstruct %Inner %139
+               OpReturnValue %140
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %139
+%tint_convert_Outer = OpFunction %Outer None %142
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %140 = OpLabel
-        %142 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %143 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-        %141 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %142 %141
-               OpBranch %144
-        %144 = OpLabel
+        %143 = OpLabel
+        %145 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %146 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+        %144 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %145 %144
                OpBranch %147
         %147 = OpLabel
-        %149 = OpPhi %uint %uint_0 %144 %150 %146
-               OpLoopMerge %148 %146 None
-               OpBranch %145
-        %145 = OpLabel
-        %153 = OpUGreaterThanEqual %bool %149 %uint_4
-               OpSelectionMerge %154 None
-               OpBranchConditional %153 %155 %154
-        %155 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %152 = OpPhi %uint %uint_0 %147 %153 %149
+               OpLoopMerge %151 %149 None
                OpBranch %148
-        %154 = OpLabel
-        %156 = OpAccessChain %_ptr_Function_Inner %143 %149
-        %157 = OpAccessChain %_ptr_Function_Inner_std140 %142 %149
-        %158 = OpLoad %Inner_std140 %157 None
-        %159 = OpFunctionCall %Inner %tint_convert_Inner %158
-               OpStore %156 %159 None
-               OpBranch %146
-        %146 = OpLabel
-        %150 = OpIAdd %uint %149 %uint_1
-               OpBranch %147
         %148 = OpLabel
-        %151 = OpLoad %_arr_Inner_uint_4 %143 None
-        %152 = OpCompositeConstruct %Outer %151
-               OpReturnValue %152
+        %156 = OpUGreaterThanEqual %bool %152 %uint_4
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %157
+        %158 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+        %159 = OpAccessChain %_ptr_Function_Inner %146 %152
+        %160 = OpAccessChain %_ptr_Function_Inner_std140 %145 %152
+        %161 = OpLoad %Inner_std140 %160 None
+        %162 = OpFunctionCall %Inner %tint_convert_Inner %161
+               OpStore %159 %162 None
+               OpBranch %149
+        %149 = OpLabel
+        %153 = OpIAdd %uint %152 %uint_1
+               OpBranch %150
+        %151 = OpLabel
+        %154 = OpLoad %_arr_Inner_uint_4 %146 None
+        %155 = OpCompositeConstruct %Outer %154
+               OpReturnValue %155
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %161
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %164
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %162 = OpLabel
-        %163 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %165 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %166
-               OpStore %163 %tint_source
-               OpBranch %167
-        %167 = OpLabel
+        %165 = OpLabel
+        %166 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %168 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %169
+               OpStore %166 %tint_source
                OpBranch %170
         %170 = OpLabel
-        %172 = OpPhi %uint %uint_0 %167 %173 %169
-               OpLoopMerge %171 %169 None
-               OpBranch %168
-        %168 = OpLabel
-        %175 = OpUGreaterThanEqual %bool %172 %uint_4
-               OpSelectionMerge %176 None
-               OpBranchConditional %175 %177 %176
-        %177 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+        %175 = OpPhi %uint %uint_0 %170 %176 %172
+               OpLoopMerge %174 %172 None
                OpBranch %171
-        %176 = OpLabel
-        %178 = OpAccessChain %_ptr_Function_Inner_std140 %163 %172
-        %179 = OpLoad %Inner_std140 %178 None
-        %180 = OpAccessChain %_ptr_Function_Inner_std140 %165 %172
-               OpStore %180 %179 None
-               OpBranch %169
-        %169 = OpLabel
-        %173 = OpIAdd %uint %172 %uint_1
-               OpBranch %170
         %171 = OpLabel
-        %174 = OpLoad %_arr_Inner_std140_uint_4_0 %165 None
-               OpReturnValue %174
+        %178 = OpUGreaterThanEqual %bool %175 %uint_4
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+               OpBranch %174
+        %179 = OpLabel
+        %181 = OpAccessChain %_ptr_Function_Inner_std140 %166 %175
+        %182 = OpLoad %Inner_std140 %181 None
+        %183 = OpAccessChain %_ptr_Function_Inner_std140 %168 %175
+               OpStore %183 %182 None
+               OpBranch %172
+        %172 = OpLabel
+        %176 = OpIAdd %uint %175 %uint_1
+               OpBranch %173
+        %174 = OpLabel
+        %177 = OpLoad %_arr_Inner_std140_uint_4_0 %168 None
+               OpReturnValue %177
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %182
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %185
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %183 = OpLabel
-        %184 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %185 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %184
-        %186 = OpCompositeConstruct %Outer_std140 %185
-               OpReturnValue %186
+        %186 = OpLabel
+        %187 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %188 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %187
+        %189 = OpCompositeConstruct %Outer_std140 %188
+               OpReturnValue %189
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %188
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %191
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %189 = OpLabel
-        %190 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %192 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %193
-               OpStore %190 %tint_source_1
-               OpBranch %194
-        %194 = OpLabel
+        %192 = OpLabel
+        %193 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %195 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %196
+               OpStore %193 %tint_source_1
                OpBranch %197
         %197 = OpLabel
-        %199 = OpPhi %uint %uint_0 %194 %200 %196
-               OpLoopMerge %198 %196 None
-               OpBranch %195
-        %195 = OpLabel
-        %202 = OpUGreaterThanEqual %bool %199 %uint_4
-               OpSelectionMerge %203 None
-               OpBranchConditional %202 %204 %203
-        %204 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+        %202 = OpPhi %uint %uint_0 %197 %203 %199
+               OpLoopMerge %201 %199 None
                OpBranch %198
-        %203 = OpLabel
-        %205 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %190 %199
-        %207 = OpLoad %Outer_std140_tint_explicit_layout %205 None
-        %208 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %207
-        %209 = OpAccessChain %_ptr_Function_Outer_std140 %192 %199
-               OpStore %209 %208 None
-               OpBranch %196
-        %196 = OpLabel
-        %200 = OpIAdd %uint %199 %uint_1
-               OpBranch %197
         %198 = OpLabel
-        %201 = OpLoad %_arr_Outer_std140_uint_4 %192 None
-               OpReturnValue %201
+        %205 = OpUGreaterThanEqual %bool %202 %uint_4
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+               OpBranch %201
+        %206 = OpLabel
+        %208 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %193 %202
+        %210 = OpLoad %Outer_std140_tint_explicit_layout %208 None
+        %211 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %210
+        %212 = OpAccessChain %_ptr_Function_Outer_std140 %195 %202
+               OpStore %212 %211 None
+               OpBranch %199
+        %199 = OpLabel
+        %203 = OpIAdd %uint %202 %uint_1
+               OpBranch %200
+        %201 = OpLabel
+        %204 = OpLoad %_arr_Outer_std140_uint_4 %195 None
+               OpReturnValue %204
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 6ea76b1..e7db5b2 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -34,76 +34,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(mat2x3(tint_input.m_col0, tint_input.m_col1));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))));
+  Inner v_2[4] = Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  mat2x3 v_6 = mat2x3(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1);
-  vec3 v_7 = v_6[min(uint(i()), 1u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))));
+  uint v_6 = min(uint(i()), 3u);
+  mat2x3 v_7 = mat2x3(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1);
+  vec3 v_8 = v_7[min(uint(i()), 1u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))), Inner(mat2x3(vec3(0.0f), vec3(0.0f))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  mat2x3 l_a_i_a_i_m = v_6;
-  vec3 l_a_i_a_i_m_i = v_7;
-  float l_a_i_a_i_m_i_i = v_7[min(uint(i()), 2u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  mat2x3 l_a_i_a_i_m = v_7;
+  vec3 l_a_i_a_i_m_i = v_8;
+  float l_a_i_a_i_m_i_i = v_8[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index aa98529..8912a80 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 210
+; Bound: 213
 ; Schema: 0
                OpCapability Shader
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -69,7 +69,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -90,243 +90,246 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %74 = OpConstantNull %_arr_Outer_uint_4
+         %77 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %95 = OpConstantNull %_arr_Inner_uint_4
+         %98 = OpConstantNull %_arr_Inner_uint_4
      %uint_2 = OpConstant %uint 2
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %132 = OpTypeFunction %Inner %Inner_std140
-        %139 = OpTypeFunction %Outer %Outer_std140
-        %161 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %135 = OpTypeFunction %Inner %Inner_std140
+        %142 = OpTypeFunction %Outer %Outer_std140
+        %164 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %166 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %182 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %188 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %169 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %185 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %191 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %193 = OpConstantNull %_arr_Outer_std140_uint_4
+        %196 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %52 = OpVariable %_ptr_Function_mat2v3float Function
-         %66 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %68 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %74
-         %91 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %93 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_0
-         %46 = OpLoad %v3float %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %55 = OpVariable %_ptr_Function_mat2v3float Function
+         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
+         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_0
          %49 = OpLoad %v3float %47 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat2v3float %46 %49
-               OpStore %52 %l_a_i_a_i_m
-         %54 = OpFunctionCall %int %i
-         %55 = OpBitcast %uint %54
-         %56 = OpExtInst %uint %33 UMin %55 %uint_1
-         %57 = OpAccessChain %_ptr_Function_v3float %52 %56
-%l_a_i_a_i_m_i = OpLoad %v3float %57 None
-         %60 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %61 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %60
-               OpStore %66 %61
-               OpBranch %75
-         %75 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_1
+         %52 = OpLoad %v3float %50 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat2v3float %49 %52
+               OpStore %55 %l_a_i_a_i_m
+         %57 = OpFunctionCall %int %i
+         %58 = OpBitcast %uint %57
+         %59 = OpExtInst %uint %36 UMin %58 %uint_1
+         %60 = OpAccessChain %_ptr_Function_v3float %55 %59
+%l_a_i_a_i_m_i = OpLoad %v3float %60 None
+         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
+               OpStore %69 %64
                OpBranch %78
          %78 = OpLabel
-         %80 = OpPhi %uint %uint_0 %75 %81 %77
-               OpLoopMerge %79 %77 None
-               OpBranch %76
-         %76 = OpLabel
-        %112 = OpUGreaterThanEqual %bool %80 %uint_4
-               OpSelectionMerge %114 None
-               OpBranchConditional %112 %115 %114
-        %115 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %83 = OpPhi %uint %uint_0 %78 %84 %80
+               OpLoopMerge %82 %80 None
                OpBranch %79
-        %114 = OpLabel
-        %116 = OpAccessChain %_ptr_Function_Outer %68 %80
-        %118 = OpAccessChain %_ptr_Function_Outer_std140 %66 %80
-        %120 = OpLoad %Outer_std140 %118 None
-        %121 = OpFunctionCall %Outer %tint_convert_Outer %120
-               OpStore %116 %121 None
-               OpBranch %77
-         %77 = OpLabel
-         %81 = OpIAdd %uint %80 %uint_1
-               OpBranch %78
          %79 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %68 None
-         %83 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %84 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %83
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %84
-         %88 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %89 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %88
-               OpStore %91 %89
-               OpBranch %96
-         %96 = OpLabel
+        %115 = OpUGreaterThanEqual %bool %83 %uint_4
+               OpSelectionMerge %117 None
+               OpBranchConditional %115 %118 %117
+        %118 = OpLabel
+               OpBranch %82
+        %117 = OpLabel
+        %119 = OpAccessChain %_ptr_Function_Outer %71 %83
+        %121 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
+        %123 = OpLoad %Outer_std140 %121 None
+        %124 = OpFunctionCall %Outer %tint_convert_Outer %123
+               OpStore %119 %124 None
+               OpBranch %80
+         %80 = OpLabel
+         %84 = OpIAdd %uint %83 %uint_1
+               OpBranch %81
+         %82 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
+         %86 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
+         %91 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
+               OpStore %94 %92
                OpBranch %99
          %99 = OpLabel
-        %101 = OpPhi %uint %uint_0 %96 %102 %98
-               OpLoopMerge %100 %98 None
-               OpBranch %97
-         %97 = OpLabel
-        %122 = OpUGreaterThanEqual %bool %101 %uint_4
-               OpSelectionMerge %123 None
-               OpBranchConditional %122 %124 %123
-        %124 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %104 = OpPhi %uint %uint_0 %99 %105 %101
+               OpLoopMerge %103 %101 None
                OpBranch %100
-        %123 = OpLabel
-        %125 = OpAccessChain %_ptr_Function_Inner %93 %101
-        %127 = OpAccessChain %_ptr_Function_Inner_std140 %91 %101
-        %129 = OpLoad %Inner_std140 %127 None
-        %130 = OpFunctionCall %Inner %tint_convert_Inner %129
-               OpStore %125 %130 None
-               OpBranch %98
-         %98 = OpLabel
-        %102 = OpIAdd %uint %101 %uint_1
-               OpBranch %99
         %100 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %93 None
-        %104 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %104
-        %107 = OpFunctionCall %int %i
-        %108 = OpBitcast %uint %107
-        %109 = OpExtInst %uint %33 UMin %108 %uint_2
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %109
+        %125 = OpUGreaterThanEqual %bool %104 %uint_4
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+               OpBranch %103
+        %126 = OpLabel
+        %128 = OpAccessChain %_ptr_Function_Inner %96 %104
+        %130 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
+        %132 = OpLoad %Inner_std140 %130 None
+        %133 = OpFunctionCall %Inner %tint_convert_Inner %132
+               OpStore %128 %133 None
+               OpBranch %101
+        %101 = OpLabel
+        %105 = OpIAdd %uint %104 %uint_1
+               OpBranch %102
+        %103 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
+        %107 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
+        %110 = OpFunctionCall %int %i
+        %111 = OpBitcast %uint %110
+        %112 = OpExtInst %uint %36 UMin %111 %uint_2
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %112
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %132
+%tint_convert_Inner = OpFunction %Inner None %135
  %tint_input = OpFunctionParameter %Inner_std140
-        %133 = OpLabel
-        %134 = OpCompositeExtract %v3float %tint_input 0
-        %135 = OpCompositeExtract %v3float %tint_input 1
-        %136 = OpCompositeConstruct %mat2v3float %134 %135
-        %137 = OpCompositeConstruct %Inner %136
-               OpReturnValue %137
+        %136 = OpLabel
+        %137 = OpCompositeExtract %v3float %tint_input 0
+        %138 = OpCompositeExtract %v3float %tint_input 1
+        %139 = OpCompositeConstruct %mat2v3float %137 %138
+        %140 = OpCompositeConstruct %Inner %139
+               OpReturnValue %140
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %139
+%tint_convert_Outer = OpFunction %Outer None %142
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %140 = OpLabel
-        %142 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %143 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-        %141 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %142 %141
-               OpBranch %144
-        %144 = OpLabel
+        %143 = OpLabel
+        %145 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %146 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+        %144 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %145 %144
                OpBranch %147
         %147 = OpLabel
-        %149 = OpPhi %uint %uint_0 %144 %150 %146
-               OpLoopMerge %148 %146 None
-               OpBranch %145
-        %145 = OpLabel
-        %153 = OpUGreaterThanEqual %bool %149 %uint_4
-               OpSelectionMerge %154 None
-               OpBranchConditional %153 %155 %154
-        %155 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %152 = OpPhi %uint %uint_0 %147 %153 %149
+               OpLoopMerge %151 %149 None
                OpBranch %148
-        %154 = OpLabel
-        %156 = OpAccessChain %_ptr_Function_Inner %143 %149
-        %157 = OpAccessChain %_ptr_Function_Inner_std140 %142 %149
-        %158 = OpLoad %Inner_std140 %157 None
-        %159 = OpFunctionCall %Inner %tint_convert_Inner %158
-               OpStore %156 %159 None
-               OpBranch %146
-        %146 = OpLabel
-        %150 = OpIAdd %uint %149 %uint_1
-               OpBranch %147
         %148 = OpLabel
-        %151 = OpLoad %_arr_Inner_uint_4 %143 None
-        %152 = OpCompositeConstruct %Outer %151
-               OpReturnValue %152
+        %156 = OpUGreaterThanEqual %bool %152 %uint_4
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %157
+        %158 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+        %159 = OpAccessChain %_ptr_Function_Inner %146 %152
+        %160 = OpAccessChain %_ptr_Function_Inner_std140 %145 %152
+        %161 = OpLoad %Inner_std140 %160 None
+        %162 = OpFunctionCall %Inner %tint_convert_Inner %161
+               OpStore %159 %162 None
+               OpBranch %149
+        %149 = OpLabel
+        %153 = OpIAdd %uint %152 %uint_1
+               OpBranch %150
+        %151 = OpLabel
+        %154 = OpLoad %_arr_Inner_uint_4 %146 None
+        %155 = OpCompositeConstruct %Outer %154
+               OpReturnValue %155
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %161
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %164
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %162 = OpLabel
-        %163 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %165 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %166
-               OpStore %163 %tint_source
-               OpBranch %167
-        %167 = OpLabel
+        %165 = OpLabel
+        %166 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %168 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %169
+               OpStore %166 %tint_source
                OpBranch %170
         %170 = OpLabel
-        %172 = OpPhi %uint %uint_0 %167 %173 %169
-               OpLoopMerge %171 %169 None
-               OpBranch %168
-        %168 = OpLabel
-        %175 = OpUGreaterThanEqual %bool %172 %uint_4
-               OpSelectionMerge %176 None
-               OpBranchConditional %175 %177 %176
-        %177 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+        %175 = OpPhi %uint %uint_0 %170 %176 %172
+               OpLoopMerge %174 %172 None
                OpBranch %171
-        %176 = OpLabel
-        %178 = OpAccessChain %_ptr_Function_Inner_std140 %163 %172
-        %179 = OpLoad %Inner_std140 %178 None
-        %180 = OpAccessChain %_ptr_Function_Inner_std140 %165 %172
-               OpStore %180 %179 None
-               OpBranch %169
-        %169 = OpLabel
-        %173 = OpIAdd %uint %172 %uint_1
-               OpBranch %170
         %171 = OpLabel
-        %174 = OpLoad %_arr_Inner_std140_uint_4_0 %165 None
-               OpReturnValue %174
+        %178 = OpUGreaterThanEqual %bool %175 %uint_4
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+               OpBranch %174
+        %179 = OpLabel
+        %181 = OpAccessChain %_ptr_Function_Inner_std140 %166 %175
+        %182 = OpLoad %Inner_std140 %181 None
+        %183 = OpAccessChain %_ptr_Function_Inner_std140 %168 %175
+               OpStore %183 %182 None
+               OpBranch %172
+        %172 = OpLabel
+        %176 = OpIAdd %uint %175 %uint_1
+               OpBranch %173
+        %174 = OpLabel
+        %177 = OpLoad %_arr_Inner_std140_uint_4_0 %168 None
+               OpReturnValue %177
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %182
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %185
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %183 = OpLabel
-        %184 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %185 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %184
-        %186 = OpCompositeConstruct %Outer_std140 %185
-               OpReturnValue %186
+        %186 = OpLabel
+        %187 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %188 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %187
+        %189 = OpCompositeConstruct %Outer_std140 %188
+               OpReturnValue %189
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %188
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %191
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %189 = OpLabel
-        %190 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %192 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %193
-               OpStore %190 %tint_source_1
-               OpBranch %194
-        %194 = OpLabel
+        %192 = OpLabel
+        %193 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %195 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %196
+               OpStore %193 %tint_source_1
                OpBranch %197
         %197 = OpLabel
-        %199 = OpPhi %uint %uint_0 %194 %200 %196
-               OpLoopMerge %198 %196 None
-               OpBranch %195
-        %195 = OpLabel
-        %202 = OpUGreaterThanEqual %bool %199 %uint_4
-               OpSelectionMerge %203 None
-               OpBranchConditional %202 %204 %203
-        %204 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+        %202 = OpPhi %uint %uint_0 %197 %203 %199
+               OpLoopMerge %201 %199 None
                OpBranch %198
-        %203 = OpLabel
-        %205 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %190 %199
-        %207 = OpLoad %Outer_std140_tint_explicit_layout %205 None
-        %208 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %207
-        %209 = OpAccessChain %_ptr_Function_Outer_std140 %192 %199
-               OpStore %209 %208 None
-               OpBranch %196
-        %196 = OpLabel
-        %200 = OpIAdd %uint %199 %uint_1
-               OpBranch %197
         %198 = OpLabel
-        %201 = OpLoad %_arr_Outer_std140_uint_4 %192 None
-               OpReturnValue %201
+        %205 = OpUGreaterThanEqual %bool %202 %uint_4
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+               OpBranch %201
+        %206 = OpLabel
+        %208 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %193 %202
+        %210 = OpLoad %Outer_std140_tint_explicit_layout %208 None
+        %211 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %210
+        %212 = OpAccessChain %_ptr_Function_Outer_std140 %195 %202
+               OpStore %212 %211 None
+               OpBranch %199
+        %199 = OpLabel
+        %203 = OpIAdd %uint %202 %uint_1
+               OpBranch %200
+        %201 = OpLabel
+        %204 = OpLoad %_arr_Outer_std140_uint_4 %195 None
+               OpReturnValue %204
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index b2d15aa..304b40a 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -37,76 +37,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat2x4(tint_input.m_col0, tint_input.m_col1));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat2x4 v_6 = f16mat2x4(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1);
-  f16vec4 v_7 = v_6[min(uint(i()), 1u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat2x4 v_7 = f16mat2x4(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1);
+  f16vec4 v_8 = v_7[min(uint(i()), 1u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat2x4 l_a_i_a_i_m = v_6;
-  f16vec4 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 3u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat2x4 l_a_i_a_i_m = v_7;
+  f16vec4 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 560ffa4..f5ab81c 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 209
+; Bound: 212
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -72,7 +72,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -93,242 +93,245 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %74 = OpConstantNull %_arr_Outer_uint_4
+         %77 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %95 = OpConstantNull %_arr_Inner_uint_4
+         %98 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %131 = OpTypeFunction %Inner %Inner_std140
-        %138 = OpTypeFunction %Outer %Outer_std140
-        %160 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %134 = OpTypeFunction %Inner %Inner_std140
+        %141 = OpTypeFunction %Outer %Outer_std140
+        %163 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %165 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %181 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %187 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %168 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %184 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %190 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpConstantNull %_arr_Outer_std140_uint_4
+        %195 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %52 = OpVariable %_ptr_Function_mat2v4half Function
-         %66 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %68 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %74
-         %91 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %93 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_0
-         %46 = OpLoad %v4half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %55 = OpVariable %_ptr_Function_mat2v4half Function
+         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
+         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_0
          %49 = OpLoad %v4half %47 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat2v4half %46 %49
-               OpStore %52 %l_a_i_a_i_m
-         %54 = OpFunctionCall %int %i
-         %55 = OpBitcast %uint %54
-         %56 = OpExtInst %uint %33 UMin %55 %uint_1
-         %57 = OpAccessChain %_ptr_Function_v4half %52 %56
-%l_a_i_a_i_m_i = OpLoad %v4half %57 None
-         %60 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %61 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %60
-               OpStore %66 %61
-               OpBranch %75
-         %75 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_1
+         %52 = OpLoad %v4half %50 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat2v4half %49 %52
+               OpStore %55 %l_a_i_a_i_m
+         %57 = OpFunctionCall %int %i
+         %58 = OpBitcast %uint %57
+         %59 = OpExtInst %uint %36 UMin %58 %uint_1
+         %60 = OpAccessChain %_ptr_Function_v4half %55 %59
+%l_a_i_a_i_m_i = OpLoad %v4half %60 None
+         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
+               OpStore %69 %64
                OpBranch %78
          %78 = OpLabel
-         %80 = OpPhi %uint %uint_0 %75 %81 %77
-               OpLoopMerge %79 %77 None
-               OpBranch %76
-         %76 = OpLabel
-        %111 = OpUGreaterThanEqual %bool %80 %uint_4
-               OpSelectionMerge %113 None
-               OpBranchConditional %111 %114 %113
-        %114 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %83 = OpPhi %uint %uint_0 %78 %84 %80
+               OpLoopMerge %82 %80 None
                OpBranch %79
-        %113 = OpLabel
-        %115 = OpAccessChain %_ptr_Function_Outer %68 %80
-        %117 = OpAccessChain %_ptr_Function_Outer_std140 %66 %80
-        %119 = OpLoad %Outer_std140 %117 None
-        %120 = OpFunctionCall %Outer %tint_convert_Outer %119
-               OpStore %115 %120 None
-               OpBranch %77
-         %77 = OpLabel
-         %81 = OpIAdd %uint %80 %uint_1
-               OpBranch %78
          %79 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %68 None
-         %83 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %84 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %83
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %84
-         %88 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %89 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %88
-               OpStore %91 %89
-               OpBranch %96
-         %96 = OpLabel
+        %114 = OpUGreaterThanEqual %bool %83 %uint_4
+               OpSelectionMerge %116 None
+               OpBranchConditional %114 %117 %116
+        %117 = OpLabel
+               OpBranch %82
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
+        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
+        %122 = OpLoad %Outer_std140 %120 None
+        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
+               OpStore %118 %123 None
+               OpBranch %80
+         %80 = OpLabel
+         %84 = OpIAdd %uint %83 %uint_1
+               OpBranch %81
+         %82 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
+         %86 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
+         %91 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
+               OpStore %94 %92
                OpBranch %99
          %99 = OpLabel
-        %101 = OpPhi %uint %uint_0 %96 %102 %98
-               OpLoopMerge %100 %98 None
-               OpBranch %97
-         %97 = OpLabel
-        %121 = OpUGreaterThanEqual %bool %101 %uint_4
-               OpSelectionMerge %122 None
-               OpBranchConditional %121 %123 %122
-        %123 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %104 = OpPhi %uint %uint_0 %99 %105 %101
+               OpLoopMerge %103 %101 None
                OpBranch %100
-        %122 = OpLabel
-        %124 = OpAccessChain %_ptr_Function_Inner %93 %101
-        %126 = OpAccessChain %_ptr_Function_Inner_std140 %91 %101
-        %128 = OpLoad %Inner_std140 %126 None
-        %129 = OpFunctionCall %Inner %tint_convert_Inner %128
-               OpStore %124 %129 None
-               OpBranch %98
-         %98 = OpLabel
-        %102 = OpIAdd %uint %101 %uint_1
-               OpBranch %99
         %100 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %93 None
-        %104 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %104
-        %107 = OpFunctionCall %int %i
-        %108 = OpBitcast %uint %107
-        %109 = OpExtInst %uint %33 UMin %108 %uint_3
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %109
+        %124 = OpUGreaterThanEqual %bool %104 %uint_4
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %103
+        %125 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
+        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
+        %131 = OpLoad %Inner_std140 %129 None
+        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
+               OpStore %127 %132 None
+               OpBranch %101
+        %101 = OpLabel
+        %105 = OpIAdd %uint %104 %uint_1
+               OpBranch %102
+        %103 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
+        %107 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
+        %110 = OpFunctionCall %int %i
+        %111 = OpBitcast %uint %110
+        %112 = OpExtInst %uint %36 UMin %111 %uint_3
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %112
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %131
+%tint_convert_Inner = OpFunction %Inner None %134
  %tint_input = OpFunctionParameter %Inner_std140
-        %132 = OpLabel
-        %133 = OpCompositeExtract %v4half %tint_input 0
-        %134 = OpCompositeExtract %v4half %tint_input 1
-        %135 = OpCompositeConstruct %mat2v4half %133 %134
-        %136 = OpCompositeConstruct %Inner %135
-               OpReturnValue %136
+        %135 = OpLabel
+        %136 = OpCompositeExtract %v4half %tint_input 0
+        %137 = OpCompositeExtract %v4half %tint_input 1
+        %138 = OpCompositeConstruct %mat2v4half %136 %137
+        %139 = OpCompositeConstruct %Inner %138
+               OpReturnValue %139
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %138
+%tint_convert_Outer = OpFunction %Outer None %141
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %139 = OpLabel
-        %141 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %142 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %95
-        %140 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %141 %140
-               OpBranch %143
-        %143 = OpLabel
+        %142 = OpLabel
+        %144 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %145 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
+        %143 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %144 %143
                OpBranch %146
         %146 = OpLabel
-        %148 = OpPhi %uint %uint_0 %143 %149 %145
-               OpLoopMerge %147 %145 None
-               OpBranch %144
-        %144 = OpLabel
-        %152 = OpUGreaterThanEqual %bool %148 %uint_4
-               OpSelectionMerge %153 None
-               OpBranchConditional %152 %154 %153
-        %154 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %151 = OpPhi %uint %uint_0 %146 %152 %148
+               OpLoopMerge %150 %148 None
                OpBranch %147
-        %153 = OpLabel
-        %155 = OpAccessChain %_ptr_Function_Inner %142 %148
-        %156 = OpAccessChain %_ptr_Function_Inner_std140 %141 %148
-        %157 = OpLoad %Inner_std140 %156 None
-        %158 = OpFunctionCall %Inner %tint_convert_Inner %157
-               OpStore %155 %158 None
-               OpBranch %145
-        %145 = OpLabel
-        %149 = OpIAdd %uint %148 %uint_1
-               OpBranch %146
         %147 = OpLabel
-        %150 = OpLoad %_arr_Inner_uint_4 %142 None
-        %151 = OpCompositeConstruct %Outer %150
-               OpReturnValue %151
+        %155 = OpUGreaterThanEqual %bool %151 %uint_4
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %156
+        %157 = OpLabel
+               OpBranch %150
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Function_Inner %145 %151
+        %159 = OpAccessChain %_ptr_Function_Inner_std140 %144 %151
+        %160 = OpLoad %Inner_std140 %159 None
+        %161 = OpFunctionCall %Inner %tint_convert_Inner %160
+               OpStore %158 %161 None
+               OpBranch %148
+        %148 = OpLabel
+        %152 = OpIAdd %uint %151 %uint_1
+               OpBranch %149
+        %150 = OpLabel
+        %153 = OpLoad %_arr_Inner_uint_4 %145 None
+        %154 = OpCompositeConstruct %Outer %153
+               OpReturnValue %154
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %160
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %163
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %161 = OpLabel
-        %162 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %164 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %165
-               OpStore %162 %tint_source
-               OpBranch %166
-        %166 = OpLabel
+        %164 = OpLabel
+        %165 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %167 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %168
+               OpStore %165 %tint_source
                OpBranch %169
         %169 = OpLabel
-        %171 = OpPhi %uint %uint_0 %166 %172 %168
-               OpLoopMerge %170 %168 None
-               OpBranch %167
-        %167 = OpLabel
-        %174 = OpUGreaterThanEqual %bool %171 %uint_4
-               OpSelectionMerge %175 None
-               OpBranchConditional %174 %176 %175
-        %176 = OpLabel
+               OpBranch %172
+        %172 = OpLabel
+        %174 = OpPhi %uint %uint_0 %169 %175 %171
+               OpLoopMerge %173 %171 None
                OpBranch %170
-        %175 = OpLabel
-        %177 = OpAccessChain %_ptr_Function_Inner_std140 %162 %171
-        %178 = OpLoad %Inner_std140 %177 None
-        %179 = OpAccessChain %_ptr_Function_Inner_std140 %164 %171
-               OpStore %179 %178 None
-               OpBranch %168
-        %168 = OpLabel
-        %172 = OpIAdd %uint %171 %uint_1
-               OpBranch %169
         %170 = OpLabel
-        %173 = OpLoad %_arr_Inner_std140_uint_4_0 %164 None
-               OpReturnValue %173
+        %177 = OpUGreaterThanEqual %bool %174 %uint_4
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+               OpBranch %173
+        %178 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_Inner_std140 %165 %174
+        %181 = OpLoad %Inner_std140 %180 None
+        %182 = OpAccessChain %_ptr_Function_Inner_std140 %167 %174
+               OpStore %182 %181 None
+               OpBranch %171
+        %171 = OpLabel
+        %175 = OpIAdd %uint %174 %uint_1
+               OpBranch %172
+        %173 = OpLabel
+        %176 = OpLoad %_arr_Inner_std140_uint_4_0 %167 None
+               OpReturnValue %176
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %181
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %184
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %182 = OpLabel
-        %183 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %184 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %183
-        %185 = OpCompositeConstruct %Outer_std140 %184
-               OpReturnValue %185
+        %185 = OpLabel
+        %186 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %187 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %186
+        %188 = OpCompositeConstruct %Outer_std140 %187
+               OpReturnValue %188
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %187
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %190
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %188 = OpLabel
-        %189 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %191 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %192
-               OpStore %189 %tint_source_1
-               OpBranch %193
-        %193 = OpLabel
+        %191 = OpLabel
+        %192 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %194 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %195
+               OpStore %192 %tint_source_1
                OpBranch %196
         %196 = OpLabel
-        %198 = OpPhi %uint %uint_0 %193 %199 %195
-               OpLoopMerge %197 %195 None
-               OpBranch %194
-        %194 = OpLabel
-        %201 = OpUGreaterThanEqual %bool %198 %uint_4
-               OpSelectionMerge %202 None
-               OpBranchConditional %201 %203 %202
-        %203 = OpLabel
+               OpBranch %199
+        %199 = OpLabel
+        %201 = OpPhi %uint %uint_0 %196 %202 %198
+               OpLoopMerge %200 %198 None
                OpBranch %197
-        %202 = OpLabel
-        %204 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %189 %198
-        %206 = OpLoad %Outer_std140_tint_explicit_layout %204 None
-        %207 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %206
-        %208 = OpAccessChain %_ptr_Function_Outer_std140 %191 %198
-               OpStore %208 %207 None
-               OpBranch %195
-        %195 = OpLabel
-        %199 = OpIAdd %uint %198 %uint_1
-               OpBranch %196
         %197 = OpLabel
-        %200 = OpLoad %_arr_Outer_std140_uint_4 %191 None
-               OpReturnValue %200
+        %204 = OpUGreaterThanEqual %bool %201 %uint_4
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %205
+        %206 = OpLabel
+               OpBranch %200
+        %205 = OpLabel
+        %207 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %192 %201
+        %209 = OpLoad %Outer_std140_tint_explicit_layout %207 None
+        %210 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %209
+        %211 = OpAccessChain %_ptr_Function_Outer_std140 %194 %201
+               OpStore %211 %210 None
+               OpBranch %198
+        %198 = OpLabel
+        %202 = OpIAdd %uint %201 %uint_1
+               OpBranch %199
+        %200 = OpLabel
+        %203 = OpLoad %_arr_Outer_std140_uint_4 %194 None
+               OpReturnValue %203
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 8d38e28..22bc747 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -23,19 +23,20 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_1 = min(uint(i()), 3u);
   uint v_2 = min(uint(i()), 3u);
-  uint v_3 = min(uint(i()), 1u);
+  uint v_3 = min(uint(i()), 3u);
+  uint v_4 = min(uint(i()), 1u);
   Outer l_a[4] = v.inner;
-  Outer l_a_i = v.inner[v_1];
-  Inner l_a_i_a[4] = v.inner[v_1].a;
-  Inner l_a_i_a_i = v.inner[v_1].a[v_2];
-  mat2x4 l_a_i_a_i_m = v.inner[v_1].a[v_2].m;
-  vec4 l_a_i_a_i_m_i = v.inner[v_1].a[v_2].m[v_3];
-  float l_a_i_a_i_m_i_i = v.inner[v_1].a[v_2].m[v_3][min(uint(i()), 3u)];
+  Outer l_a_i = v.inner[v_2];
+  Inner l_a_i_a[4] = v.inner[v_2].a;
+  Inner l_a_i_a_i = v.inner[v_2].a[v_3];
+  mat2x4 l_a_i_a_i_m = v.inner[v_2].a[v_3].m;
+  vec4 l_a_i_a_i_m_i = v.inner[v_2].a[v_3].m[v_4];
+  float l_a_i_a_i_m_i_i = v.inner[v_2].a[v_3].m[v_4][min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 9c21d4f..c961dd4 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 129
+; Bound: 132
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -68,7 +68,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -82,130 +82,133 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4_0
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Uniform_float = OpTypePointer Uniform %float
-         %75 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
+         %78 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4_0 = OpTypePointer Function %_arr_Inner_uint_4_0
-         %81 = OpConstantNull %_arr_Inner_uint_4_0
+         %84 = OpConstantNull %_arr_Inner_uint_4_0
        %bool = OpTypeBool
 %_ptr_Function_Inner = OpTypePointer Function %Inner
-         %99 = OpTypeFunction %Outer %Outer_tint_explicit_layout
-        %105 = OpTypeFunction %_arr_Outer_uint_4 %_arr_Outer_tint_explicit_layout_uint_4
+        %102 = OpTypeFunction %Outer %Outer_tint_explicit_layout
+        %108 = OpTypeFunction %_arr_Outer_uint_4 %_arr_Outer_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-        %111 = OpConstantNull %_arr_Outer_uint_4
+        %114 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function_Outer_tint_explicit_layout = OpTypePointer Function %Outer_tint_explicit_layout
 %_ptr_Function_Outer = OpTypePointer Function %Outer
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
+          %f = OpFunction %void None %29
+         %30 = OpLabel
         %p_a = OpAccessChain %_ptr_Uniform__arr_Outer_tint_explicit_layout_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-      %p_a_i = OpAccessChain %_ptr_Uniform_Outer_tint_explicit_layout %p_a %33
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+      %p_a_i = OpAccessChain %_ptr_Uniform_Outer_tint_explicit_layout %p_a %36
     %p_a_i_a = OpAccessChain %_ptr_Uniform__arr_Inner_uint_4 %p_a_i %uint_0
-         %40 = OpFunctionCall %int %i
-         %41 = OpBitcast %uint %40
-         %42 = OpExtInst %uint %34 UMin %41 %uint_3
-  %p_a_i_a_i = OpAccessChain %_ptr_Uniform_Inner %p_a_i_a %42
+         %43 = OpFunctionCall %int %i
+         %44 = OpBitcast %uint %43
+         %45 = OpExtInst %uint %37 UMin %44 %uint_3
+  %p_a_i_a_i = OpAccessChain %_ptr_Uniform_Inner %p_a_i_a %45
 %p_a_i_a_i_m = OpAccessChain %_ptr_Uniform_mat2v4float %p_a_i_a_i %uint_0
-         %47 = OpFunctionCall %int %i
-         %48 = OpBitcast %uint %47
-         %49 = OpExtInst %uint %34 UMin %48 %uint_1
-%p_a_i_a_i_m_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i_a_i_m %49
-         %53 = OpLoad %_arr_Outer_tint_explicit_layout_uint_4 %p_a None
-        %l_a = OpFunctionCall %_arr_Outer_uint_4 %tint_convert_explicit_layout_1 %53
-         %59 = OpLoad %Outer_tint_explicit_layout %p_a_i None
-      %l_a_i = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %59
-         %62 = OpLoad %_arr_Inner_uint_4 %p_a_i_a None
-    %l_a_i_a = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %62
+         %50 = OpFunctionCall %int %i
+         %51 = OpBitcast %uint %50
+         %52 = OpExtInst %uint %37 UMin %51 %uint_1
+%p_a_i_a_i_m_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i_a_i_m %52
+         %56 = OpLoad %_arr_Outer_tint_explicit_layout_uint_4 %p_a None
+        %l_a = OpFunctionCall %_arr_Outer_uint_4 %tint_convert_explicit_layout_1 %56
+         %62 = OpLoad %Outer_tint_explicit_layout %p_a_i None
+      %l_a_i = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %62
+         %65 = OpLoad %_arr_Inner_uint_4 %p_a_i_a None
+    %l_a_i_a = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %65
   %l_a_i_a_i = OpLoad %Inner %p_a_i_a_i None
 %l_a_i_a_i_m = OpLoad %mat2v4float %p_a_i_a_i_m None
 %l_a_i_a_i_m_i = OpLoad %v4float %p_a_i_a_i_m_i None
-         %68 = OpFunctionCall %int %i
-         %69 = OpBitcast %uint %68
-         %70 = OpExtInst %uint %34 UMin %69 %uint_3
-         %71 = OpAccessChain %_ptr_Uniform_float %p_a_i_a_i_m_i %70
-%l_a_i_a_i_m_i_i = OpLoad %float %71 None
+         %71 = OpFunctionCall %int %i
+         %72 = OpBitcast %uint %71
+         %73 = OpExtInst %uint %37 UMin %72 %uint_3
+         %74 = OpAccessChain %_ptr_Uniform_float %p_a_i_a_i_m_i %73
+%l_a_i_a_i_m_i_i = OpLoad %float %74 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_uint_4_0 None %75
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_uint_4_0 None %78
 %tint_source = OpFunctionParameter %_arr_Inner_uint_4
-         %76 = OpLabel
-         %77 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
-         %79 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %81
-               OpStore %77 %tint_source
-               OpBranch %82
-         %82 = OpLabel
+         %79 = OpLabel
+         %80 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
+         %82 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %84
+               OpStore %80 %tint_source
                OpBranch %85
          %85 = OpLabel
-         %87 = OpPhi %uint %uint_0 %82 %88 %84
-               OpLoopMerge %86 %84 None
-               OpBranch %83
-         %83 = OpLabel
-         %90 = OpUGreaterThanEqual %bool %87 %uint_4
-               OpSelectionMerge %92 None
-               OpBranchConditional %90 %93 %92
-         %93 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+         %90 = OpPhi %uint %uint_0 %85 %91 %87
+               OpLoopMerge %89 %87 None
                OpBranch %86
-         %92 = OpLabel
-         %94 = OpAccessChain %_ptr_Function_Inner %77 %87
-         %96 = OpLoad %Inner %94 None
-         %97 = OpAccessChain %_ptr_Function_Inner %79 %87
-               OpStore %97 %96 None
-               OpBranch %84
-         %84 = OpLabel
-         %88 = OpIAdd %uint %87 %uint_1
-               OpBranch %85
          %86 = OpLabel
-         %89 = OpLoad %_arr_Inner_uint_4_0 %79 None
-               OpReturnValue %89
+         %93 = OpUGreaterThanEqual %bool %90 %uint_4
+               OpSelectionMerge %95 None
+               OpBranchConditional %93 %96 %95
+         %96 = OpLabel
+               OpBranch %89
+         %95 = OpLabel
+         %97 = OpAccessChain %_ptr_Function_Inner %80 %90
+         %99 = OpLoad %Inner %97 None
+        %100 = OpAccessChain %_ptr_Function_Inner %82 %90
+               OpStore %100 %99 None
+               OpBranch %87
+         %87 = OpLabel
+         %91 = OpIAdd %uint %90 %uint_1
+               OpBranch %88
+         %89 = OpLabel
+         %92 = OpLoad %_arr_Inner_uint_4_0 %82 None
+               OpReturnValue %92
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer None %99
+%tint_convert_explicit_layout_0 = OpFunction %Outer None %102
 %tint_source_0 = OpFunctionParameter %Outer_tint_explicit_layout
-        %100 = OpLabel
-        %101 = OpCompositeExtract %_arr_Inner_uint_4 %tint_source_0 0
-        %102 = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %101
-        %103 = OpCompositeConstruct %Outer %102
-               OpReturnValue %103
+        %103 = OpLabel
+        %104 = OpCompositeExtract %_arr_Inner_uint_4 %tint_source_0 0
+        %105 = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %104
+        %106 = OpCompositeConstruct %Outer %105
+               OpReturnValue %106
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_uint_4 None %105
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_uint_4 None %108
 %tint_source_1 = OpFunctionParameter %_arr_Outer_tint_explicit_layout_uint_4
-        %106 = OpLabel
-        %107 = OpVariable %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 Function
-        %109 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %111
-               OpStore %107 %tint_source_1
-               OpBranch %112
-        %112 = OpLabel
+        %109 = OpLabel
+        %110 = OpVariable %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 Function
+        %112 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %114
+               OpStore %110 %tint_source_1
                OpBranch %115
         %115 = OpLabel
-        %117 = OpPhi %uint %uint_0 %112 %118 %114
-               OpLoopMerge %116 %114 None
-               OpBranch %113
-        %113 = OpLabel
-        %120 = OpUGreaterThanEqual %bool %117 %uint_4
-               OpSelectionMerge %121 None
-               OpBranchConditional %120 %122 %121
-        %122 = OpLabel
+               OpBranch %118
+        %118 = OpLabel
+        %120 = OpPhi %uint %uint_0 %115 %121 %117
+               OpLoopMerge %119 %117 None
                OpBranch %116
-        %121 = OpLabel
-        %123 = OpAccessChain %_ptr_Function_Outer_tint_explicit_layout %107 %117
-        %125 = OpLoad %Outer_tint_explicit_layout %123 None
-        %126 = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %125
-        %127 = OpAccessChain %_ptr_Function_Outer %109 %117
-               OpStore %127 %126 None
-               OpBranch %114
-        %114 = OpLabel
-        %118 = OpIAdd %uint %117 %uint_1
-               OpBranch %115
         %116 = OpLabel
-        %119 = OpLoad %_arr_Outer_uint_4 %109 None
-               OpReturnValue %119
+        %123 = OpUGreaterThanEqual %bool %120 %uint_4
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %124
+        %125 = OpLabel
+               OpBranch %119
+        %124 = OpLabel
+        %126 = OpAccessChain %_ptr_Function_Outer_tint_explicit_layout %110 %120
+        %128 = OpLoad %Outer_tint_explicit_layout %126 None
+        %129 = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %128
+        %130 = OpAccessChain %_ptr_Function_Outer %112 %120
+               OpStore %130 %129 None
+               OpBranch %117
+        %117 = OpLabel
+        %121 = OpIAdd %uint %120 %uint_1
+               OpBranch %118
+        %119 = OpLabel
+        %122 = OpLoad %_arr_Outer_uint_4 %112 None
+               OpReturnValue %122
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 6d0584e..d7c4807 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -39,76 +39,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat3x2(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat3x2 v_6 = f16mat3x2(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2);
-  f16vec2 v_7 = v_6[min(uint(i()), 2u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat3x2 v_7 = f16mat3x2(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2);
+  f16vec2 v_8 = v_7[min(uint(i()), 2u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat3x2 l_a_i_a_i_m = v_6;
-  f16vec2 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 1u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat3x2 l_a_i_a_i_m = v_7;
+  f16vec2 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index dad729a..e638f26 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 213
+; Bound: 216
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -74,7 +74,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -96,245 +96,248 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %77 = OpConstantNull %_arr_Outer_uint_4
+         %80 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %98 = OpConstantNull %_arr_Inner_uint_4
+        %101 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %134 = OpTypeFunction %Inner %Inner_std140
-        %142 = OpTypeFunction %Outer %Outer_std140
-        %164 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %137 = OpTypeFunction %Inner %Inner_std140
+        %145 = OpTypeFunction %Outer %Outer_std140
+        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %169 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %185 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %191 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %196 = OpConstantNull %_arr_Outer_std140_uint_4
+        %199 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %55 = OpVariable %_ptr_Function_mat3v2half Function
-         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
-         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_0
-         %46 = OpLoad %v2half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %58 = OpVariable %_ptr_Function_mat3v2half Function
+         %72 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %80
+         %97 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %99 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_0
          %49 = OpLoad %v2half %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_1
          %52 = OpLoad %v2half %50 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat3v2half %46 %49 %52
-               OpStore %55 %l_a_i_a_i_m
-         %57 = OpFunctionCall %int %i
-         %58 = OpBitcast %uint %57
-         %59 = OpExtInst %uint %33 UMin %58 %uint_2
-         %60 = OpAccessChain %_ptr_Function_v2half %55 %59
-%l_a_i_a_i_m_i = OpLoad %v2half %60 None
-         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
-               OpStore %69 %64
-               OpBranch %78
-         %78 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_2
+         %55 = OpLoad %v2half %53 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat3v2half %49 %52 %55
+               OpStore %58 %l_a_i_a_i_m
+         %60 = OpFunctionCall %int %i
+         %61 = OpBitcast %uint %60
+         %62 = OpExtInst %uint %36 UMin %61 %uint_2
+         %63 = OpAccessChain %_ptr_Function_v2half %58 %62
+%l_a_i_a_i_m_i = OpLoad %v2half %63 None
+         %66 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %67 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %66
+               OpStore %72 %67
                OpBranch %81
          %81 = OpLabel
-         %83 = OpPhi %uint %uint_0 %78 %84 %80
-               OpLoopMerge %82 %80 None
-               OpBranch %79
-         %79 = OpLabel
-        %114 = OpUGreaterThanEqual %bool %83 %uint_4
-               OpSelectionMerge %116 None
-               OpBranchConditional %114 %117 %116
-        %117 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpPhi %uint %uint_0 %81 %87 %83
+               OpLoopMerge %85 %83 None
                OpBranch %82
-        %116 = OpLabel
-        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
-        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
-        %122 = OpLoad %Outer_std140 %120 None
-        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
-               OpStore %118 %123 None
-               OpBranch %80
-         %80 = OpLabel
-         %84 = OpIAdd %uint %83 %uint_1
-               OpBranch %81
          %82 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
-         %86 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
-         %91 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
-               OpStore %94 %92
-               OpBranch %99
-         %99 = OpLabel
+        %117 = OpUGreaterThanEqual %bool %86 %uint_4
+               OpSelectionMerge %119 None
+               OpBranchConditional %117 %120 %119
+        %120 = OpLabel
+               OpBranch %85
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_Outer %74 %86
+        %123 = OpAccessChain %_ptr_Function_Outer_std140 %72 %86
+        %125 = OpLoad %Outer_std140 %123 None
+        %126 = OpFunctionCall %Outer %tint_convert_Outer %125
+               OpStore %121 %126 None
+               OpBranch %83
+         %83 = OpLabel
+         %87 = OpIAdd %uint %86 %uint_1
+               OpBranch %84
+         %85 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %74 None
+         %89 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %90 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %89
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %90
+         %94 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %95 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %94
+               OpStore %97 %95
                OpBranch %102
         %102 = OpLabel
-        %104 = OpPhi %uint %uint_0 %99 %105 %101
-               OpLoopMerge %103 %101 None
-               OpBranch %100
-        %100 = OpLabel
-        %124 = OpUGreaterThanEqual %bool %104 %uint_4
-               OpSelectionMerge %125 None
-               OpBranchConditional %124 %126 %125
-        %126 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %107 = OpPhi %uint %uint_0 %102 %108 %104
+               OpLoopMerge %106 %104 None
                OpBranch %103
-        %125 = OpLabel
-        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
-        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
-        %131 = OpLoad %Inner_std140 %129 None
-        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
-               OpStore %127 %132 None
-               OpBranch %101
-        %101 = OpLabel
-        %105 = OpIAdd %uint %104 %uint_1
-               OpBranch %102
         %103 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
-        %107 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
-        %110 = OpFunctionCall %int %i
-        %111 = OpBitcast %uint %110
-        %112 = OpExtInst %uint %33 UMin %111 %uint_1
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %112
+        %127 = OpUGreaterThanEqual %bool %107 %uint_4
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpBranch %106
+        %128 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_Inner %99 %107
+        %132 = OpAccessChain %_ptr_Function_Inner_std140 %97 %107
+        %134 = OpLoad %Inner_std140 %132 None
+        %135 = OpFunctionCall %Inner %tint_convert_Inner %134
+               OpStore %130 %135 None
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpIAdd %uint %107 %uint_1
+               OpBranch %105
+        %106 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %99 None
+        %110 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %110
+        %113 = OpFunctionCall %int %i
+        %114 = OpBitcast %uint %113
+        %115 = OpExtInst %uint %36 UMin %114 %uint_1
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %115
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %134
+%tint_convert_Inner = OpFunction %Inner None %137
  %tint_input = OpFunctionParameter %Inner_std140
-        %135 = OpLabel
-        %136 = OpCompositeExtract %v2half %tint_input 0
-        %137 = OpCompositeExtract %v2half %tint_input 1
-        %138 = OpCompositeExtract %v2half %tint_input 2
-        %139 = OpCompositeConstruct %mat3v2half %136 %137 %138
-        %140 = OpCompositeConstruct %Inner %139
-               OpReturnValue %140
+        %138 = OpLabel
+        %139 = OpCompositeExtract %v2half %tint_input 0
+        %140 = OpCompositeExtract %v2half %tint_input 1
+        %141 = OpCompositeExtract %v2half %tint_input 2
+        %142 = OpCompositeConstruct %mat3v2half %139 %140 %141
+        %143 = OpCompositeConstruct %Inner %142
+               OpReturnValue %143
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %142
+%tint_convert_Outer = OpFunction %Outer None %145
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %143 = OpLabel
-        %145 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %146 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-        %144 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %145 %144
-               OpBranch %147
-        %147 = OpLabel
+        %146 = OpLabel
+        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %148 %147
                OpBranch %150
         %150 = OpLabel
-        %152 = OpPhi %uint %uint_0 %147 %153 %149
-               OpLoopMerge %151 %149 None
-               OpBranch %148
-        %148 = OpLabel
-        %156 = OpUGreaterThanEqual %bool %152 %uint_4
-               OpSelectionMerge %157 None
-               OpBranchConditional %156 %158 %157
-        %158 = OpLabel
+               OpBranch %153
+        %153 = OpLabel
+        %155 = OpPhi %uint %uint_0 %150 %156 %152
+               OpLoopMerge %154 %152 None
                OpBranch %151
-        %157 = OpLabel
-        %159 = OpAccessChain %_ptr_Function_Inner %146 %152
-        %160 = OpAccessChain %_ptr_Function_Inner_std140 %145 %152
-        %161 = OpLoad %Inner_std140 %160 None
-        %162 = OpFunctionCall %Inner %tint_convert_Inner %161
-               OpStore %159 %162 None
-               OpBranch %149
-        %149 = OpLabel
-        %153 = OpIAdd %uint %152 %uint_1
-               OpBranch %150
         %151 = OpLabel
-        %154 = OpLoad %_arr_Inner_uint_4 %146 None
-        %155 = OpCompositeConstruct %Outer %154
-               OpReturnValue %155
+        %159 = OpUGreaterThanEqual %bool %155 %uint_4
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+               OpBranch %154
+        %160 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
+        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
+        %164 = OpLoad %Inner_std140 %163 None
+        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
+               OpStore %162 %165 None
+               OpBranch %152
+        %152 = OpLabel
+        %156 = OpIAdd %uint %155 %uint_1
+               OpBranch %153
+        %154 = OpLabel
+        %157 = OpLoad %_arr_Inner_uint_4 %149 None
+        %158 = OpCompositeConstruct %Outer %157
+               OpReturnValue %158
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %164
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %165 = OpLabel
-        %166 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %168 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %169
-               OpStore %166 %tint_source
-               OpBranch %170
-        %170 = OpLabel
+        %168 = OpLabel
+        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
+               OpStore %169 %tint_source
                OpBranch %173
         %173 = OpLabel
-        %175 = OpPhi %uint %uint_0 %170 %176 %172
-               OpLoopMerge %174 %172 None
-               OpBranch %171
-        %171 = OpLabel
-        %178 = OpUGreaterThanEqual %bool %175 %uint_4
-               OpSelectionMerge %179 None
-               OpBranchConditional %178 %180 %179
-        %180 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+        %178 = OpPhi %uint %uint_0 %173 %179 %175
+               OpLoopMerge %177 %175 None
                OpBranch %174
-        %179 = OpLabel
-        %181 = OpAccessChain %_ptr_Function_Inner_std140 %166 %175
-        %182 = OpLoad %Inner_std140 %181 None
-        %183 = OpAccessChain %_ptr_Function_Inner_std140 %168 %175
-               OpStore %183 %182 None
-               OpBranch %172
-        %172 = OpLabel
-        %176 = OpIAdd %uint %175 %uint_1
-               OpBranch %173
         %174 = OpLabel
-        %177 = OpLoad %_arr_Inner_std140_uint_4_0 %168 None
-               OpReturnValue %177
+        %181 = OpUGreaterThanEqual %bool %178 %uint_4
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+               OpBranch %177
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
+        %185 = OpLoad %Inner_std140 %184 None
+        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
+               OpStore %186 %185 None
+               OpBranch %175
+        %175 = OpLabel
+        %179 = OpIAdd %uint %178 %uint_1
+               OpBranch %176
+        %177 = OpLabel
+        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
+               OpReturnValue %180
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %185
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %186 = OpLabel
-        %187 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %188 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %187
-        %189 = OpCompositeConstruct %Outer_std140 %188
-               OpReturnValue %189
+        %189 = OpLabel
+        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
+        %192 = OpCompositeConstruct %Outer_std140 %191
+               OpReturnValue %192
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %191
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpLabel
-        %193 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %195 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %196
-               OpStore %193 %tint_source_1
-               OpBranch %197
-        %197 = OpLabel
+        %195 = OpLabel
+        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
+               OpStore %196 %tint_source_1
                OpBranch %200
         %200 = OpLabel
-        %202 = OpPhi %uint %uint_0 %197 %203 %199
-               OpLoopMerge %201 %199 None
-               OpBranch %198
-        %198 = OpLabel
-        %205 = OpUGreaterThanEqual %bool %202 %uint_4
-               OpSelectionMerge %206 None
-               OpBranchConditional %205 %207 %206
-        %207 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+        %205 = OpPhi %uint %uint_0 %200 %206 %202
+               OpLoopMerge %204 %202 None
                OpBranch %201
-        %206 = OpLabel
-        %208 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %193 %202
-        %210 = OpLoad %Outer_std140_tint_explicit_layout %208 None
-        %211 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %210
-        %212 = OpAccessChain %_ptr_Function_Outer_std140 %195 %202
-               OpStore %212 %211 None
-               OpBranch %199
-        %199 = OpLabel
-        %203 = OpIAdd %uint %202 %uint_1
-               OpBranch %200
         %201 = OpLabel
-        %204 = OpLoad %_arr_Outer_std140_uint_4 %195 None
-               OpReturnValue %204
+        %208 = OpUGreaterThanEqual %bool %205 %uint_4
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpBranch %204
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
+        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
+        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
+        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
+               OpStore %215 %214 None
+               OpBranch %202
+        %202 = OpLabel
+        %206 = OpIAdd %uint %205 %uint_1
+               OpBranch %203
+        %204 = OpLabel
+        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
+               OpReturnValue %207
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index c8e2253..2f4b525 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -35,76 +35,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(mat3x2(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))));
+  Inner v_2[4] = Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  mat3x2 v_6 = mat3x2(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2);
-  vec2 v_7 = v_6[min(uint(i()), 2u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))));
+  uint v_6 = min(uint(i()), 3u);
+  mat3x2 v_7 = mat3x2(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2);
+  vec2 v_8 = v_7[min(uint(i()), 2u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  mat3x2 l_a_i_a_i_m = v_6;
-  vec2 l_a_i_a_i_m_i = v_7;
-  float l_a_i_a_i_m_i_i = v_7[min(uint(i()), 1u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  mat3x2 l_a_i_a_i_m = v_7;
+  vec2 l_a_i_a_i_m_i = v_8;
+  float l_a_i_a_i_m_i_i = v_8[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 495be83..6cfce4b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 213
+; Bound: 216
 ; Schema: 0
                OpCapability Shader
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -71,7 +71,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -93,245 +93,248 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %77 = OpConstantNull %_arr_Outer_uint_4
+         %80 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %98 = OpConstantNull %_arr_Inner_uint_4
+        %101 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %134 = OpTypeFunction %Inner %Inner_std140
-        %142 = OpTypeFunction %Outer %Outer_std140
-        %164 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %137 = OpTypeFunction %Inner %Inner_std140
+        %145 = OpTypeFunction %Outer %Outer_std140
+        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %169 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %185 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %191 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %196 = OpConstantNull %_arr_Outer_std140_uint_4
+        %199 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %55 = OpVariable %_ptr_Function_mat3v2float Function
-         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
-         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_0
-         %46 = OpLoad %v2float %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %58 = OpVariable %_ptr_Function_mat3v2float Function
+         %72 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %80
+         %97 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %99 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_0
          %49 = OpLoad %v2float %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_1
          %52 = OpLoad %v2float %50 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat3v2float %46 %49 %52
-               OpStore %55 %l_a_i_a_i_m
-         %57 = OpFunctionCall %int %i
-         %58 = OpBitcast %uint %57
-         %59 = OpExtInst %uint %33 UMin %58 %uint_2
-         %60 = OpAccessChain %_ptr_Function_v2float %55 %59
-%l_a_i_a_i_m_i = OpLoad %v2float %60 None
-         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
-               OpStore %69 %64
-               OpBranch %78
-         %78 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_2
+         %55 = OpLoad %v2float %53 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat3v2float %49 %52 %55
+               OpStore %58 %l_a_i_a_i_m
+         %60 = OpFunctionCall %int %i
+         %61 = OpBitcast %uint %60
+         %62 = OpExtInst %uint %36 UMin %61 %uint_2
+         %63 = OpAccessChain %_ptr_Function_v2float %58 %62
+%l_a_i_a_i_m_i = OpLoad %v2float %63 None
+         %66 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %67 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %66
+               OpStore %72 %67
                OpBranch %81
          %81 = OpLabel
-         %83 = OpPhi %uint %uint_0 %78 %84 %80
-               OpLoopMerge %82 %80 None
-               OpBranch %79
-         %79 = OpLabel
-        %114 = OpUGreaterThanEqual %bool %83 %uint_4
-               OpSelectionMerge %116 None
-               OpBranchConditional %114 %117 %116
-        %117 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpPhi %uint %uint_0 %81 %87 %83
+               OpLoopMerge %85 %83 None
                OpBranch %82
-        %116 = OpLabel
-        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
-        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
-        %122 = OpLoad %Outer_std140 %120 None
-        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
-               OpStore %118 %123 None
-               OpBranch %80
-         %80 = OpLabel
-         %84 = OpIAdd %uint %83 %uint_1
-               OpBranch %81
          %82 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
-         %86 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
-         %91 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
-               OpStore %94 %92
-               OpBranch %99
-         %99 = OpLabel
+        %117 = OpUGreaterThanEqual %bool %86 %uint_4
+               OpSelectionMerge %119 None
+               OpBranchConditional %117 %120 %119
+        %120 = OpLabel
+               OpBranch %85
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_Outer %74 %86
+        %123 = OpAccessChain %_ptr_Function_Outer_std140 %72 %86
+        %125 = OpLoad %Outer_std140 %123 None
+        %126 = OpFunctionCall %Outer %tint_convert_Outer %125
+               OpStore %121 %126 None
+               OpBranch %83
+         %83 = OpLabel
+         %87 = OpIAdd %uint %86 %uint_1
+               OpBranch %84
+         %85 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %74 None
+         %89 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %90 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %89
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %90
+         %94 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %95 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %94
+               OpStore %97 %95
                OpBranch %102
         %102 = OpLabel
-        %104 = OpPhi %uint %uint_0 %99 %105 %101
-               OpLoopMerge %103 %101 None
-               OpBranch %100
-        %100 = OpLabel
-        %124 = OpUGreaterThanEqual %bool %104 %uint_4
-               OpSelectionMerge %125 None
-               OpBranchConditional %124 %126 %125
-        %126 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %107 = OpPhi %uint %uint_0 %102 %108 %104
+               OpLoopMerge %106 %104 None
                OpBranch %103
-        %125 = OpLabel
-        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
-        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
-        %131 = OpLoad %Inner_std140 %129 None
-        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
-               OpStore %127 %132 None
-               OpBranch %101
-        %101 = OpLabel
-        %105 = OpIAdd %uint %104 %uint_1
-               OpBranch %102
         %103 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
-        %107 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
-        %110 = OpFunctionCall %int %i
-        %111 = OpBitcast %uint %110
-        %112 = OpExtInst %uint %33 UMin %111 %uint_1
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %112
+        %127 = OpUGreaterThanEqual %bool %107 %uint_4
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpBranch %106
+        %128 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_Inner %99 %107
+        %132 = OpAccessChain %_ptr_Function_Inner_std140 %97 %107
+        %134 = OpLoad %Inner_std140 %132 None
+        %135 = OpFunctionCall %Inner %tint_convert_Inner %134
+               OpStore %130 %135 None
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpIAdd %uint %107 %uint_1
+               OpBranch %105
+        %106 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %99 None
+        %110 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %110
+        %113 = OpFunctionCall %int %i
+        %114 = OpBitcast %uint %113
+        %115 = OpExtInst %uint %36 UMin %114 %uint_1
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %115
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %134
+%tint_convert_Inner = OpFunction %Inner None %137
  %tint_input = OpFunctionParameter %Inner_std140
-        %135 = OpLabel
-        %136 = OpCompositeExtract %v2float %tint_input 0
-        %137 = OpCompositeExtract %v2float %tint_input 1
-        %138 = OpCompositeExtract %v2float %tint_input 2
-        %139 = OpCompositeConstruct %mat3v2float %136 %137 %138
-        %140 = OpCompositeConstruct %Inner %139
-               OpReturnValue %140
+        %138 = OpLabel
+        %139 = OpCompositeExtract %v2float %tint_input 0
+        %140 = OpCompositeExtract %v2float %tint_input 1
+        %141 = OpCompositeExtract %v2float %tint_input 2
+        %142 = OpCompositeConstruct %mat3v2float %139 %140 %141
+        %143 = OpCompositeConstruct %Inner %142
+               OpReturnValue %143
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %142
+%tint_convert_Outer = OpFunction %Outer None %145
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %143 = OpLabel
-        %145 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %146 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-        %144 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %145 %144
-               OpBranch %147
-        %147 = OpLabel
+        %146 = OpLabel
+        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %148 %147
                OpBranch %150
         %150 = OpLabel
-        %152 = OpPhi %uint %uint_0 %147 %153 %149
-               OpLoopMerge %151 %149 None
-               OpBranch %148
-        %148 = OpLabel
-        %156 = OpUGreaterThanEqual %bool %152 %uint_4
-               OpSelectionMerge %157 None
-               OpBranchConditional %156 %158 %157
-        %158 = OpLabel
+               OpBranch %153
+        %153 = OpLabel
+        %155 = OpPhi %uint %uint_0 %150 %156 %152
+               OpLoopMerge %154 %152 None
                OpBranch %151
-        %157 = OpLabel
-        %159 = OpAccessChain %_ptr_Function_Inner %146 %152
-        %160 = OpAccessChain %_ptr_Function_Inner_std140 %145 %152
-        %161 = OpLoad %Inner_std140 %160 None
-        %162 = OpFunctionCall %Inner %tint_convert_Inner %161
-               OpStore %159 %162 None
-               OpBranch %149
-        %149 = OpLabel
-        %153 = OpIAdd %uint %152 %uint_1
-               OpBranch %150
         %151 = OpLabel
-        %154 = OpLoad %_arr_Inner_uint_4 %146 None
-        %155 = OpCompositeConstruct %Outer %154
-               OpReturnValue %155
+        %159 = OpUGreaterThanEqual %bool %155 %uint_4
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+               OpBranch %154
+        %160 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
+        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
+        %164 = OpLoad %Inner_std140 %163 None
+        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
+               OpStore %162 %165 None
+               OpBranch %152
+        %152 = OpLabel
+        %156 = OpIAdd %uint %155 %uint_1
+               OpBranch %153
+        %154 = OpLabel
+        %157 = OpLoad %_arr_Inner_uint_4 %149 None
+        %158 = OpCompositeConstruct %Outer %157
+               OpReturnValue %158
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %164
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %165 = OpLabel
-        %166 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %168 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %169
-               OpStore %166 %tint_source
-               OpBranch %170
-        %170 = OpLabel
+        %168 = OpLabel
+        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
+               OpStore %169 %tint_source
                OpBranch %173
         %173 = OpLabel
-        %175 = OpPhi %uint %uint_0 %170 %176 %172
-               OpLoopMerge %174 %172 None
-               OpBranch %171
-        %171 = OpLabel
-        %178 = OpUGreaterThanEqual %bool %175 %uint_4
-               OpSelectionMerge %179 None
-               OpBranchConditional %178 %180 %179
-        %180 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+        %178 = OpPhi %uint %uint_0 %173 %179 %175
+               OpLoopMerge %177 %175 None
                OpBranch %174
-        %179 = OpLabel
-        %181 = OpAccessChain %_ptr_Function_Inner_std140 %166 %175
-        %182 = OpLoad %Inner_std140 %181 None
-        %183 = OpAccessChain %_ptr_Function_Inner_std140 %168 %175
-               OpStore %183 %182 None
-               OpBranch %172
-        %172 = OpLabel
-        %176 = OpIAdd %uint %175 %uint_1
-               OpBranch %173
         %174 = OpLabel
-        %177 = OpLoad %_arr_Inner_std140_uint_4_0 %168 None
-               OpReturnValue %177
+        %181 = OpUGreaterThanEqual %bool %178 %uint_4
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+               OpBranch %177
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
+        %185 = OpLoad %Inner_std140 %184 None
+        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
+               OpStore %186 %185 None
+               OpBranch %175
+        %175 = OpLabel
+        %179 = OpIAdd %uint %178 %uint_1
+               OpBranch %176
+        %177 = OpLabel
+        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
+               OpReturnValue %180
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %185
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %186 = OpLabel
-        %187 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %188 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %187
-        %189 = OpCompositeConstruct %Outer_std140 %188
-               OpReturnValue %189
+        %189 = OpLabel
+        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
+        %192 = OpCompositeConstruct %Outer_std140 %191
+               OpReturnValue %192
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %191
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpLabel
-        %193 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %195 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %196
-               OpStore %193 %tint_source_1
-               OpBranch %197
-        %197 = OpLabel
+        %195 = OpLabel
+        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
+               OpStore %196 %tint_source_1
                OpBranch %200
         %200 = OpLabel
-        %202 = OpPhi %uint %uint_0 %197 %203 %199
-               OpLoopMerge %201 %199 None
-               OpBranch %198
-        %198 = OpLabel
-        %205 = OpUGreaterThanEqual %bool %202 %uint_4
-               OpSelectionMerge %206 None
-               OpBranchConditional %205 %207 %206
-        %207 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+        %205 = OpPhi %uint %uint_0 %200 %206 %202
+               OpLoopMerge %204 %202 None
                OpBranch %201
-        %206 = OpLabel
-        %208 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %193 %202
-        %210 = OpLoad %Outer_std140_tint_explicit_layout %208 None
-        %211 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %210
-        %212 = OpAccessChain %_ptr_Function_Outer_std140 %195 %202
-               OpStore %212 %211 None
-               OpBranch %199
-        %199 = OpLabel
-        %203 = OpIAdd %uint %202 %uint_1
-               OpBranch %200
         %201 = OpLabel
-        %204 = OpLoad %_arr_Outer_std140_uint_4 %195 None
-               OpReturnValue %204
+        %208 = OpUGreaterThanEqual %bool %205 %uint_4
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpBranch %204
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
+        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
+        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
+        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
+               OpStore %215 %214 None
+               OpBranch %202
+        %202 = OpLabel
+        %206 = OpIAdd %uint %205 %uint_1
+               OpBranch %203
+        %204 = OpLabel
+        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
+               OpReturnValue %207
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index c0f2547..9b85615 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -36,76 +36,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat3(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat3 v_6 = f16mat3(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2);
-  f16vec3 v_7 = v_6[min(uint(i()), 2u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat3 v_7 = f16mat3(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2);
+  f16vec3 v_8 = v_7[min(uint(i()), 2u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat3 l_a_i_a_i_m = v_6;
-  f16vec3 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 2u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat3 l_a_i_a_i_m = v_7;
+  f16vec3 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 62b33b3..c504352 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 213
+; Bound: 216
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -74,7 +74,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -96,245 +96,248 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %77 = OpConstantNull %_arr_Outer_uint_4
+         %80 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %98 = OpConstantNull %_arr_Inner_uint_4
+        %101 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %134 = OpTypeFunction %Inner %Inner_std140
-        %142 = OpTypeFunction %Outer %Outer_std140
-        %164 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %137 = OpTypeFunction %Inner %Inner_std140
+        %145 = OpTypeFunction %Outer %Outer_std140
+        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %169 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %185 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %191 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %196 = OpConstantNull %_arr_Outer_std140_uint_4
+        %199 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %55 = OpVariable %_ptr_Function_mat3v3half Function
-         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
-         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_0
-         %46 = OpLoad %v3half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %58 = OpVariable %_ptr_Function_mat3v3half Function
+         %72 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %80
+         %97 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %99 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_0
          %49 = OpLoad %v3half %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_1
          %52 = OpLoad %v3half %50 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat3v3half %46 %49 %52
-               OpStore %55 %l_a_i_a_i_m
-         %57 = OpFunctionCall %int %i
-         %58 = OpBitcast %uint %57
-         %59 = OpExtInst %uint %33 UMin %58 %uint_2
-         %60 = OpAccessChain %_ptr_Function_v3half %55 %59
-%l_a_i_a_i_m_i = OpLoad %v3half %60 None
-         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
-               OpStore %69 %64
-               OpBranch %78
-         %78 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_2
+         %55 = OpLoad %v3half %53 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat3v3half %49 %52 %55
+               OpStore %58 %l_a_i_a_i_m
+         %60 = OpFunctionCall %int %i
+         %61 = OpBitcast %uint %60
+         %62 = OpExtInst %uint %36 UMin %61 %uint_2
+         %63 = OpAccessChain %_ptr_Function_v3half %58 %62
+%l_a_i_a_i_m_i = OpLoad %v3half %63 None
+         %66 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %67 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %66
+               OpStore %72 %67
                OpBranch %81
          %81 = OpLabel
-         %83 = OpPhi %uint %uint_0 %78 %84 %80
-               OpLoopMerge %82 %80 None
-               OpBranch %79
-         %79 = OpLabel
-        %114 = OpUGreaterThanEqual %bool %83 %uint_4
-               OpSelectionMerge %116 None
-               OpBranchConditional %114 %117 %116
-        %117 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpPhi %uint %uint_0 %81 %87 %83
+               OpLoopMerge %85 %83 None
                OpBranch %82
-        %116 = OpLabel
-        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
-        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
-        %122 = OpLoad %Outer_std140 %120 None
-        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
-               OpStore %118 %123 None
-               OpBranch %80
-         %80 = OpLabel
-         %84 = OpIAdd %uint %83 %uint_1
-               OpBranch %81
          %82 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
-         %86 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
-         %91 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
-               OpStore %94 %92
-               OpBranch %99
-         %99 = OpLabel
+        %117 = OpUGreaterThanEqual %bool %86 %uint_4
+               OpSelectionMerge %119 None
+               OpBranchConditional %117 %120 %119
+        %120 = OpLabel
+               OpBranch %85
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_Outer %74 %86
+        %123 = OpAccessChain %_ptr_Function_Outer_std140 %72 %86
+        %125 = OpLoad %Outer_std140 %123 None
+        %126 = OpFunctionCall %Outer %tint_convert_Outer %125
+               OpStore %121 %126 None
+               OpBranch %83
+         %83 = OpLabel
+         %87 = OpIAdd %uint %86 %uint_1
+               OpBranch %84
+         %85 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %74 None
+         %89 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %90 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %89
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %90
+         %94 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %95 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %94
+               OpStore %97 %95
                OpBranch %102
         %102 = OpLabel
-        %104 = OpPhi %uint %uint_0 %99 %105 %101
-               OpLoopMerge %103 %101 None
-               OpBranch %100
-        %100 = OpLabel
-        %124 = OpUGreaterThanEqual %bool %104 %uint_4
-               OpSelectionMerge %125 None
-               OpBranchConditional %124 %126 %125
-        %126 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %107 = OpPhi %uint %uint_0 %102 %108 %104
+               OpLoopMerge %106 %104 None
                OpBranch %103
-        %125 = OpLabel
-        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
-        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
-        %131 = OpLoad %Inner_std140 %129 None
-        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
-               OpStore %127 %132 None
-               OpBranch %101
-        %101 = OpLabel
-        %105 = OpIAdd %uint %104 %uint_1
-               OpBranch %102
         %103 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
-        %107 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
-        %110 = OpFunctionCall %int %i
-        %111 = OpBitcast %uint %110
-        %112 = OpExtInst %uint %33 UMin %111 %uint_2
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %112
+        %127 = OpUGreaterThanEqual %bool %107 %uint_4
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpBranch %106
+        %128 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_Inner %99 %107
+        %132 = OpAccessChain %_ptr_Function_Inner_std140 %97 %107
+        %134 = OpLoad %Inner_std140 %132 None
+        %135 = OpFunctionCall %Inner %tint_convert_Inner %134
+               OpStore %130 %135 None
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpIAdd %uint %107 %uint_1
+               OpBranch %105
+        %106 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %99 None
+        %110 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %110
+        %113 = OpFunctionCall %int %i
+        %114 = OpBitcast %uint %113
+        %115 = OpExtInst %uint %36 UMin %114 %uint_2
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %115
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %134
+%tint_convert_Inner = OpFunction %Inner None %137
  %tint_input = OpFunctionParameter %Inner_std140
-        %135 = OpLabel
-        %136 = OpCompositeExtract %v3half %tint_input 0
-        %137 = OpCompositeExtract %v3half %tint_input 1
-        %138 = OpCompositeExtract %v3half %tint_input 2
-        %139 = OpCompositeConstruct %mat3v3half %136 %137 %138
-        %140 = OpCompositeConstruct %Inner %139
-               OpReturnValue %140
+        %138 = OpLabel
+        %139 = OpCompositeExtract %v3half %tint_input 0
+        %140 = OpCompositeExtract %v3half %tint_input 1
+        %141 = OpCompositeExtract %v3half %tint_input 2
+        %142 = OpCompositeConstruct %mat3v3half %139 %140 %141
+        %143 = OpCompositeConstruct %Inner %142
+               OpReturnValue %143
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %142
+%tint_convert_Outer = OpFunction %Outer None %145
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %143 = OpLabel
-        %145 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %146 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-        %144 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %145 %144
-               OpBranch %147
-        %147 = OpLabel
+        %146 = OpLabel
+        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %148 %147
                OpBranch %150
         %150 = OpLabel
-        %152 = OpPhi %uint %uint_0 %147 %153 %149
-               OpLoopMerge %151 %149 None
-               OpBranch %148
-        %148 = OpLabel
-        %156 = OpUGreaterThanEqual %bool %152 %uint_4
-               OpSelectionMerge %157 None
-               OpBranchConditional %156 %158 %157
-        %158 = OpLabel
+               OpBranch %153
+        %153 = OpLabel
+        %155 = OpPhi %uint %uint_0 %150 %156 %152
+               OpLoopMerge %154 %152 None
                OpBranch %151
-        %157 = OpLabel
-        %159 = OpAccessChain %_ptr_Function_Inner %146 %152
-        %160 = OpAccessChain %_ptr_Function_Inner_std140 %145 %152
-        %161 = OpLoad %Inner_std140 %160 None
-        %162 = OpFunctionCall %Inner %tint_convert_Inner %161
-               OpStore %159 %162 None
-               OpBranch %149
-        %149 = OpLabel
-        %153 = OpIAdd %uint %152 %uint_1
-               OpBranch %150
         %151 = OpLabel
-        %154 = OpLoad %_arr_Inner_uint_4 %146 None
-        %155 = OpCompositeConstruct %Outer %154
-               OpReturnValue %155
+        %159 = OpUGreaterThanEqual %bool %155 %uint_4
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+               OpBranch %154
+        %160 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
+        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
+        %164 = OpLoad %Inner_std140 %163 None
+        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
+               OpStore %162 %165 None
+               OpBranch %152
+        %152 = OpLabel
+        %156 = OpIAdd %uint %155 %uint_1
+               OpBranch %153
+        %154 = OpLabel
+        %157 = OpLoad %_arr_Inner_uint_4 %149 None
+        %158 = OpCompositeConstruct %Outer %157
+               OpReturnValue %158
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %164
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %165 = OpLabel
-        %166 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %168 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %169
-               OpStore %166 %tint_source
-               OpBranch %170
-        %170 = OpLabel
+        %168 = OpLabel
+        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
+               OpStore %169 %tint_source
                OpBranch %173
         %173 = OpLabel
-        %175 = OpPhi %uint %uint_0 %170 %176 %172
-               OpLoopMerge %174 %172 None
-               OpBranch %171
-        %171 = OpLabel
-        %178 = OpUGreaterThanEqual %bool %175 %uint_4
-               OpSelectionMerge %179 None
-               OpBranchConditional %178 %180 %179
-        %180 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+        %178 = OpPhi %uint %uint_0 %173 %179 %175
+               OpLoopMerge %177 %175 None
                OpBranch %174
-        %179 = OpLabel
-        %181 = OpAccessChain %_ptr_Function_Inner_std140 %166 %175
-        %182 = OpLoad %Inner_std140 %181 None
-        %183 = OpAccessChain %_ptr_Function_Inner_std140 %168 %175
-               OpStore %183 %182 None
-               OpBranch %172
-        %172 = OpLabel
-        %176 = OpIAdd %uint %175 %uint_1
-               OpBranch %173
         %174 = OpLabel
-        %177 = OpLoad %_arr_Inner_std140_uint_4_0 %168 None
-               OpReturnValue %177
+        %181 = OpUGreaterThanEqual %bool %178 %uint_4
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+               OpBranch %177
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
+        %185 = OpLoad %Inner_std140 %184 None
+        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
+               OpStore %186 %185 None
+               OpBranch %175
+        %175 = OpLabel
+        %179 = OpIAdd %uint %178 %uint_1
+               OpBranch %176
+        %177 = OpLabel
+        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
+               OpReturnValue %180
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %185
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %186 = OpLabel
-        %187 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %188 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %187
-        %189 = OpCompositeConstruct %Outer_std140 %188
-               OpReturnValue %189
+        %189 = OpLabel
+        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
+        %192 = OpCompositeConstruct %Outer_std140 %191
+               OpReturnValue %192
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %191
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpLabel
-        %193 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %195 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %196
-               OpStore %193 %tint_source_1
-               OpBranch %197
-        %197 = OpLabel
+        %195 = OpLabel
+        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
+               OpStore %196 %tint_source_1
                OpBranch %200
         %200 = OpLabel
-        %202 = OpPhi %uint %uint_0 %197 %203 %199
-               OpLoopMerge %201 %199 None
-               OpBranch %198
-        %198 = OpLabel
-        %205 = OpUGreaterThanEqual %bool %202 %uint_4
-               OpSelectionMerge %206 None
-               OpBranchConditional %205 %207 %206
-        %207 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+        %205 = OpPhi %uint %uint_0 %200 %206 %202
+               OpLoopMerge %204 %202 None
                OpBranch %201
-        %206 = OpLabel
-        %208 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %193 %202
-        %210 = OpLoad %Outer_std140_tint_explicit_layout %208 None
-        %211 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %210
-        %212 = OpAccessChain %_ptr_Function_Outer_std140 %195 %202
-               OpStore %212 %211 None
-               OpBranch %199
-        %199 = OpLabel
-        %203 = OpIAdd %uint %202 %uint_1
-               OpBranch %200
         %201 = OpLabel
-        %204 = OpLoad %_arr_Outer_std140_uint_4 %195 None
-               OpReturnValue %204
+        %208 = OpUGreaterThanEqual %bool %205 %uint_4
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpBranch %204
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
+        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
+        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
+        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
+               OpStore %215 %214 None
+               OpBranch %202
+        %202 = OpLabel
+        %206 = OpIAdd %uint %205 %uint_1
+               OpBranch %203
+        %204 = OpLabel
+        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
+               OpReturnValue %207
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 5f74eac..badd378 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -32,76 +32,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(mat3(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))));
+  Inner v_2[4] = Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  mat3 v_6 = mat3(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2);
-  vec3 v_7 = v_6[min(uint(i()), 2u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))));
+  uint v_6 = min(uint(i()), 3u);
+  mat3 v_7 = mat3(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2);
+  vec3 v_8 = v_7[min(uint(i()), 2u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  mat3 l_a_i_a_i_m = v_6;
-  vec3 l_a_i_a_i_m_i = v_7;
-  float l_a_i_a_i_m_i_i = v_7[min(uint(i()), 2u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  mat3 l_a_i_a_i_m = v_7;
+  vec3 l_a_i_a_i_m_i = v_8;
+  float l_a_i_a_i_m_i_i = v_8[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index d0b6737..c1fd798 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 213
+; Bound: 216
 ; Schema: 0
                OpCapability Shader
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -71,7 +71,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -93,245 +93,248 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %77 = OpConstantNull %_arr_Outer_uint_4
+         %80 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %98 = OpConstantNull %_arr_Inner_uint_4
+        %101 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %134 = OpTypeFunction %Inner %Inner_std140
-        %142 = OpTypeFunction %Outer %Outer_std140
-        %164 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %137 = OpTypeFunction %Inner %Inner_std140
+        %145 = OpTypeFunction %Outer %Outer_std140
+        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %169 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %185 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %191 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %196 = OpConstantNull %_arr_Outer_std140_uint_4
+        %199 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %55 = OpVariable %_ptr_Function_mat3v3float Function
-         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
-         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_0
-         %46 = OpLoad %v3float %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %58 = OpVariable %_ptr_Function_mat3v3float Function
+         %72 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %80
+         %97 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %99 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_0
          %49 = OpLoad %v3float %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_1
          %52 = OpLoad %v3float %50 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat3v3float %46 %49 %52
-               OpStore %55 %l_a_i_a_i_m
-         %57 = OpFunctionCall %int %i
-         %58 = OpBitcast %uint %57
-         %59 = OpExtInst %uint %33 UMin %58 %uint_2
-         %60 = OpAccessChain %_ptr_Function_v3float %55 %59
-%l_a_i_a_i_m_i = OpLoad %v3float %60 None
-         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
-               OpStore %69 %64
-               OpBranch %78
-         %78 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_2
+         %55 = OpLoad %v3float %53 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat3v3float %49 %52 %55
+               OpStore %58 %l_a_i_a_i_m
+         %60 = OpFunctionCall %int %i
+         %61 = OpBitcast %uint %60
+         %62 = OpExtInst %uint %36 UMin %61 %uint_2
+         %63 = OpAccessChain %_ptr_Function_v3float %58 %62
+%l_a_i_a_i_m_i = OpLoad %v3float %63 None
+         %66 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %67 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %66
+               OpStore %72 %67
                OpBranch %81
          %81 = OpLabel
-         %83 = OpPhi %uint %uint_0 %78 %84 %80
-               OpLoopMerge %82 %80 None
-               OpBranch %79
-         %79 = OpLabel
-        %114 = OpUGreaterThanEqual %bool %83 %uint_4
-               OpSelectionMerge %116 None
-               OpBranchConditional %114 %117 %116
-        %117 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpPhi %uint %uint_0 %81 %87 %83
+               OpLoopMerge %85 %83 None
                OpBranch %82
-        %116 = OpLabel
-        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
-        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
-        %122 = OpLoad %Outer_std140 %120 None
-        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
-               OpStore %118 %123 None
-               OpBranch %80
-         %80 = OpLabel
-         %84 = OpIAdd %uint %83 %uint_1
-               OpBranch %81
          %82 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
-         %86 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
-         %91 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
-               OpStore %94 %92
-               OpBranch %99
-         %99 = OpLabel
+        %117 = OpUGreaterThanEqual %bool %86 %uint_4
+               OpSelectionMerge %119 None
+               OpBranchConditional %117 %120 %119
+        %120 = OpLabel
+               OpBranch %85
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_Outer %74 %86
+        %123 = OpAccessChain %_ptr_Function_Outer_std140 %72 %86
+        %125 = OpLoad %Outer_std140 %123 None
+        %126 = OpFunctionCall %Outer %tint_convert_Outer %125
+               OpStore %121 %126 None
+               OpBranch %83
+         %83 = OpLabel
+         %87 = OpIAdd %uint %86 %uint_1
+               OpBranch %84
+         %85 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %74 None
+         %89 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %90 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %89
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %90
+         %94 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %95 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %94
+               OpStore %97 %95
                OpBranch %102
         %102 = OpLabel
-        %104 = OpPhi %uint %uint_0 %99 %105 %101
-               OpLoopMerge %103 %101 None
-               OpBranch %100
-        %100 = OpLabel
-        %124 = OpUGreaterThanEqual %bool %104 %uint_4
-               OpSelectionMerge %125 None
-               OpBranchConditional %124 %126 %125
-        %126 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %107 = OpPhi %uint %uint_0 %102 %108 %104
+               OpLoopMerge %106 %104 None
                OpBranch %103
-        %125 = OpLabel
-        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
-        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
-        %131 = OpLoad %Inner_std140 %129 None
-        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
-               OpStore %127 %132 None
-               OpBranch %101
-        %101 = OpLabel
-        %105 = OpIAdd %uint %104 %uint_1
-               OpBranch %102
         %103 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
-        %107 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
-        %110 = OpFunctionCall %int %i
-        %111 = OpBitcast %uint %110
-        %112 = OpExtInst %uint %33 UMin %111 %uint_2
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %112
+        %127 = OpUGreaterThanEqual %bool %107 %uint_4
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpBranch %106
+        %128 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_Inner %99 %107
+        %132 = OpAccessChain %_ptr_Function_Inner_std140 %97 %107
+        %134 = OpLoad %Inner_std140 %132 None
+        %135 = OpFunctionCall %Inner %tint_convert_Inner %134
+               OpStore %130 %135 None
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpIAdd %uint %107 %uint_1
+               OpBranch %105
+        %106 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %99 None
+        %110 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %110
+        %113 = OpFunctionCall %int %i
+        %114 = OpBitcast %uint %113
+        %115 = OpExtInst %uint %36 UMin %114 %uint_2
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %115
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %134
+%tint_convert_Inner = OpFunction %Inner None %137
  %tint_input = OpFunctionParameter %Inner_std140
-        %135 = OpLabel
-        %136 = OpCompositeExtract %v3float %tint_input 0
-        %137 = OpCompositeExtract %v3float %tint_input 1
-        %138 = OpCompositeExtract %v3float %tint_input 2
-        %139 = OpCompositeConstruct %mat3v3float %136 %137 %138
-        %140 = OpCompositeConstruct %Inner %139
-               OpReturnValue %140
+        %138 = OpLabel
+        %139 = OpCompositeExtract %v3float %tint_input 0
+        %140 = OpCompositeExtract %v3float %tint_input 1
+        %141 = OpCompositeExtract %v3float %tint_input 2
+        %142 = OpCompositeConstruct %mat3v3float %139 %140 %141
+        %143 = OpCompositeConstruct %Inner %142
+               OpReturnValue %143
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %142
+%tint_convert_Outer = OpFunction %Outer None %145
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %143 = OpLabel
-        %145 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %146 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-        %144 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %145 %144
-               OpBranch %147
-        %147 = OpLabel
+        %146 = OpLabel
+        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %148 %147
                OpBranch %150
         %150 = OpLabel
-        %152 = OpPhi %uint %uint_0 %147 %153 %149
-               OpLoopMerge %151 %149 None
-               OpBranch %148
-        %148 = OpLabel
-        %156 = OpUGreaterThanEqual %bool %152 %uint_4
-               OpSelectionMerge %157 None
-               OpBranchConditional %156 %158 %157
-        %158 = OpLabel
+               OpBranch %153
+        %153 = OpLabel
+        %155 = OpPhi %uint %uint_0 %150 %156 %152
+               OpLoopMerge %154 %152 None
                OpBranch %151
-        %157 = OpLabel
-        %159 = OpAccessChain %_ptr_Function_Inner %146 %152
-        %160 = OpAccessChain %_ptr_Function_Inner_std140 %145 %152
-        %161 = OpLoad %Inner_std140 %160 None
-        %162 = OpFunctionCall %Inner %tint_convert_Inner %161
-               OpStore %159 %162 None
-               OpBranch %149
-        %149 = OpLabel
-        %153 = OpIAdd %uint %152 %uint_1
-               OpBranch %150
         %151 = OpLabel
-        %154 = OpLoad %_arr_Inner_uint_4 %146 None
-        %155 = OpCompositeConstruct %Outer %154
-               OpReturnValue %155
+        %159 = OpUGreaterThanEqual %bool %155 %uint_4
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+               OpBranch %154
+        %160 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
+        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
+        %164 = OpLoad %Inner_std140 %163 None
+        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
+               OpStore %162 %165 None
+               OpBranch %152
+        %152 = OpLabel
+        %156 = OpIAdd %uint %155 %uint_1
+               OpBranch %153
+        %154 = OpLabel
+        %157 = OpLoad %_arr_Inner_uint_4 %149 None
+        %158 = OpCompositeConstruct %Outer %157
+               OpReturnValue %158
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %164
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %165 = OpLabel
-        %166 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %168 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %169
-               OpStore %166 %tint_source
-               OpBranch %170
-        %170 = OpLabel
+        %168 = OpLabel
+        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
+               OpStore %169 %tint_source
                OpBranch %173
         %173 = OpLabel
-        %175 = OpPhi %uint %uint_0 %170 %176 %172
-               OpLoopMerge %174 %172 None
-               OpBranch %171
-        %171 = OpLabel
-        %178 = OpUGreaterThanEqual %bool %175 %uint_4
-               OpSelectionMerge %179 None
-               OpBranchConditional %178 %180 %179
-        %180 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+        %178 = OpPhi %uint %uint_0 %173 %179 %175
+               OpLoopMerge %177 %175 None
                OpBranch %174
-        %179 = OpLabel
-        %181 = OpAccessChain %_ptr_Function_Inner_std140 %166 %175
-        %182 = OpLoad %Inner_std140 %181 None
-        %183 = OpAccessChain %_ptr_Function_Inner_std140 %168 %175
-               OpStore %183 %182 None
-               OpBranch %172
-        %172 = OpLabel
-        %176 = OpIAdd %uint %175 %uint_1
-               OpBranch %173
         %174 = OpLabel
-        %177 = OpLoad %_arr_Inner_std140_uint_4_0 %168 None
-               OpReturnValue %177
+        %181 = OpUGreaterThanEqual %bool %178 %uint_4
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+               OpBranch %177
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
+        %185 = OpLoad %Inner_std140 %184 None
+        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
+               OpStore %186 %185 None
+               OpBranch %175
+        %175 = OpLabel
+        %179 = OpIAdd %uint %178 %uint_1
+               OpBranch %176
+        %177 = OpLabel
+        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
+               OpReturnValue %180
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %185
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %186 = OpLabel
-        %187 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %188 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %187
-        %189 = OpCompositeConstruct %Outer_std140 %188
-               OpReturnValue %189
+        %189 = OpLabel
+        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
+        %192 = OpCompositeConstruct %Outer_std140 %191
+               OpReturnValue %192
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %191
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpLabel
-        %193 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %195 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %196
-               OpStore %193 %tint_source_1
-               OpBranch %197
-        %197 = OpLabel
+        %195 = OpLabel
+        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
+               OpStore %196 %tint_source_1
                OpBranch %200
         %200 = OpLabel
-        %202 = OpPhi %uint %uint_0 %197 %203 %199
-               OpLoopMerge %201 %199 None
-               OpBranch %198
-        %198 = OpLabel
-        %205 = OpUGreaterThanEqual %bool %202 %uint_4
-               OpSelectionMerge %206 None
-               OpBranchConditional %205 %207 %206
-        %207 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+        %205 = OpPhi %uint %uint_0 %200 %206 %202
+               OpLoopMerge %204 %202 None
                OpBranch %201
-        %206 = OpLabel
-        %208 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %193 %202
-        %210 = OpLoad %Outer_std140_tint_explicit_layout %208 None
-        %211 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %210
-        %212 = OpAccessChain %_ptr_Function_Outer_std140 %195 %202
-               OpStore %212 %211 None
-               OpBranch %199
-        %199 = OpLabel
-        %203 = OpIAdd %uint %202 %uint_1
-               OpBranch %200
         %201 = OpLabel
-        %204 = OpLoad %_arr_Outer_std140_uint_4 %195 None
-               OpReturnValue %204
+        %208 = OpUGreaterThanEqual %bool %205 %uint_4
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpBranch %204
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
+        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
+        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
+        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
+               OpStore %215 %214 None
+               OpBranch %202
+        %202 = OpLabel
+        %206 = OpIAdd %uint %205 %uint_1
+               OpBranch %203
+        %204 = OpLabel
+        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
+               OpReturnValue %207
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 3f19ba0..f2f01c4 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -36,76 +36,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat3x4(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat3x4 v_6 = f16mat3x4(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2);
-  f16vec4 v_7 = v_6[min(uint(i()), 2u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat3x4 v_7 = f16mat3x4(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2);
+  f16vec4 v_8 = v_7[min(uint(i()), 2u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat3x4 l_a_i_a_i_m = v_6;
-  f16vec4 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 3u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat3x4 l_a_i_a_i_m = v_7;
+  f16vec4 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 7692d21..d15757a 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 213
+; Bound: 216
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -74,7 +74,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -96,245 +96,248 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %77 = OpConstantNull %_arr_Outer_uint_4
+         %80 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-         %98 = OpConstantNull %_arr_Inner_uint_4
+        %101 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %134 = OpTypeFunction %Inner %Inner_std140
-        %142 = OpTypeFunction %Outer %Outer_std140
-        %164 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %137 = OpTypeFunction %Inner %Inner_std140
+        %145 = OpTypeFunction %Outer %Outer_std140
+        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %169 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %185 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %191 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %196 = OpConstantNull %_arr_Outer_std140_uint_4
+        %199 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %55 = OpVariable %_ptr_Function_mat3v4half Function
-         %69 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %77
-         %94 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %96 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_0
-         %46 = OpLoad %v4half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %58 = OpVariable %_ptr_Function_mat3v4half Function
+         %72 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %80
+         %97 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+         %99 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_0
          %49 = OpLoad %v4half %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_1
          %52 = OpLoad %v4half %50 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat3v4half %46 %49 %52
-               OpStore %55 %l_a_i_a_i_m
-         %57 = OpFunctionCall %int %i
-         %58 = OpBitcast %uint %57
-         %59 = OpExtInst %uint %33 UMin %58 %uint_2
-         %60 = OpAccessChain %_ptr_Function_v4half %55 %59
-%l_a_i_a_i_m_i = OpLoad %v4half %60 None
-         %63 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %64 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %63
-               OpStore %69 %64
-               OpBranch %78
-         %78 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_2
+         %55 = OpLoad %v4half %53 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat3v4half %49 %52 %55
+               OpStore %58 %l_a_i_a_i_m
+         %60 = OpFunctionCall %int %i
+         %61 = OpBitcast %uint %60
+         %62 = OpExtInst %uint %36 UMin %61 %uint_2
+         %63 = OpAccessChain %_ptr_Function_v4half %58 %62
+%l_a_i_a_i_m_i = OpLoad %v4half %63 None
+         %66 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %67 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %66
+               OpStore %72 %67
                OpBranch %81
          %81 = OpLabel
-         %83 = OpPhi %uint %uint_0 %78 %84 %80
-               OpLoopMerge %82 %80 None
-               OpBranch %79
-         %79 = OpLabel
-        %114 = OpUGreaterThanEqual %bool %83 %uint_4
-               OpSelectionMerge %116 None
-               OpBranchConditional %114 %117 %116
-        %117 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpPhi %uint %uint_0 %81 %87 %83
+               OpLoopMerge %85 %83 None
                OpBranch %82
-        %116 = OpLabel
-        %118 = OpAccessChain %_ptr_Function_Outer %71 %83
-        %120 = OpAccessChain %_ptr_Function_Outer_std140 %69 %83
-        %122 = OpLoad %Outer_std140 %120 None
-        %123 = OpFunctionCall %Outer %tint_convert_Outer %122
-               OpStore %118 %123 None
-               OpBranch %80
-         %80 = OpLabel
-         %84 = OpIAdd %uint %83 %uint_1
-               OpBranch %81
          %82 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %71 None
-         %86 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %87 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %86
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %87
-         %91 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %92 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %91
-               OpStore %94 %92
-               OpBranch %99
-         %99 = OpLabel
+        %117 = OpUGreaterThanEqual %bool %86 %uint_4
+               OpSelectionMerge %119 None
+               OpBranchConditional %117 %120 %119
+        %120 = OpLabel
+               OpBranch %85
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_Outer %74 %86
+        %123 = OpAccessChain %_ptr_Function_Outer_std140 %72 %86
+        %125 = OpLoad %Outer_std140 %123 None
+        %126 = OpFunctionCall %Outer %tint_convert_Outer %125
+               OpStore %121 %126 None
+               OpBranch %83
+         %83 = OpLabel
+         %87 = OpIAdd %uint %86 %uint_1
+               OpBranch %84
+         %85 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %74 None
+         %89 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %90 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %89
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %90
+         %94 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %95 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %94
+               OpStore %97 %95
                OpBranch %102
         %102 = OpLabel
-        %104 = OpPhi %uint %uint_0 %99 %105 %101
-               OpLoopMerge %103 %101 None
-               OpBranch %100
-        %100 = OpLabel
-        %124 = OpUGreaterThanEqual %bool %104 %uint_4
-               OpSelectionMerge %125 None
-               OpBranchConditional %124 %126 %125
-        %126 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %107 = OpPhi %uint %uint_0 %102 %108 %104
+               OpLoopMerge %106 %104 None
                OpBranch %103
-        %125 = OpLabel
-        %127 = OpAccessChain %_ptr_Function_Inner %96 %104
-        %129 = OpAccessChain %_ptr_Function_Inner_std140 %94 %104
-        %131 = OpLoad %Inner_std140 %129 None
-        %132 = OpFunctionCall %Inner %tint_convert_Inner %131
-               OpStore %127 %132 None
-               OpBranch %101
-        %101 = OpLabel
-        %105 = OpIAdd %uint %104 %uint_1
-               OpBranch %102
         %103 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %96 None
-        %107 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %107
-        %110 = OpFunctionCall %int %i
-        %111 = OpBitcast %uint %110
-        %112 = OpExtInst %uint %33 UMin %111 %uint_3
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %112
+        %127 = OpUGreaterThanEqual %bool %107 %uint_4
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpBranch %106
+        %128 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_Inner %99 %107
+        %132 = OpAccessChain %_ptr_Function_Inner_std140 %97 %107
+        %134 = OpLoad %Inner_std140 %132 None
+        %135 = OpFunctionCall %Inner %tint_convert_Inner %134
+               OpStore %130 %135 None
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpIAdd %uint %107 %uint_1
+               OpBranch %105
+        %106 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %99 None
+        %110 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %110
+        %113 = OpFunctionCall %int %i
+        %114 = OpBitcast %uint %113
+        %115 = OpExtInst %uint %36 UMin %114 %uint_3
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %115
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %134
+%tint_convert_Inner = OpFunction %Inner None %137
  %tint_input = OpFunctionParameter %Inner_std140
-        %135 = OpLabel
-        %136 = OpCompositeExtract %v4half %tint_input 0
-        %137 = OpCompositeExtract %v4half %tint_input 1
-        %138 = OpCompositeExtract %v4half %tint_input 2
-        %139 = OpCompositeConstruct %mat3v4half %136 %137 %138
-        %140 = OpCompositeConstruct %Inner %139
-               OpReturnValue %140
+        %138 = OpLabel
+        %139 = OpCompositeExtract %v4half %tint_input 0
+        %140 = OpCompositeExtract %v4half %tint_input 1
+        %141 = OpCompositeExtract %v4half %tint_input 2
+        %142 = OpCompositeConstruct %mat3v4half %139 %140 %141
+        %143 = OpCompositeConstruct %Inner %142
+               OpReturnValue %143
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %142
+%tint_convert_Outer = OpFunction %Outer None %145
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %143 = OpLabel
-        %145 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %146 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %98
-        %144 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %145 %144
-               OpBranch %147
-        %147 = OpLabel
+        %146 = OpLabel
+        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %101
+        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %148 %147
                OpBranch %150
         %150 = OpLabel
-        %152 = OpPhi %uint %uint_0 %147 %153 %149
-               OpLoopMerge %151 %149 None
-               OpBranch %148
-        %148 = OpLabel
-        %156 = OpUGreaterThanEqual %bool %152 %uint_4
-               OpSelectionMerge %157 None
-               OpBranchConditional %156 %158 %157
-        %158 = OpLabel
+               OpBranch %153
+        %153 = OpLabel
+        %155 = OpPhi %uint %uint_0 %150 %156 %152
+               OpLoopMerge %154 %152 None
                OpBranch %151
-        %157 = OpLabel
-        %159 = OpAccessChain %_ptr_Function_Inner %146 %152
-        %160 = OpAccessChain %_ptr_Function_Inner_std140 %145 %152
-        %161 = OpLoad %Inner_std140 %160 None
-        %162 = OpFunctionCall %Inner %tint_convert_Inner %161
-               OpStore %159 %162 None
-               OpBranch %149
-        %149 = OpLabel
-        %153 = OpIAdd %uint %152 %uint_1
-               OpBranch %150
         %151 = OpLabel
-        %154 = OpLoad %_arr_Inner_uint_4 %146 None
-        %155 = OpCompositeConstruct %Outer %154
-               OpReturnValue %155
+        %159 = OpUGreaterThanEqual %bool %155 %uint_4
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+               OpBranch %154
+        %160 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
+        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
+        %164 = OpLoad %Inner_std140 %163 None
+        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
+               OpStore %162 %165 None
+               OpBranch %152
+        %152 = OpLabel
+        %156 = OpIAdd %uint %155 %uint_1
+               OpBranch %153
+        %154 = OpLabel
+        %157 = OpLoad %_arr_Inner_uint_4 %149 None
+        %158 = OpCompositeConstruct %Outer %157
+               OpReturnValue %158
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %164
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %165 = OpLabel
-        %166 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %168 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %169
-               OpStore %166 %tint_source
-               OpBranch %170
-        %170 = OpLabel
+        %168 = OpLabel
+        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
+               OpStore %169 %tint_source
                OpBranch %173
         %173 = OpLabel
-        %175 = OpPhi %uint %uint_0 %170 %176 %172
-               OpLoopMerge %174 %172 None
-               OpBranch %171
-        %171 = OpLabel
-        %178 = OpUGreaterThanEqual %bool %175 %uint_4
-               OpSelectionMerge %179 None
-               OpBranchConditional %178 %180 %179
-        %180 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+        %178 = OpPhi %uint %uint_0 %173 %179 %175
+               OpLoopMerge %177 %175 None
                OpBranch %174
-        %179 = OpLabel
-        %181 = OpAccessChain %_ptr_Function_Inner_std140 %166 %175
-        %182 = OpLoad %Inner_std140 %181 None
-        %183 = OpAccessChain %_ptr_Function_Inner_std140 %168 %175
-               OpStore %183 %182 None
-               OpBranch %172
-        %172 = OpLabel
-        %176 = OpIAdd %uint %175 %uint_1
-               OpBranch %173
         %174 = OpLabel
-        %177 = OpLoad %_arr_Inner_std140_uint_4_0 %168 None
-               OpReturnValue %177
+        %181 = OpUGreaterThanEqual %bool %178 %uint_4
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+               OpBranch %177
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
+        %185 = OpLoad %Inner_std140 %184 None
+        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
+               OpStore %186 %185 None
+               OpBranch %175
+        %175 = OpLabel
+        %179 = OpIAdd %uint %178 %uint_1
+               OpBranch %176
+        %177 = OpLabel
+        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
+               OpReturnValue %180
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %185
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %186 = OpLabel
-        %187 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %188 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %187
-        %189 = OpCompositeConstruct %Outer_std140 %188
-               OpReturnValue %189
+        %189 = OpLabel
+        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
+        %192 = OpCompositeConstruct %Outer_std140 %191
+               OpReturnValue %192
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %191
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %192 = OpLabel
-        %193 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %195 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %196
-               OpStore %193 %tint_source_1
-               OpBranch %197
-        %197 = OpLabel
+        %195 = OpLabel
+        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
+               OpStore %196 %tint_source_1
                OpBranch %200
         %200 = OpLabel
-        %202 = OpPhi %uint %uint_0 %197 %203 %199
-               OpLoopMerge %201 %199 None
-               OpBranch %198
-        %198 = OpLabel
-        %205 = OpUGreaterThanEqual %bool %202 %uint_4
-               OpSelectionMerge %206 None
-               OpBranchConditional %205 %207 %206
-        %207 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+        %205 = OpPhi %uint %uint_0 %200 %206 %202
+               OpLoopMerge %204 %202 None
                OpBranch %201
-        %206 = OpLabel
-        %208 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %193 %202
-        %210 = OpLoad %Outer_std140_tint_explicit_layout %208 None
-        %211 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %210
-        %212 = OpAccessChain %_ptr_Function_Outer_std140 %195 %202
-               OpStore %212 %211 None
-               OpBranch %199
-        %199 = OpLabel
-        %203 = OpIAdd %uint %202 %uint_1
-               OpBranch %200
         %201 = OpLabel
-        %204 = OpLoad %_arr_Outer_std140_uint_4 %195 None
-               OpReturnValue %204
+        %208 = OpUGreaterThanEqual %bool %205 %uint_4
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpBranch %204
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
+        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
+        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
+        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
+               OpStore %215 %214 None
+               OpBranch %202
+        %202 = OpLabel
+        %206 = OpIAdd %uint %205 %uint_1
+               OpBranch %203
+        %204 = OpLabel
+        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
+               OpReturnValue %207
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 982ca97..a9deb66 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -19,19 +19,20 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_1 = min(uint(i()), 3u);
   uint v_2 = min(uint(i()), 3u);
-  uint v_3 = min(uint(i()), 2u);
+  uint v_3 = min(uint(i()), 3u);
+  uint v_4 = min(uint(i()), 2u);
   Outer l_a[4] = v.inner;
-  Outer l_a_i = v.inner[v_1];
-  Inner l_a_i_a[4] = v.inner[v_1].a;
-  Inner l_a_i_a_i = v.inner[v_1].a[v_2];
-  mat3x4 l_a_i_a_i_m = v.inner[v_1].a[v_2].m;
-  vec4 l_a_i_a_i_m_i = v.inner[v_1].a[v_2].m[v_3];
-  float l_a_i_a_i_m_i_i = v.inner[v_1].a[v_2].m[v_3][min(uint(i()), 3u)];
+  Outer l_a_i = v.inner[v_2];
+  Inner l_a_i_a[4] = v.inner[v_2].a;
+  Inner l_a_i_a_i = v.inner[v_2].a[v_3];
+  mat3x4 l_a_i_a_i_m = v.inner[v_2].a[v_3].m;
+  vec4 l_a_i_a_i_m_i = v.inner[v_2].a[v_3].m[v_4];
+  float l_a_i_a_i_m_i_i = v.inner[v_2].a[v_3].m[v_4][min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 3c8b056..bd6660a 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 130
+; Bound: 133
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -68,7 +68,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -82,131 +82,134 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4_0
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Uniform_float = OpTypePointer Uniform %float
-         %75 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
+         %78 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4_0 = OpTypePointer Function %_arr_Inner_uint_4_0
-         %81 = OpConstantNull %_arr_Inner_uint_4_0
+         %84 = OpConstantNull %_arr_Inner_uint_4_0
        %bool = OpTypeBool
 %_ptr_Function_Inner = OpTypePointer Function %Inner
      %uint_1 = OpConstant %uint 1
-        %100 = OpTypeFunction %Outer %Outer_tint_explicit_layout
-        %106 = OpTypeFunction %_arr_Outer_uint_4 %_arr_Outer_tint_explicit_layout_uint_4
+        %103 = OpTypeFunction %Outer %Outer_tint_explicit_layout
+        %109 = OpTypeFunction %_arr_Outer_uint_4 %_arr_Outer_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-        %112 = OpConstantNull %_arr_Outer_uint_4
+        %115 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function_Outer_tint_explicit_layout = OpTypePointer Function %Outer_tint_explicit_layout
 %_ptr_Function_Outer = OpTypePointer Function %Outer
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
+          %f = OpFunction %void None %29
+         %30 = OpLabel
         %p_a = OpAccessChain %_ptr_Uniform__arr_Outer_tint_explicit_layout_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-      %p_a_i = OpAccessChain %_ptr_Uniform_Outer_tint_explicit_layout %p_a %33
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+      %p_a_i = OpAccessChain %_ptr_Uniform_Outer_tint_explicit_layout %p_a %36
     %p_a_i_a = OpAccessChain %_ptr_Uniform__arr_Inner_uint_4 %p_a_i %uint_0
-         %40 = OpFunctionCall %int %i
-         %41 = OpBitcast %uint %40
-         %42 = OpExtInst %uint %34 UMin %41 %uint_3
-  %p_a_i_a_i = OpAccessChain %_ptr_Uniform_Inner %p_a_i_a %42
+         %43 = OpFunctionCall %int %i
+         %44 = OpBitcast %uint %43
+         %45 = OpExtInst %uint %37 UMin %44 %uint_3
+  %p_a_i_a_i = OpAccessChain %_ptr_Uniform_Inner %p_a_i_a %45
 %p_a_i_a_i_m = OpAccessChain %_ptr_Uniform_mat3v4float %p_a_i_a_i %uint_0
-         %47 = OpFunctionCall %int %i
-         %48 = OpBitcast %uint %47
-         %49 = OpExtInst %uint %34 UMin %48 %uint_2
-%p_a_i_a_i_m_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i_a_i_m %49
-         %53 = OpLoad %_arr_Outer_tint_explicit_layout_uint_4 %p_a None
-        %l_a = OpFunctionCall %_arr_Outer_uint_4 %tint_convert_explicit_layout_1 %53
-         %59 = OpLoad %Outer_tint_explicit_layout %p_a_i None
-      %l_a_i = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %59
-         %62 = OpLoad %_arr_Inner_uint_4 %p_a_i_a None
-    %l_a_i_a = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %62
+         %50 = OpFunctionCall %int %i
+         %51 = OpBitcast %uint %50
+         %52 = OpExtInst %uint %37 UMin %51 %uint_2
+%p_a_i_a_i_m_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i_a_i_m %52
+         %56 = OpLoad %_arr_Outer_tint_explicit_layout_uint_4 %p_a None
+        %l_a = OpFunctionCall %_arr_Outer_uint_4 %tint_convert_explicit_layout_1 %56
+         %62 = OpLoad %Outer_tint_explicit_layout %p_a_i None
+      %l_a_i = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %62
+         %65 = OpLoad %_arr_Inner_uint_4 %p_a_i_a None
+    %l_a_i_a = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %65
   %l_a_i_a_i = OpLoad %Inner %p_a_i_a_i None
 %l_a_i_a_i_m = OpLoad %mat3v4float %p_a_i_a_i_m None
 %l_a_i_a_i_m_i = OpLoad %v4float %p_a_i_a_i_m_i None
-         %68 = OpFunctionCall %int %i
-         %69 = OpBitcast %uint %68
-         %70 = OpExtInst %uint %34 UMin %69 %uint_3
-         %71 = OpAccessChain %_ptr_Uniform_float %p_a_i_a_i_m_i %70
-%l_a_i_a_i_m_i_i = OpLoad %float %71 None
+         %71 = OpFunctionCall %int %i
+         %72 = OpBitcast %uint %71
+         %73 = OpExtInst %uint %37 UMin %72 %uint_3
+         %74 = OpAccessChain %_ptr_Uniform_float %p_a_i_a_i_m_i %73
+%l_a_i_a_i_m_i_i = OpLoad %float %74 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_uint_4_0 None %75
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_uint_4_0 None %78
 %tint_source = OpFunctionParameter %_arr_Inner_uint_4
-         %76 = OpLabel
-         %77 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
-         %79 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %81
-               OpStore %77 %tint_source
-               OpBranch %82
-         %82 = OpLabel
+         %79 = OpLabel
+         %80 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
+         %82 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %84
+               OpStore %80 %tint_source
                OpBranch %85
          %85 = OpLabel
-         %87 = OpPhi %uint %uint_0 %82 %88 %84
-               OpLoopMerge %86 %84 None
-               OpBranch %83
-         %83 = OpLabel
-         %90 = OpUGreaterThanEqual %bool %87 %uint_4
-               OpSelectionMerge %92 None
-               OpBranchConditional %90 %93 %92
-         %93 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+         %90 = OpPhi %uint %uint_0 %85 %91 %87
+               OpLoopMerge %89 %87 None
                OpBranch %86
-         %92 = OpLabel
-         %94 = OpAccessChain %_ptr_Function_Inner %77 %87
-         %96 = OpLoad %Inner %94 None
-         %97 = OpAccessChain %_ptr_Function_Inner %79 %87
-               OpStore %97 %96 None
-               OpBranch %84
-         %84 = OpLabel
-         %88 = OpIAdd %uint %87 %uint_1
-               OpBranch %85
          %86 = OpLabel
-         %89 = OpLoad %_arr_Inner_uint_4_0 %79 None
-               OpReturnValue %89
+         %93 = OpUGreaterThanEqual %bool %90 %uint_4
+               OpSelectionMerge %95 None
+               OpBranchConditional %93 %96 %95
+         %96 = OpLabel
+               OpBranch %89
+         %95 = OpLabel
+         %97 = OpAccessChain %_ptr_Function_Inner %80 %90
+         %99 = OpLoad %Inner %97 None
+        %100 = OpAccessChain %_ptr_Function_Inner %82 %90
+               OpStore %100 %99 None
+               OpBranch %87
+         %87 = OpLabel
+         %91 = OpIAdd %uint %90 %uint_1
+               OpBranch %88
+         %89 = OpLabel
+         %92 = OpLoad %_arr_Inner_uint_4_0 %82 None
+               OpReturnValue %92
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer None %100
+%tint_convert_explicit_layout_0 = OpFunction %Outer None %103
 %tint_source_0 = OpFunctionParameter %Outer_tint_explicit_layout
-        %101 = OpLabel
-        %102 = OpCompositeExtract %_arr_Inner_uint_4 %tint_source_0 0
-        %103 = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %102
-        %104 = OpCompositeConstruct %Outer %103
-               OpReturnValue %104
+        %104 = OpLabel
+        %105 = OpCompositeExtract %_arr_Inner_uint_4 %tint_source_0 0
+        %106 = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %105
+        %107 = OpCompositeConstruct %Outer %106
+               OpReturnValue %107
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_uint_4 None %106
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_uint_4 None %109
 %tint_source_1 = OpFunctionParameter %_arr_Outer_tint_explicit_layout_uint_4
-        %107 = OpLabel
-        %108 = OpVariable %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 Function
-        %110 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %112
-               OpStore %108 %tint_source_1
-               OpBranch %113
-        %113 = OpLabel
+        %110 = OpLabel
+        %111 = OpVariable %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 Function
+        %113 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %115
+               OpStore %111 %tint_source_1
                OpBranch %116
         %116 = OpLabel
-        %118 = OpPhi %uint %uint_0 %113 %119 %115
-               OpLoopMerge %117 %115 None
-               OpBranch %114
-        %114 = OpLabel
-        %121 = OpUGreaterThanEqual %bool %118 %uint_4
-               OpSelectionMerge %122 None
-               OpBranchConditional %121 %123 %122
-        %123 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+        %121 = OpPhi %uint %uint_0 %116 %122 %118
+               OpLoopMerge %120 %118 None
                OpBranch %117
-        %122 = OpLabel
-        %124 = OpAccessChain %_ptr_Function_Outer_tint_explicit_layout %108 %118
-        %126 = OpLoad %Outer_tint_explicit_layout %124 None
-        %127 = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %126
-        %128 = OpAccessChain %_ptr_Function_Outer %110 %118
-               OpStore %128 %127 None
-               OpBranch %115
-        %115 = OpLabel
-        %119 = OpIAdd %uint %118 %uint_1
-               OpBranch %116
         %117 = OpLabel
-        %120 = OpLoad %_arr_Outer_uint_4 %110 None
-               OpReturnValue %120
+        %124 = OpUGreaterThanEqual %bool %121 %uint_4
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %120
+        %125 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_Outer_tint_explicit_layout %111 %121
+        %129 = OpLoad %Outer_tint_explicit_layout %127 None
+        %130 = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %129
+        %131 = OpAccessChain %_ptr_Function_Outer %113 %121
+               OpStore %131 %130 None
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpIAdd %uint %121 %uint_1
+               OpBranch %119
+        %120 = OpLabel
+        %123 = OpLoad %_arr_Outer_uint_4 %113 None
+               OpReturnValue %123
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index cb35fb4..cacc54a 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -39,76 +39,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat4x2(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2, tint_input.m_col3));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat4x2 v_6 = f16mat4x2(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2, v.inner[v_4].a[v_5].m_col3);
-  f16vec2 v_7 = v_6[min(uint(i()), 3u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat4x2 v_7 = f16mat4x2(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2, v.inner[v_5].a[v_6].m_col3);
+  f16vec2 v_8 = v_7[min(uint(i()), 3u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))), Outer(Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))), Inner(f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat4x2 l_a_i_a_i_m = v_6;
-  f16vec2 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 1u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat4x2 l_a_i_a_i_m = v_7;
+  f16vec2 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index ccc4c2d..3e52edf 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 216
+; Bound: 219
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -76,7 +76,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -98,248 +98,251 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %79 = OpConstantNull %_arr_Outer_uint_4
+         %82 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-        %100 = OpConstantNull %_arr_Inner_uint_4
+        %103 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %136 = OpTypeFunction %Inner %Inner_std140
-        %145 = OpTypeFunction %Outer %Outer_std140
-        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %139 = OpTypeFunction %Inner %Inner_std140
+        %148 = OpTypeFunction %Outer %Outer_std140
+        %170 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %175 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %191 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %197 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %199 = OpConstantNull %_arr_Outer_std140_uint_4
+        %202 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %57 = OpVariable %_ptr_Function_mat4v2half Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %73 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %79
-         %96 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %98 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_0
-         %46 = OpLoad %v2half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %60 = OpVariable %_ptr_Function_mat4v2half Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %76 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %82
+         %99 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %101 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_0
          %49 = OpLoad %v2half %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_1
          %52 = OpLoad %v2half %50 None
-         %53 = OpAccessChain %_ptr_Uniform_v2half %42 %uint_3
-         %54 = OpLoad %v2half %53 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat4v2half %46 %49 %52 %54
-               OpStore %57 %l_a_i_a_i_m
-         %59 = OpFunctionCall %int %i
-         %60 = OpBitcast %uint %59
-         %61 = OpExtInst %uint %33 UMin %60 %uint_3
-         %62 = OpAccessChain %_ptr_Function_v2half %57 %61
-%l_a_i_a_i_m_i = OpLoad %v2half %62 None
-         %65 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %66 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %65
-               OpStore %71 %66
-               OpBranch %80
-         %80 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_2
+         %55 = OpLoad %v2half %53 None
+         %56 = OpAccessChain %_ptr_Uniform_v2half %45 %uint_3
+         %57 = OpLoad %v2half %56 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat4v2half %49 %52 %55 %57
+               OpStore %60 %l_a_i_a_i_m
+         %62 = OpFunctionCall %int %i
+         %63 = OpBitcast %uint %62
+         %64 = OpExtInst %uint %36 UMin %63 %uint_3
+         %65 = OpAccessChain %_ptr_Function_v2half %60 %64
+%l_a_i_a_i_m_i = OpLoad %v2half %65 None
+         %68 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %69 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %68
+               OpStore %74 %69
                OpBranch %83
          %83 = OpLabel
-         %85 = OpPhi %uint %uint_0 %80 %86 %82
-               OpLoopMerge %84 %82 None
-               OpBranch %81
-         %81 = OpLabel
-        %116 = OpUGreaterThanEqual %bool %85 %uint_4
-               OpSelectionMerge %118 None
-               OpBranchConditional %116 %119 %118
-        %119 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+         %88 = OpPhi %uint %uint_0 %83 %89 %85
+               OpLoopMerge %87 %85 None
                OpBranch %84
-        %118 = OpLabel
-        %120 = OpAccessChain %_ptr_Function_Outer %73 %85
-        %122 = OpAccessChain %_ptr_Function_Outer_std140 %71 %85
-        %124 = OpLoad %Outer_std140 %122 None
-        %125 = OpFunctionCall %Outer %tint_convert_Outer %124
-               OpStore %120 %125 None
-               OpBranch %82
-         %82 = OpLabel
-         %86 = OpIAdd %uint %85 %uint_1
-               OpBranch %83
          %84 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %73 None
-         %88 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %89 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %88
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %89
-         %93 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %94 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %93
-               OpStore %96 %94
-               OpBranch %101
-        %101 = OpLabel
+        %119 = OpUGreaterThanEqual %bool %88 %uint_4
+               OpSelectionMerge %121 None
+               OpBranchConditional %119 %122 %121
+        %122 = OpLabel
+               OpBranch %87
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_Outer %76 %88
+        %125 = OpAccessChain %_ptr_Function_Outer_std140 %74 %88
+        %127 = OpLoad %Outer_std140 %125 None
+        %128 = OpFunctionCall %Outer %tint_convert_Outer %127
+               OpStore %123 %128 None
+               OpBranch %85
+         %85 = OpLabel
+         %89 = OpIAdd %uint %88 %uint_1
+               OpBranch %86
+         %87 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %76 None
+         %91 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %92 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %91
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %92
+         %96 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %97 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %96
+               OpStore %99 %97
                OpBranch %104
         %104 = OpLabel
-        %106 = OpPhi %uint %uint_0 %101 %107 %103
-               OpLoopMerge %105 %103 None
-               OpBranch %102
-        %102 = OpLabel
-        %126 = OpUGreaterThanEqual %bool %106 %uint_4
-               OpSelectionMerge %127 None
-               OpBranchConditional %126 %128 %127
-        %128 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %109 = OpPhi %uint %uint_0 %104 %110 %106
+               OpLoopMerge %108 %106 None
                OpBranch %105
-        %127 = OpLabel
-        %129 = OpAccessChain %_ptr_Function_Inner %98 %106
-        %131 = OpAccessChain %_ptr_Function_Inner_std140 %96 %106
-        %133 = OpLoad %Inner_std140 %131 None
-        %134 = OpFunctionCall %Inner %tint_convert_Inner %133
-               OpStore %129 %134 None
-               OpBranch %103
-        %103 = OpLabel
-        %107 = OpIAdd %uint %106 %uint_1
-               OpBranch %104
         %105 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %98 None
-        %109 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %109
-        %112 = OpFunctionCall %int %i
-        %113 = OpBitcast %uint %112
-        %114 = OpExtInst %uint %33 UMin %113 %uint_1
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %114
+        %129 = OpUGreaterThanEqual %bool %109 %uint_4
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+               OpBranch %108
+        %130 = OpLabel
+        %132 = OpAccessChain %_ptr_Function_Inner %101 %109
+        %134 = OpAccessChain %_ptr_Function_Inner_std140 %99 %109
+        %136 = OpLoad %Inner_std140 %134 None
+        %137 = OpFunctionCall %Inner %tint_convert_Inner %136
+               OpStore %132 %137 None
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpIAdd %uint %109 %uint_1
+               OpBranch %107
+        %108 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %101 None
+        %112 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %112
+        %115 = OpFunctionCall %int %i
+        %116 = OpBitcast %uint %115
+        %117 = OpExtInst %uint %36 UMin %116 %uint_1
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %117
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %136
+%tint_convert_Inner = OpFunction %Inner None %139
  %tint_input = OpFunctionParameter %Inner_std140
-        %137 = OpLabel
-        %138 = OpCompositeExtract %v2half %tint_input 0
-        %139 = OpCompositeExtract %v2half %tint_input 1
-        %140 = OpCompositeExtract %v2half %tint_input 2
-        %141 = OpCompositeExtract %v2half %tint_input 3
-        %142 = OpCompositeConstruct %mat4v2half %138 %139 %140 %141
-        %143 = OpCompositeConstruct %Inner %142
-               OpReturnValue %143
+        %140 = OpLabel
+        %141 = OpCompositeExtract %v2half %tint_input 0
+        %142 = OpCompositeExtract %v2half %tint_input 1
+        %143 = OpCompositeExtract %v2half %tint_input 2
+        %144 = OpCompositeExtract %v2half %tint_input 3
+        %145 = OpCompositeConstruct %mat4v2half %141 %142 %143 %144
+        %146 = OpCompositeConstruct %Inner %145
+               OpReturnValue %146
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %145
+%tint_convert_Outer = OpFunction %Outer None %148
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %146 = OpLabel
-        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %148 %147
-               OpBranch %150
-        %150 = OpLabel
+        %149 = OpLabel
+        %151 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %152 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+        %150 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %151 %150
                OpBranch %153
         %153 = OpLabel
-        %155 = OpPhi %uint %uint_0 %150 %156 %152
-               OpLoopMerge %154 %152 None
-               OpBranch %151
-        %151 = OpLabel
-        %159 = OpUGreaterThanEqual %bool %155 %uint_4
-               OpSelectionMerge %160 None
-               OpBranchConditional %159 %161 %160
-        %161 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %158 = OpPhi %uint %uint_0 %153 %159 %155
+               OpLoopMerge %157 %155 None
                OpBranch %154
-        %160 = OpLabel
-        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
-        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
-        %164 = OpLoad %Inner_std140 %163 None
-        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
-               OpStore %162 %165 None
-               OpBranch %152
-        %152 = OpLabel
-        %156 = OpIAdd %uint %155 %uint_1
-               OpBranch %153
         %154 = OpLabel
-        %157 = OpLoad %_arr_Inner_uint_4 %149 None
-        %158 = OpCompositeConstruct %Outer %157
-               OpReturnValue %158
+        %162 = OpUGreaterThanEqual %bool %158 %uint_4
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+               OpBranch %157
+        %163 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_Inner %152 %158
+        %166 = OpAccessChain %_ptr_Function_Inner_std140 %151 %158
+        %167 = OpLoad %Inner_std140 %166 None
+        %168 = OpFunctionCall %Inner %tint_convert_Inner %167
+               OpStore %165 %168 None
+               OpBranch %155
+        %155 = OpLabel
+        %159 = OpIAdd %uint %158 %uint_1
+               OpBranch %156
+        %157 = OpLabel
+        %160 = OpLoad %_arr_Inner_uint_4 %152 None
+        %161 = OpCompositeConstruct %Outer %160
+               OpReturnValue %161
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %170
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %168 = OpLabel
-        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
-               OpStore %169 %tint_source
-               OpBranch %173
-        %173 = OpLabel
+        %171 = OpLabel
+        %172 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %174 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %175
+               OpStore %172 %tint_source
                OpBranch %176
         %176 = OpLabel
-        %178 = OpPhi %uint %uint_0 %173 %179 %175
-               OpLoopMerge %177 %175 None
-               OpBranch %174
-        %174 = OpLabel
-        %181 = OpUGreaterThanEqual %bool %178 %uint_4
-               OpSelectionMerge %182 None
-               OpBranchConditional %181 %183 %182
-        %183 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %181 = OpPhi %uint %uint_0 %176 %182 %178
+               OpLoopMerge %180 %178 None
                OpBranch %177
-        %182 = OpLabel
-        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
-        %185 = OpLoad %Inner_std140 %184 None
-        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
-               OpStore %186 %185 None
-               OpBranch %175
-        %175 = OpLabel
-        %179 = OpIAdd %uint %178 %uint_1
-               OpBranch %176
         %177 = OpLabel
-        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
-               OpReturnValue %180
+        %184 = OpUGreaterThanEqual %bool %181 %uint_4
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+               OpBranch %180
+        %185 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_Inner_std140 %172 %181
+        %188 = OpLoad %Inner_std140 %187 None
+        %189 = OpAccessChain %_ptr_Function_Inner_std140 %174 %181
+               OpStore %189 %188 None
+               OpBranch %178
+        %178 = OpLabel
+        %182 = OpIAdd %uint %181 %uint_1
+               OpBranch %179
+        %180 = OpLabel
+        %183 = OpLoad %_arr_Inner_std140_uint_4_0 %174 None
+               OpReturnValue %183
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %191
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %189 = OpLabel
-        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
-        %192 = OpCompositeConstruct %Outer_std140 %191
-               OpReturnValue %192
+        %192 = OpLabel
+        %193 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %194 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %193
+        %195 = OpCompositeConstruct %Outer_std140 %194
+               OpReturnValue %195
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %197
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %195 = OpLabel
-        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
-               OpStore %196 %tint_source_1
-               OpBranch %200
-        %200 = OpLabel
+        %198 = OpLabel
+        %199 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %201 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %202
+               OpStore %199 %tint_source_1
                OpBranch %203
         %203 = OpLabel
-        %205 = OpPhi %uint %uint_0 %200 %206 %202
-               OpLoopMerge %204 %202 None
-               OpBranch %201
-        %201 = OpLabel
-        %208 = OpUGreaterThanEqual %bool %205 %uint_4
-               OpSelectionMerge %209 None
-               OpBranchConditional %208 %210 %209
-        %210 = OpLabel
+               OpBranch %206
+        %206 = OpLabel
+        %208 = OpPhi %uint %uint_0 %203 %209 %205
+               OpLoopMerge %207 %205 None
                OpBranch %204
-        %209 = OpLabel
-        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
-        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
-        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
-        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
-               OpStore %215 %214 None
-               OpBranch %202
-        %202 = OpLabel
-        %206 = OpIAdd %uint %205 %uint_1
-               OpBranch %203
         %204 = OpLabel
-        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
-               OpReturnValue %207
+        %211 = OpUGreaterThanEqual %bool %208 %uint_4
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %212
+        %213 = OpLabel
+               OpBranch %207
+        %212 = OpLabel
+        %214 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %199 %208
+        %216 = OpLoad %Outer_std140_tint_explicit_layout %214 None
+        %217 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %216
+        %218 = OpAccessChain %_ptr_Function_Outer_std140 %201 %208
+               OpStore %218 %217 None
+               OpBranch %205
+        %205 = OpLabel
+        %209 = OpIAdd %uint %208 %uint_1
+               OpBranch %206
+        %207 = OpLabel
+        %210 = OpLoad %_arr_Outer_std140_uint_4 %201 None
+               OpReturnValue %210
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index b59e62e..b026d87 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -34,76 +34,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(mat4x2(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2, tint_input.m_col3));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))));
+  Inner v_2[4] = Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  mat4x2 v_6 = mat4x2(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2, v.inner[v_4].a[v_5].m_col3);
-  vec2 v_7 = v_6[min(uint(i()), 3u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))));
+  uint v_6 = min(uint(i()), 3u);
+  mat4x2 v_7 = mat4x2(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2, v.inner[v_5].a[v_6].m_col3);
+  vec2 v_8 = v_7[min(uint(i()), 3u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))), Outer(Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))), Inner(mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  mat4x2 l_a_i_a_i_m = v_6;
-  vec2 l_a_i_a_i_m_i = v_7;
-  float l_a_i_a_i_m_i_i = v_7[min(uint(i()), 1u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  mat4x2 l_a_i_a_i_m = v_7;
+  vec2 l_a_i_a_i_m_i = v_8;
+  float l_a_i_a_i_m_i_i = v_8[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index f7b2786..3106e72 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 216
+; Bound: 219
 ; Schema: 0
                OpCapability Shader
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -73,7 +73,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -95,248 +95,251 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %79 = OpConstantNull %_arr_Outer_uint_4
+         %82 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-        %100 = OpConstantNull %_arr_Inner_uint_4
+        %103 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %136 = OpTypeFunction %Inner %Inner_std140
-        %145 = OpTypeFunction %Outer %Outer_std140
-        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %139 = OpTypeFunction %Inner %Inner_std140
+        %148 = OpTypeFunction %Outer %Outer_std140
+        %170 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %175 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %191 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %197 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %199 = OpConstantNull %_arr_Outer_std140_uint_4
+        %202 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %57 = OpVariable %_ptr_Function_mat4v2float Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %73 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %79
-         %96 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %98 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_0
-         %46 = OpLoad %v2float %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %60 = OpVariable %_ptr_Function_mat4v2float Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %76 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %82
+         %99 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %101 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_0
          %49 = OpLoad %v2float %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_1
          %52 = OpLoad %v2float %50 None
-         %53 = OpAccessChain %_ptr_Uniform_v2float %42 %uint_3
-         %54 = OpLoad %v2float %53 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat4v2float %46 %49 %52 %54
-               OpStore %57 %l_a_i_a_i_m
-         %59 = OpFunctionCall %int %i
-         %60 = OpBitcast %uint %59
-         %61 = OpExtInst %uint %33 UMin %60 %uint_3
-         %62 = OpAccessChain %_ptr_Function_v2float %57 %61
-%l_a_i_a_i_m_i = OpLoad %v2float %62 None
-         %65 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %66 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %65
-               OpStore %71 %66
-               OpBranch %80
-         %80 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_2
+         %55 = OpLoad %v2float %53 None
+         %56 = OpAccessChain %_ptr_Uniform_v2float %45 %uint_3
+         %57 = OpLoad %v2float %56 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat4v2float %49 %52 %55 %57
+               OpStore %60 %l_a_i_a_i_m
+         %62 = OpFunctionCall %int %i
+         %63 = OpBitcast %uint %62
+         %64 = OpExtInst %uint %36 UMin %63 %uint_3
+         %65 = OpAccessChain %_ptr_Function_v2float %60 %64
+%l_a_i_a_i_m_i = OpLoad %v2float %65 None
+         %68 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %69 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %68
+               OpStore %74 %69
                OpBranch %83
          %83 = OpLabel
-         %85 = OpPhi %uint %uint_0 %80 %86 %82
-               OpLoopMerge %84 %82 None
-               OpBranch %81
-         %81 = OpLabel
-        %116 = OpUGreaterThanEqual %bool %85 %uint_4
-               OpSelectionMerge %118 None
-               OpBranchConditional %116 %119 %118
-        %119 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+         %88 = OpPhi %uint %uint_0 %83 %89 %85
+               OpLoopMerge %87 %85 None
                OpBranch %84
-        %118 = OpLabel
-        %120 = OpAccessChain %_ptr_Function_Outer %73 %85
-        %122 = OpAccessChain %_ptr_Function_Outer_std140 %71 %85
-        %124 = OpLoad %Outer_std140 %122 None
-        %125 = OpFunctionCall %Outer %tint_convert_Outer %124
-               OpStore %120 %125 None
-               OpBranch %82
-         %82 = OpLabel
-         %86 = OpIAdd %uint %85 %uint_1
-               OpBranch %83
          %84 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %73 None
-         %88 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %89 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %88
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %89
-         %93 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %94 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %93
-               OpStore %96 %94
-               OpBranch %101
-        %101 = OpLabel
+        %119 = OpUGreaterThanEqual %bool %88 %uint_4
+               OpSelectionMerge %121 None
+               OpBranchConditional %119 %122 %121
+        %122 = OpLabel
+               OpBranch %87
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_Outer %76 %88
+        %125 = OpAccessChain %_ptr_Function_Outer_std140 %74 %88
+        %127 = OpLoad %Outer_std140 %125 None
+        %128 = OpFunctionCall %Outer %tint_convert_Outer %127
+               OpStore %123 %128 None
+               OpBranch %85
+         %85 = OpLabel
+         %89 = OpIAdd %uint %88 %uint_1
+               OpBranch %86
+         %87 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %76 None
+         %91 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %92 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %91
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %92
+         %96 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %97 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %96
+               OpStore %99 %97
                OpBranch %104
         %104 = OpLabel
-        %106 = OpPhi %uint %uint_0 %101 %107 %103
-               OpLoopMerge %105 %103 None
-               OpBranch %102
-        %102 = OpLabel
-        %126 = OpUGreaterThanEqual %bool %106 %uint_4
-               OpSelectionMerge %127 None
-               OpBranchConditional %126 %128 %127
-        %128 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %109 = OpPhi %uint %uint_0 %104 %110 %106
+               OpLoopMerge %108 %106 None
                OpBranch %105
-        %127 = OpLabel
-        %129 = OpAccessChain %_ptr_Function_Inner %98 %106
-        %131 = OpAccessChain %_ptr_Function_Inner_std140 %96 %106
-        %133 = OpLoad %Inner_std140 %131 None
-        %134 = OpFunctionCall %Inner %tint_convert_Inner %133
-               OpStore %129 %134 None
-               OpBranch %103
-        %103 = OpLabel
-        %107 = OpIAdd %uint %106 %uint_1
-               OpBranch %104
         %105 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %98 None
-        %109 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %109
-        %112 = OpFunctionCall %int %i
-        %113 = OpBitcast %uint %112
-        %114 = OpExtInst %uint %33 UMin %113 %uint_1
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %114
+        %129 = OpUGreaterThanEqual %bool %109 %uint_4
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+               OpBranch %108
+        %130 = OpLabel
+        %132 = OpAccessChain %_ptr_Function_Inner %101 %109
+        %134 = OpAccessChain %_ptr_Function_Inner_std140 %99 %109
+        %136 = OpLoad %Inner_std140 %134 None
+        %137 = OpFunctionCall %Inner %tint_convert_Inner %136
+               OpStore %132 %137 None
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpIAdd %uint %109 %uint_1
+               OpBranch %107
+        %108 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %101 None
+        %112 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %112
+        %115 = OpFunctionCall %int %i
+        %116 = OpBitcast %uint %115
+        %117 = OpExtInst %uint %36 UMin %116 %uint_1
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %117
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %136
+%tint_convert_Inner = OpFunction %Inner None %139
  %tint_input = OpFunctionParameter %Inner_std140
-        %137 = OpLabel
-        %138 = OpCompositeExtract %v2float %tint_input 0
-        %139 = OpCompositeExtract %v2float %tint_input 1
-        %140 = OpCompositeExtract %v2float %tint_input 2
-        %141 = OpCompositeExtract %v2float %tint_input 3
-        %142 = OpCompositeConstruct %mat4v2float %138 %139 %140 %141
-        %143 = OpCompositeConstruct %Inner %142
-               OpReturnValue %143
+        %140 = OpLabel
+        %141 = OpCompositeExtract %v2float %tint_input 0
+        %142 = OpCompositeExtract %v2float %tint_input 1
+        %143 = OpCompositeExtract %v2float %tint_input 2
+        %144 = OpCompositeExtract %v2float %tint_input 3
+        %145 = OpCompositeConstruct %mat4v2float %141 %142 %143 %144
+        %146 = OpCompositeConstruct %Inner %145
+               OpReturnValue %146
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %145
+%tint_convert_Outer = OpFunction %Outer None %148
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %146 = OpLabel
-        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %148 %147
-               OpBranch %150
-        %150 = OpLabel
+        %149 = OpLabel
+        %151 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %152 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+        %150 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %151 %150
                OpBranch %153
         %153 = OpLabel
-        %155 = OpPhi %uint %uint_0 %150 %156 %152
-               OpLoopMerge %154 %152 None
-               OpBranch %151
-        %151 = OpLabel
-        %159 = OpUGreaterThanEqual %bool %155 %uint_4
-               OpSelectionMerge %160 None
-               OpBranchConditional %159 %161 %160
-        %161 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %158 = OpPhi %uint %uint_0 %153 %159 %155
+               OpLoopMerge %157 %155 None
                OpBranch %154
-        %160 = OpLabel
-        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
-        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
-        %164 = OpLoad %Inner_std140 %163 None
-        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
-               OpStore %162 %165 None
-               OpBranch %152
-        %152 = OpLabel
-        %156 = OpIAdd %uint %155 %uint_1
-               OpBranch %153
         %154 = OpLabel
-        %157 = OpLoad %_arr_Inner_uint_4 %149 None
-        %158 = OpCompositeConstruct %Outer %157
-               OpReturnValue %158
+        %162 = OpUGreaterThanEqual %bool %158 %uint_4
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+               OpBranch %157
+        %163 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_Inner %152 %158
+        %166 = OpAccessChain %_ptr_Function_Inner_std140 %151 %158
+        %167 = OpLoad %Inner_std140 %166 None
+        %168 = OpFunctionCall %Inner %tint_convert_Inner %167
+               OpStore %165 %168 None
+               OpBranch %155
+        %155 = OpLabel
+        %159 = OpIAdd %uint %158 %uint_1
+               OpBranch %156
+        %157 = OpLabel
+        %160 = OpLoad %_arr_Inner_uint_4 %152 None
+        %161 = OpCompositeConstruct %Outer %160
+               OpReturnValue %161
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %170
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %168 = OpLabel
-        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
-               OpStore %169 %tint_source
-               OpBranch %173
-        %173 = OpLabel
+        %171 = OpLabel
+        %172 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %174 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %175
+               OpStore %172 %tint_source
                OpBranch %176
         %176 = OpLabel
-        %178 = OpPhi %uint %uint_0 %173 %179 %175
-               OpLoopMerge %177 %175 None
-               OpBranch %174
-        %174 = OpLabel
-        %181 = OpUGreaterThanEqual %bool %178 %uint_4
-               OpSelectionMerge %182 None
-               OpBranchConditional %181 %183 %182
-        %183 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %181 = OpPhi %uint %uint_0 %176 %182 %178
+               OpLoopMerge %180 %178 None
                OpBranch %177
-        %182 = OpLabel
-        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
-        %185 = OpLoad %Inner_std140 %184 None
-        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
-               OpStore %186 %185 None
-               OpBranch %175
-        %175 = OpLabel
-        %179 = OpIAdd %uint %178 %uint_1
-               OpBranch %176
         %177 = OpLabel
-        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
-               OpReturnValue %180
+        %184 = OpUGreaterThanEqual %bool %181 %uint_4
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+               OpBranch %180
+        %185 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_Inner_std140 %172 %181
+        %188 = OpLoad %Inner_std140 %187 None
+        %189 = OpAccessChain %_ptr_Function_Inner_std140 %174 %181
+               OpStore %189 %188 None
+               OpBranch %178
+        %178 = OpLabel
+        %182 = OpIAdd %uint %181 %uint_1
+               OpBranch %179
+        %180 = OpLabel
+        %183 = OpLoad %_arr_Inner_std140_uint_4_0 %174 None
+               OpReturnValue %183
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %191
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %189 = OpLabel
-        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
-        %192 = OpCompositeConstruct %Outer_std140 %191
-               OpReturnValue %192
+        %192 = OpLabel
+        %193 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %194 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %193
+        %195 = OpCompositeConstruct %Outer_std140 %194
+               OpReturnValue %195
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %197
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %195 = OpLabel
-        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
-               OpStore %196 %tint_source_1
-               OpBranch %200
-        %200 = OpLabel
+        %198 = OpLabel
+        %199 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %201 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %202
+               OpStore %199 %tint_source_1
                OpBranch %203
         %203 = OpLabel
-        %205 = OpPhi %uint %uint_0 %200 %206 %202
-               OpLoopMerge %204 %202 None
-               OpBranch %201
-        %201 = OpLabel
-        %208 = OpUGreaterThanEqual %bool %205 %uint_4
-               OpSelectionMerge %209 None
-               OpBranchConditional %208 %210 %209
-        %210 = OpLabel
+               OpBranch %206
+        %206 = OpLabel
+        %208 = OpPhi %uint %uint_0 %203 %209 %205
+               OpLoopMerge %207 %205 None
                OpBranch %204
-        %209 = OpLabel
-        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
-        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
-        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
-        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
-               OpStore %215 %214 None
-               OpBranch %202
-        %202 = OpLabel
-        %206 = OpIAdd %uint %205 %uint_1
-               OpBranch %203
         %204 = OpLabel
-        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
-               OpReturnValue %207
+        %211 = OpUGreaterThanEqual %bool %208 %uint_4
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %212
+        %213 = OpLabel
+               OpBranch %207
+        %212 = OpLabel
+        %214 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %199 %208
+        %216 = OpLoad %Outer_std140_tint_explicit_layout %214 None
+        %217 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %216
+        %218 = OpAccessChain %_ptr_Function_Outer_std140 %201 %208
+               OpStore %218 %217 None
+               OpBranch %205
+        %205 = OpLabel
+        %209 = OpIAdd %uint %208 %uint_1
+               OpBranch %206
+        %207 = OpLabel
+        %210 = OpLoad %_arr_Outer_std140_uint_4 %201 None
+               OpReturnValue %210
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index b700b3a..b539ee0 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -35,76 +35,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat4x3(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2, tint_input.m_col3));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat4x3 v_6 = f16mat4x3(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2, v.inner[v_4].a[v_5].m_col3);
-  f16vec3 v_7 = v_6[min(uint(i()), 3u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat4x3 v_7 = f16mat4x3(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2, v.inner[v_5].a[v_6].m_col3);
+  f16vec3 v_8 = v_7[min(uint(i()), 3u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))), Outer(Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))), Inner(f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat4x3 l_a_i_a_i_m = v_6;
-  f16vec3 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 2u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat4x3 l_a_i_a_i_m = v_7;
+  f16vec3 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 22d5622..05fe017 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 216
+; Bound: 219
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -76,7 +76,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -98,248 +98,251 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %79 = OpConstantNull %_arr_Outer_uint_4
+         %82 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-        %100 = OpConstantNull %_arr_Inner_uint_4
+        %103 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %136 = OpTypeFunction %Inner %Inner_std140
-        %145 = OpTypeFunction %Outer %Outer_std140
-        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %139 = OpTypeFunction %Inner %Inner_std140
+        %148 = OpTypeFunction %Outer %Outer_std140
+        %170 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %175 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %191 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %197 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %199 = OpConstantNull %_arr_Outer_std140_uint_4
+        %202 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %57 = OpVariable %_ptr_Function_mat4v3half Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %73 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %79
-         %96 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %98 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_0
-         %46 = OpLoad %v3half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %60 = OpVariable %_ptr_Function_mat4v3half Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %76 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %82
+         %99 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %101 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_0
          %49 = OpLoad %v3half %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_1
          %52 = OpLoad %v3half %50 None
-         %53 = OpAccessChain %_ptr_Uniform_v3half %42 %uint_3
-         %54 = OpLoad %v3half %53 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat4v3half %46 %49 %52 %54
-               OpStore %57 %l_a_i_a_i_m
-         %59 = OpFunctionCall %int %i
-         %60 = OpBitcast %uint %59
-         %61 = OpExtInst %uint %33 UMin %60 %uint_3
-         %62 = OpAccessChain %_ptr_Function_v3half %57 %61
-%l_a_i_a_i_m_i = OpLoad %v3half %62 None
-         %65 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %66 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %65
-               OpStore %71 %66
-               OpBranch %80
-         %80 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_2
+         %55 = OpLoad %v3half %53 None
+         %56 = OpAccessChain %_ptr_Uniform_v3half %45 %uint_3
+         %57 = OpLoad %v3half %56 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat4v3half %49 %52 %55 %57
+               OpStore %60 %l_a_i_a_i_m
+         %62 = OpFunctionCall %int %i
+         %63 = OpBitcast %uint %62
+         %64 = OpExtInst %uint %36 UMin %63 %uint_3
+         %65 = OpAccessChain %_ptr_Function_v3half %60 %64
+%l_a_i_a_i_m_i = OpLoad %v3half %65 None
+         %68 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %69 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %68
+               OpStore %74 %69
                OpBranch %83
          %83 = OpLabel
-         %85 = OpPhi %uint %uint_0 %80 %86 %82
-               OpLoopMerge %84 %82 None
-               OpBranch %81
-         %81 = OpLabel
-        %116 = OpUGreaterThanEqual %bool %85 %uint_4
-               OpSelectionMerge %118 None
-               OpBranchConditional %116 %119 %118
-        %119 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+         %88 = OpPhi %uint %uint_0 %83 %89 %85
+               OpLoopMerge %87 %85 None
                OpBranch %84
-        %118 = OpLabel
-        %120 = OpAccessChain %_ptr_Function_Outer %73 %85
-        %122 = OpAccessChain %_ptr_Function_Outer_std140 %71 %85
-        %124 = OpLoad %Outer_std140 %122 None
-        %125 = OpFunctionCall %Outer %tint_convert_Outer %124
-               OpStore %120 %125 None
-               OpBranch %82
-         %82 = OpLabel
-         %86 = OpIAdd %uint %85 %uint_1
-               OpBranch %83
          %84 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %73 None
-         %88 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %89 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %88
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %89
-         %93 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %94 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %93
-               OpStore %96 %94
-               OpBranch %101
-        %101 = OpLabel
+        %119 = OpUGreaterThanEqual %bool %88 %uint_4
+               OpSelectionMerge %121 None
+               OpBranchConditional %119 %122 %121
+        %122 = OpLabel
+               OpBranch %87
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_Outer %76 %88
+        %125 = OpAccessChain %_ptr_Function_Outer_std140 %74 %88
+        %127 = OpLoad %Outer_std140 %125 None
+        %128 = OpFunctionCall %Outer %tint_convert_Outer %127
+               OpStore %123 %128 None
+               OpBranch %85
+         %85 = OpLabel
+         %89 = OpIAdd %uint %88 %uint_1
+               OpBranch %86
+         %87 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %76 None
+         %91 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %92 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %91
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %92
+         %96 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %97 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %96
+               OpStore %99 %97
                OpBranch %104
         %104 = OpLabel
-        %106 = OpPhi %uint %uint_0 %101 %107 %103
-               OpLoopMerge %105 %103 None
-               OpBranch %102
-        %102 = OpLabel
-        %126 = OpUGreaterThanEqual %bool %106 %uint_4
-               OpSelectionMerge %127 None
-               OpBranchConditional %126 %128 %127
-        %128 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %109 = OpPhi %uint %uint_0 %104 %110 %106
+               OpLoopMerge %108 %106 None
                OpBranch %105
-        %127 = OpLabel
-        %129 = OpAccessChain %_ptr_Function_Inner %98 %106
-        %131 = OpAccessChain %_ptr_Function_Inner_std140 %96 %106
-        %133 = OpLoad %Inner_std140 %131 None
-        %134 = OpFunctionCall %Inner %tint_convert_Inner %133
-               OpStore %129 %134 None
-               OpBranch %103
-        %103 = OpLabel
-        %107 = OpIAdd %uint %106 %uint_1
-               OpBranch %104
         %105 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %98 None
-        %109 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %109
-        %112 = OpFunctionCall %int %i
-        %113 = OpBitcast %uint %112
-        %114 = OpExtInst %uint %33 UMin %113 %uint_2
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %114
+        %129 = OpUGreaterThanEqual %bool %109 %uint_4
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+               OpBranch %108
+        %130 = OpLabel
+        %132 = OpAccessChain %_ptr_Function_Inner %101 %109
+        %134 = OpAccessChain %_ptr_Function_Inner_std140 %99 %109
+        %136 = OpLoad %Inner_std140 %134 None
+        %137 = OpFunctionCall %Inner %tint_convert_Inner %136
+               OpStore %132 %137 None
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpIAdd %uint %109 %uint_1
+               OpBranch %107
+        %108 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %101 None
+        %112 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %112
+        %115 = OpFunctionCall %int %i
+        %116 = OpBitcast %uint %115
+        %117 = OpExtInst %uint %36 UMin %116 %uint_2
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %117
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %136
+%tint_convert_Inner = OpFunction %Inner None %139
  %tint_input = OpFunctionParameter %Inner_std140
-        %137 = OpLabel
-        %138 = OpCompositeExtract %v3half %tint_input 0
-        %139 = OpCompositeExtract %v3half %tint_input 1
-        %140 = OpCompositeExtract %v3half %tint_input 2
-        %141 = OpCompositeExtract %v3half %tint_input 3
-        %142 = OpCompositeConstruct %mat4v3half %138 %139 %140 %141
-        %143 = OpCompositeConstruct %Inner %142
-               OpReturnValue %143
+        %140 = OpLabel
+        %141 = OpCompositeExtract %v3half %tint_input 0
+        %142 = OpCompositeExtract %v3half %tint_input 1
+        %143 = OpCompositeExtract %v3half %tint_input 2
+        %144 = OpCompositeExtract %v3half %tint_input 3
+        %145 = OpCompositeConstruct %mat4v3half %141 %142 %143 %144
+        %146 = OpCompositeConstruct %Inner %145
+               OpReturnValue %146
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %145
+%tint_convert_Outer = OpFunction %Outer None %148
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %146 = OpLabel
-        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %148 %147
-               OpBranch %150
-        %150 = OpLabel
+        %149 = OpLabel
+        %151 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %152 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+        %150 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %151 %150
                OpBranch %153
         %153 = OpLabel
-        %155 = OpPhi %uint %uint_0 %150 %156 %152
-               OpLoopMerge %154 %152 None
-               OpBranch %151
-        %151 = OpLabel
-        %159 = OpUGreaterThanEqual %bool %155 %uint_4
-               OpSelectionMerge %160 None
-               OpBranchConditional %159 %161 %160
-        %161 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %158 = OpPhi %uint %uint_0 %153 %159 %155
+               OpLoopMerge %157 %155 None
                OpBranch %154
-        %160 = OpLabel
-        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
-        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
-        %164 = OpLoad %Inner_std140 %163 None
-        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
-               OpStore %162 %165 None
-               OpBranch %152
-        %152 = OpLabel
-        %156 = OpIAdd %uint %155 %uint_1
-               OpBranch %153
         %154 = OpLabel
-        %157 = OpLoad %_arr_Inner_uint_4 %149 None
-        %158 = OpCompositeConstruct %Outer %157
-               OpReturnValue %158
+        %162 = OpUGreaterThanEqual %bool %158 %uint_4
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+               OpBranch %157
+        %163 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_Inner %152 %158
+        %166 = OpAccessChain %_ptr_Function_Inner_std140 %151 %158
+        %167 = OpLoad %Inner_std140 %166 None
+        %168 = OpFunctionCall %Inner %tint_convert_Inner %167
+               OpStore %165 %168 None
+               OpBranch %155
+        %155 = OpLabel
+        %159 = OpIAdd %uint %158 %uint_1
+               OpBranch %156
+        %157 = OpLabel
+        %160 = OpLoad %_arr_Inner_uint_4 %152 None
+        %161 = OpCompositeConstruct %Outer %160
+               OpReturnValue %161
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %170
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %168 = OpLabel
-        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
-               OpStore %169 %tint_source
-               OpBranch %173
-        %173 = OpLabel
+        %171 = OpLabel
+        %172 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %174 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %175
+               OpStore %172 %tint_source
                OpBranch %176
         %176 = OpLabel
-        %178 = OpPhi %uint %uint_0 %173 %179 %175
-               OpLoopMerge %177 %175 None
-               OpBranch %174
-        %174 = OpLabel
-        %181 = OpUGreaterThanEqual %bool %178 %uint_4
-               OpSelectionMerge %182 None
-               OpBranchConditional %181 %183 %182
-        %183 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %181 = OpPhi %uint %uint_0 %176 %182 %178
+               OpLoopMerge %180 %178 None
                OpBranch %177
-        %182 = OpLabel
-        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
-        %185 = OpLoad %Inner_std140 %184 None
-        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
-               OpStore %186 %185 None
-               OpBranch %175
-        %175 = OpLabel
-        %179 = OpIAdd %uint %178 %uint_1
-               OpBranch %176
         %177 = OpLabel
-        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
-               OpReturnValue %180
+        %184 = OpUGreaterThanEqual %bool %181 %uint_4
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+               OpBranch %180
+        %185 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_Inner_std140 %172 %181
+        %188 = OpLoad %Inner_std140 %187 None
+        %189 = OpAccessChain %_ptr_Function_Inner_std140 %174 %181
+               OpStore %189 %188 None
+               OpBranch %178
+        %178 = OpLabel
+        %182 = OpIAdd %uint %181 %uint_1
+               OpBranch %179
+        %180 = OpLabel
+        %183 = OpLoad %_arr_Inner_std140_uint_4_0 %174 None
+               OpReturnValue %183
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %191
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %189 = OpLabel
-        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
-        %192 = OpCompositeConstruct %Outer_std140 %191
-               OpReturnValue %192
+        %192 = OpLabel
+        %193 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %194 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %193
+        %195 = OpCompositeConstruct %Outer_std140 %194
+               OpReturnValue %195
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %197
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %195 = OpLabel
-        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
-               OpStore %196 %tint_source_1
-               OpBranch %200
-        %200 = OpLabel
+        %198 = OpLabel
+        %199 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %201 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %202
+               OpStore %199 %tint_source_1
                OpBranch %203
         %203 = OpLabel
-        %205 = OpPhi %uint %uint_0 %200 %206 %202
-               OpLoopMerge %204 %202 None
-               OpBranch %201
-        %201 = OpLabel
-        %208 = OpUGreaterThanEqual %bool %205 %uint_4
-               OpSelectionMerge %209 None
-               OpBranchConditional %208 %210 %209
-        %210 = OpLabel
+               OpBranch %206
+        %206 = OpLabel
+        %208 = OpPhi %uint %uint_0 %203 %209 %205
+               OpLoopMerge %207 %205 None
                OpBranch %204
-        %209 = OpLabel
-        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
-        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
-        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
-        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
-               OpStore %215 %214 None
-               OpBranch %202
-        %202 = OpLabel
-        %206 = OpIAdd %uint %205 %uint_1
-               OpBranch %203
         %204 = OpLabel
-        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
-               OpReturnValue %207
+        %211 = OpUGreaterThanEqual %bool %208 %uint_4
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %212
+        %213 = OpLabel
+               OpBranch %207
+        %212 = OpLabel
+        %214 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %199 %208
+        %216 = OpLoad %Outer_std140_tint_explicit_layout %214 None
+        %217 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %216
+        %218 = OpAccessChain %_ptr_Function_Outer_std140 %201 %208
+               OpStore %218 %217 None
+               OpBranch %205
+        %205 = OpLabel
+        %209 = OpIAdd %uint %208 %uint_1
+               OpBranch %206
+        %207 = OpLabel
+        %210 = OpLoad %_arr_Outer_std140_uint_4 %201 None
+               OpReturnValue %210
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index dba0ad4..259a98b 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -30,76 +30,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(mat4x3(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2, tint_input.m_col3));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))));
+  Inner v_2[4] = Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  mat4x3 v_6 = mat4x3(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2, v.inner[v_4].a[v_5].m_col3);
-  vec3 v_7 = v_6[min(uint(i()), 3u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))));
+  uint v_6 = min(uint(i()), 3u);
+  mat4x3 v_7 = mat4x3(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2, v.inner[v_5].a[v_6].m_col3);
+  vec3 v_8 = v_7[min(uint(i()), 3u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))), Outer(Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))), Inner(mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  mat4x3 l_a_i_a_i_m = v_6;
-  vec3 l_a_i_a_i_m_i = v_7;
-  float l_a_i_a_i_m_i_i = v_7[min(uint(i()), 2u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  mat4x3 l_a_i_a_i_m = v_7;
+  vec3 l_a_i_a_i_m_i = v_8;
+  float l_a_i_a_i_m_i_i = v_8[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index b9f8b6a..612222a 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 216
+; Bound: 219
 ; Schema: 0
                OpCapability Shader
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -73,7 +73,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -95,248 +95,251 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %79 = OpConstantNull %_arr_Outer_uint_4
+         %82 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-        %100 = OpConstantNull %_arr_Inner_uint_4
+        %103 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %136 = OpTypeFunction %Inner %Inner_std140
-        %145 = OpTypeFunction %Outer %Outer_std140
-        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %139 = OpTypeFunction %Inner %Inner_std140
+        %148 = OpTypeFunction %Outer %Outer_std140
+        %170 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %175 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %191 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %197 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %199 = OpConstantNull %_arr_Outer_std140_uint_4
+        %202 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %57 = OpVariable %_ptr_Function_mat4v3float Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %73 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %79
-         %96 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %98 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_0
-         %46 = OpLoad %v3float %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %60 = OpVariable %_ptr_Function_mat4v3float Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %76 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %82
+         %99 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %101 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_0
          %49 = OpLoad %v3float %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_1
          %52 = OpLoad %v3float %50 None
-         %53 = OpAccessChain %_ptr_Uniform_v3float %42 %uint_3
-         %54 = OpLoad %v3float %53 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat4v3float %46 %49 %52 %54
-               OpStore %57 %l_a_i_a_i_m
-         %59 = OpFunctionCall %int %i
-         %60 = OpBitcast %uint %59
-         %61 = OpExtInst %uint %33 UMin %60 %uint_3
-         %62 = OpAccessChain %_ptr_Function_v3float %57 %61
-%l_a_i_a_i_m_i = OpLoad %v3float %62 None
-         %65 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %66 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %65
-               OpStore %71 %66
-               OpBranch %80
-         %80 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_2
+         %55 = OpLoad %v3float %53 None
+         %56 = OpAccessChain %_ptr_Uniform_v3float %45 %uint_3
+         %57 = OpLoad %v3float %56 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat4v3float %49 %52 %55 %57
+               OpStore %60 %l_a_i_a_i_m
+         %62 = OpFunctionCall %int %i
+         %63 = OpBitcast %uint %62
+         %64 = OpExtInst %uint %36 UMin %63 %uint_3
+         %65 = OpAccessChain %_ptr_Function_v3float %60 %64
+%l_a_i_a_i_m_i = OpLoad %v3float %65 None
+         %68 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %69 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %68
+               OpStore %74 %69
                OpBranch %83
          %83 = OpLabel
-         %85 = OpPhi %uint %uint_0 %80 %86 %82
-               OpLoopMerge %84 %82 None
-               OpBranch %81
-         %81 = OpLabel
-        %116 = OpUGreaterThanEqual %bool %85 %uint_4
-               OpSelectionMerge %118 None
-               OpBranchConditional %116 %119 %118
-        %119 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+         %88 = OpPhi %uint %uint_0 %83 %89 %85
+               OpLoopMerge %87 %85 None
                OpBranch %84
-        %118 = OpLabel
-        %120 = OpAccessChain %_ptr_Function_Outer %73 %85
-        %122 = OpAccessChain %_ptr_Function_Outer_std140 %71 %85
-        %124 = OpLoad %Outer_std140 %122 None
-        %125 = OpFunctionCall %Outer %tint_convert_Outer %124
-               OpStore %120 %125 None
-               OpBranch %82
-         %82 = OpLabel
-         %86 = OpIAdd %uint %85 %uint_1
-               OpBranch %83
          %84 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %73 None
-         %88 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %89 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %88
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %89
-         %93 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %94 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %93
-               OpStore %96 %94
-               OpBranch %101
-        %101 = OpLabel
+        %119 = OpUGreaterThanEqual %bool %88 %uint_4
+               OpSelectionMerge %121 None
+               OpBranchConditional %119 %122 %121
+        %122 = OpLabel
+               OpBranch %87
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_Outer %76 %88
+        %125 = OpAccessChain %_ptr_Function_Outer_std140 %74 %88
+        %127 = OpLoad %Outer_std140 %125 None
+        %128 = OpFunctionCall %Outer %tint_convert_Outer %127
+               OpStore %123 %128 None
+               OpBranch %85
+         %85 = OpLabel
+         %89 = OpIAdd %uint %88 %uint_1
+               OpBranch %86
+         %87 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %76 None
+         %91 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %92 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %91
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %92
+         %96 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %97 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %96
+               OpStore %99 %97
                OpBranch %104
         %104 = OpLabel
-        %106 = OpPhi %uint %uint_0 %101 %107 %103
-               OpLoopMerge %105 %103 None
-               OpBranch %102
-        %102 = OpLabel
-        %126 = OpUGreaterThanEqual %bool %106 %uint_4
-               OpSelectionMerge %127 None
-               OpBranchConditional %126 %128 %127
-        %128 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %109 = OpPhi %uint %uint_0 %104 %110 %106
+               OpLoopMerge %108 %106 None
                OpBranch %105
-        %127 = OpLabel
-        %129 = OpAccessChain %_ptr_Function_Inner %98 %106
-        %131 = OpAccessChain %_ptr_Function_Inner_std140 %96 %106
-        %133 = OpLoad %Inner_std140 %131 None
-        %134 = OpFunctionCall %Inner %tint_convert_Inner %133
-               OpStore %129 %134 None
-               OpBranch %103
-        %103 = OpLabel
-        %107 = OpIAdd %uint %106 %uint_1
-               OpBranch %104
         %105 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %98 None
-        %109 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %109
-        %112 = OpFunctionCall %int %i
-        %113 = OpBitcast %uint %112
-        %114 = OpExtInst %uint %33 UMin %113 %uint_2
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %114
+        %129 = OpUGreaterThanEqual %bool %109 %uint_4
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+               OpBranch %108
+        %130 = OpLabel
+        %132 = OpAccessChain %_ptr_Function_Inner %101 %109
+        %134 = OpAccessChain %_ptr_Function_Inner_std140 %99 %109
+        %136 = OpLoad %Inner_std140 %134 None
+        %137 = OpFunctionCall %Inner %tint_convert_Inner %136
+               OpStore %132 %137 None
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpIAdd %uint %109 %uint_1
+               OpBranch %107
+        %108 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %101 None
+        %112 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %112
+        %115 = OpFunctionCall %int %i
+        %116 = OpBitcast %uint %115
+        %117 = OpExtInst %uint %36 UMin %116 %uint_2
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %float %l_a_i_a_i_m_i %117
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %136
+%tint_convert_Inner = OpFunction %Inner None %139
  %tint_input = OpFunctionParameter %Inner_std140
-        %137 = OpLabel
-        %138 = OpCompositeExtract %v3float %tint_input 0
-        %139 = OpCompositeExtract %v3float %tint_input 1
-        %140 = OpCompositeExtract %v3float %tint_input 2
-        %141 = OpCompositeExtract %v3float %tint_input 3
-        %142 = OpCompositeConstruct %mat4v3float %138 %139 %140 %141
-        %143 = OpCompositeConstruct %Inner %142
-               OpReturnValue %143
+        %140 = OpLabel
+        %141 = OpCompositeExtract %v3float %tint_input 0
+        %142 = OpCompositeExtract %v3float %tint_input 1
+        %143 = OpCompositeExtract %v3float %tint_input 2
+        %144 = OpCompositeExtract %v3float %tint_input 3
+        %145 = OpCompositeConstruct %mat4v3float %141 %142 %143 %144
+        %146 = OpCompositeConstruct %Inner %145
+               OpReturnValue %146
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %145
+%tint_convert_Outer = OpFunction %Outer None %148
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %146 = OpLabel
-        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %148 %147
-               OpBranch %150
-        %150 = OpLabel
+        %149 = OpLabel
+        %151 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %152 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+        %150 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %151 %150
                OpBranch %153
         %153 = OpLabel
-        %155 = OpPhi %uint %uint_0 %150 %156 %152
-               OpLoopMerge %154 %152 None
-               OpBranch %151
-        %151 = OpLabel
-        %159 = OpUGreaterThanEqual %bool %155 %uint_4
-               OpSelectionMerge %160 None
-               OpBranchConditional %159 %161 %160
-        %161 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %158 = OpPhi %uint %uint_0 %153 %159 %155
+               OpLoopMerge %157 %155 None
                OpBranch %154
-        %160 = OpLabel
-        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
-        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
-        %164 = OpLoad %Inner_std140 %163 None
-        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
-               OpStore %162 %165 None
-               OpBranch %152
-        %152 = OpLabel
-        %156 = OpIAdd %uint %155 %uint_1
-               OpBranch %153
         %154 = OpLabel
-        %157 = OpLoad %_arr_Inner_uint_4 %149 None
-        %158 = OpCompositeConstruct %Outer %157
-               OpReturnValue %158
+        %162 = OpUGreaterThanEqual %bool %158 %uint_4
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+               OpBranch %157
+        %163 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_Inner %152 %158
+        %166 = OpAccessChain %_ptr_Function_Inner_std140 %151 %158
+        %167 = OpLoad %Inner_std140 %166 None
+        %168 = OpFunctionCall %Inner %tint_convert_Inner %167
+               OpStore %165 %168 None
+               OpBranch %155
+        %155 = OpLabel
+        %159 = OpIAdd %uint %158 %uint_1
+               OpBranch %156
+        %157 = OpLabel
+        %160 = OpLoad %_arr_Inner_uint_4 %152 None
+        %161 = OpCompositeConstruct %Outer %160
+               OpReturnValue %161
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %170
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %168 = OpLabel
-        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
-               OpStore %169 %tint_source
-               OpBranch %173
-        %173 = OpLabel
+        %171 = OpLabel
+        %172 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %174 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %175
+               OpStore %172 %tint_source
                OpBranch %176
         %176 = OpLabel
-        %178 = OpPhi %uint %uint_0 %173 %179 %175
-               OpLoopMerge %177 %175 None
-               OpBranch %174
-        %174 = OpLabel
-        %181 = OpUGreaterThanEqual %bool %178 %uint_4
-               OpSelectionMerge %182 None
-               OpBranchConditional %181 %183 %182
-        %183 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %181 = OpPhi %uint %uint_0 %176 %182 %178
+               OpLoopMerge %180 %178 None
                OpBranch %177
-        %182 = OpLabel
-        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
-        %185 = OpLoad %Inner_std140 %184 None
-        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
-               OpStore %186 %185 None
-               OpBranch %175
-        %175 = OpLabel
-        %179 = OpIAdd %uint %178 %uint_1
-               OpBranch %176
         %177 = OpLabel
-        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
-               OpReturnValue %180
+        %184 = OpUGreaterThanEqual %bool %181 %uint_4
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+               OpBranch %180
+        %185 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_Inner_std140 %172 %181
+        %188 = OpLoad %Inner_std140 %187 None
+        %189 = OpAccessChain %_ptr_Function_Inner_std140 %174 %181
+               OpStore %189 %188 None
+               OpBranch %178
+        %178 = OpLabel
+        %182 = OpIAdd %uint %181 %uint_1
+               OpBranch %179
+        %180 = OpLabel
+        %183 = OpLoad %_arr_Inner_std140_uint_4_0 %174 None
+               OpReturnValue %183
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %191
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %189 = OpLabel
-        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
-        %192 = OpCompositeConstruct %Outer_std140 %191
-               OpReturnValue %192
+        %192 = OpLabel
+        %193 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %194 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %193
+        %195 = OpCompositeConstruct %Outer_std140 %194
+               OpReturnValue %195
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %197
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %195 = OpLabel
-        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
-               OpStore %196 %tint_source_1
-               OpBranch %200
-        %200 = OpLabel
+        %198 = OpLabel
+        %199 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %201 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %202
+               OpStore %199 %tint_source_1
                OpBranch %203
         %203 = OpLabel
-        %205 = OpPhi %uint %uint_0 %200 %206 %202
-               OpLoopMerge %204 %202 None
-               OpBranch %201
-        %201 = OpLabel
-        %208 = OpUGreaterThanEqual %bool %205 %uint_4
-               OpSelectionMerge %209 None
-               OpBranchConditional %208 %210 %209
-        %210 = OpLabel
+               OpBranch %206
+        %206 = OpLabel
+        %208 = OpPhi %uint %uint_0 %203 %209 %205
+               OpLoopMerge %207 %205 None
                OpBranch %204
-        %209 = OpLabel
-        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
-        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
-        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
-        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
-               OpStore %215 %214 None
-               OpBranch %202
-        %202 = OpLabel
-        %206 = OpIAdd %uint %205 %uint_1
-               OpBranch %203
         %204 = OpLabel
-        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
-               OpReturnValue %207
+        %211 = OpUGreaterThanEqual %bool %208 %uint_4
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %212
+        %213 = OpLabel
+               OpBranch %207
+        %212 = OpLabel
+        %214 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %199 %208
+        %216 = OpLoad %Outer_std140_tint_explicit_layout %214 None
+        %217 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %216
+        %218 = OpAccessChain %_ptr_Function_Outer_std140 %201 %208
+               OpStore %218 %217 None
+               OpBranch %205
+        %205 = OpLabel
+        %209 = OpIAdd %uint %208 %uint_1
+               OpBranch %206
+        %207 = OpLabel
+        %210 = OpLoad %_arr_Outer_std140_uint_4 %201 None
+               OpReturnValue %210
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 01358a2..d8d7368 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -35,76 +35,77 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 Inner tint_convert_Inner(Inner_std140 tint_input) {
   return Inner(f16mat4(tint_input.m_col0, tint_input.m_col1, tint_input.m_col2, tint_input.m_col3));
 }
 Outer tint_convert_Outer(Outer_std140 tint_input) {
-  Inner v_1[4] = Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
+  Inner v_2[4] = Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
   {
-    uint v_2 = 0u;
-    v_2 = 0u;
+    uint v_3 = 0u;
+    v_3 = 0u;
     while(true) {
-      uint v_3 = v_2;
-      if ((v_3 >= 4u)) {
+      uint v_4 = v_3;
+      if ((v_4 >= 4u)) {
         break;
       }
-      v_1[v_3] = tint_convert_Inner(tint_input.a[v_3]);
+      v_2[v_4] = tint_convert_Inner(tint_input.a[v_4]);
       {
-        v_2 = (v_3 + 1u);
+        v_3 = (v_4 + 1u);
       }
       continue;
     }
   }
-  return Outer(v_1);
+  return Outer(v_2);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_4 = min(uint(i()), 3u);
   uint v_5 = min(uint(i()), 3u);
-  f16mat4 v_6 = f16mat4(v.inner[v_4].a[v_5].m_col0, v.inner[v_4].a[v_5].m_col1, v.inner[v_4].a[v_5].m_col2, v.inner[v_4].a[v_5].m_col3);
-  f16vec4 v_7 = v_6[min(uint(i()), 3u)];
-  Outer_std140 v_8[4] = v.inner;
-  Outer v_9[4] = Outer[4](Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))));
+  uint v_6 = min(uint(i()), 3u);
+  f16mat4 v_7 = f16mat4(v.inner[v_5].a[v_6].m_col0, v.inner[v_5].a[v_6].m_col1, v.inner[v_5].a[v_6].m_col2, v.inner[v_5].a[v_6].m_col3);
+  f16vec4 v_8 = v_7[min(uint(i()), 3u)];
+  Outer_std140 v_9[4] = v.inner;
+  Outer v_10[4] = Outer[4](Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))), Outer(Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))))));
   {
-    uint v_10 = 0u;
-    v_10 = 0u;
+    uint v_11 = 0u;
+    v_11 = 0u;
     while(true) {
-      uint v_11 = v_10;
-      if ((v_11 >= 4u)) {
+      uint v_12 = v_11;
+      if ((v_12 >= 4u)) {
         break;
       }
-      v_9[v_11] = tint_convert_Outer(v_8[v_11]);
+      v_10[v_12] = tint_convert_Outer(v_9[v_12]);
       {
-        v_10 = (v_11 + 1u);
+        v_11 = (v_12 + 1u);
       }
       continue;
     }
   }
-  Outer l_a[4] = v_9;
-  Outer l_a_i = tint_convert_Outer(v.inner[v_4]);
-  Inner_std140 v_12[4] = v.inner[v_4].a;
-  Inner v_13[4] = Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
+  Outer l_a[4] = v_10;
+  Outer l_a_i = tint_convert_Outer(v.inner[v_5]);
+  Inner_std140 v_13[4] = v.inner[v_5].a;
+  Inner v_14[4] = Inner[4](Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))), Inner(f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf))));
   {
-    uint v_14 = 0u;
-    v_14 = 0u;
+    uint v_15 = 0u;
+    v_15 = 0u;
     while(true) {
-      uint v_15 = v_14;
-      if ((v_15 >= 4u)) {
+      uint v_16 = v_15;
+      if ((v_16 >= 4u)) {
         break;
       }
-      v_13[v_15] = tint_convert_Inner(v_12[v_15]);
+      v_14[v_16] = tint_convert_Inner(v_13[v_16]);
       {
-        v_14 = (v_15 + 1u);
+        v_15 = (v_16 + 1u);
       }
       continue;
     }
   }
-  Inner l_a_i_a[4] = v_13;
-  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_4].a[v_5]);
-  f16mat4 l_a_i_a_i_m = v_6;
-  f16vec4 l_a_i_a_i_m_i = v_7;
-  float16_t l_a_i_a_i_m_i_i = v_7[min(uint(i()), 3u)];
+  Inner l_a_i_a[4] = v_14;
+  Inner l_a_i_a_i = tint_convert_Inner(v.inner[v_5].a[v_6]);
+  f16mat4 l_a_i_a_i_m = v_7;
+  f16vec4 l_a_i_a_i_m_i = v_8;
+  float16_t l_a_i_a_i_m_i_i = v_8[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 1d2b4ec..e8aae4e 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 216
+; Bound: 219
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %33 = OpExtInstImport "GLSL.std.450"
+         %36 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -76,7 +76,7 @@
          %17 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
+         %28 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -98,248 +98,251 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-         %79 = OpConstantNull %_arr_Outer_uint_4
+         %82 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4_0 = OpTypePointer Function %_arr_Inner_std140_uint_4_0
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
-        %100 = OpConstantNull %_arr_Inner_uint_4
+        %103 = OpConstantNull %_arr_Inner_uint_4
        %bool = OpTypeBool
 %_ptr_Function_Outer = OpTypePointer Function %Outer
 %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140
 %_ptr_Function_Inner = OpTypePointer Function %Inner
 %_ptr_Function_Inner_std140 = OpTypePointer Function %Inner_std140
-        %136 = OpTypeFunction %Inner %Inner_std140
-        %145 = OpTypeFunction %Outer %Outer_std140
-        %167 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
+        %139 = OpTypeFunction %Inner %Inner_std140
+        %148 = OpTypeFunction %Outer %Outer_std140
+        %170 = OpTypeFunction %_arr_Inner_std140_uint_4_0 %_arr_Inner_std140_uint_4
 %_ptr_Function__arr_Inner_std140_uint_4 = OpTypePointer Function %_arr_Inner_std140_uint_4
-        %172 = OpConstantNull %_arr_Inner_std140_uint_4_0
-        %188 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
-        %194 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
+        %175 = OpConstantNull %_arr_Inner_std140_uint_4_0
+        %191 = OpTypeFunction %Outer_std140 %Outer_std140_tint_explicit_layout
+        %197 = OpTypeFunction %_arr_Outer_std140_uint_4 %_arr_Outer_std140_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %199 = OpConstantNull %_arr_Outer_std140_uint_4
+        %202 = OpConstantNull %_arr_Outer_std140_uint_4
 %_ptr_Function_Outer_std140_tint_explicit_layout = OpTypePointer Function %Outer_std140_tint_explicit_layout
           %i = OpFunction %int None %17
          %18 = OpLabel
          %19 = OpLoad %int %counter None
-         %20 = OpIAdd %int %19 %int_1
-               OpStore %counter %20 None
-         %22 = OpLoad %int %counter None
-               OpReturnValue %22
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_1
+         %23 = OpIAdd %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %counter %24 None
+         %25 = OpLoad %int %counter None
+               OpReturnValue %25
                OpFunctionEnd
-          %f = OpFunction %void None %25
-         %26 = OpLabel
-         %57 = OpVariable %_ptr_Function_mat4v4half Function
-         %71 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
-         %73 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %79
-         %96 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-         %98 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-         %27 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
-         %30 = OpFunctionCall %int %i
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %27 %32
-         %37 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %35 %uint_0
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %33 UMin %40 %uint_3
-         %42 = OpAccessChain %_ptr_Uniform_Inner_std140 %37 %41
-         %44 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_0
-         %46 = OpLoad %v4half %44 None
-         %47 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_1
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %60 = OpVariable %_ptr_Function_mat4v4half Function
+         %74 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function
+         %76 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %82
+         %99 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %101 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+         %30 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_tint_explicit_layout_uint_4 %1 %uint_0
+         %33 = OpFunctionCall %int %i
+         %34 = OpBitcast %uint %33
+         %35 = OpExtInst %uint %36 UMin %34 %uint_3
+         %38 = OpAccessChain %_ptr_Uniform_Outer_std140_tint_explicit_layout %30 %35
+         %40 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %38 %uint_0
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %36 UMin %43 %uint_3
+         %45 = OpAccessChain %_ptr_Uniform_Inner_std140 %40 %44
+         %47 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_0
          %49 = OpLoad %v4half %47 None
-         %50 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_1
          %52 = OpLoad %v4half %50 None
-         %53 = OpAccessChain %_ptr_Uniform_v4half %42 %uint_3
-         %54 = OpLoad %v4half %53 None
-%l_a_i_a_i_m = OpCompositeConstruct %mat4v4half %46 %49 %52 %54
-               OpStore %57 %l_a_i_a_i_m
-         %59 = OpFunctionCall %int %i
-         %60 = OpBitcast %uint %59
-         %61 = OpExtInst %uint %33 UMin %60 %uint_3
-         %62 = OpAccessChain %_ptr_Function_v4half %57 %61
-%l_a_i_a_i_m_i = OpLoad %v4half %62 None
-         %65 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %27 None
-         %66 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %65
-               OpStore %71 %66
-               OpBranch %80
-         %80 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_2
+         %55 = OpLoad %v4half %53 None
+         %56 = OpAccessChain %_ptr_Uniform_v4half %45 %uint_3
+         %57 = OpLoad %v4half %56 None
+%l_a_i_a_i_m = OpCompositeConstruct %mat4v4half %49 %52 %55 %57
+               OpStore %60 %l_a_i_a_i_m
+         %62 = OpFunctionCall %int %i
+         %63 = OpBitcast %uint %62
+         %64 = OpExtInst %uint %36 UMin %63 %uint_3
+         %65 = OpAccessChain %_ptr_Function_v4half %60 %64
+%l_a_i_a_i_m_i = OpLoad %v4half %65 None
+         %68 = OpLoad %_arr_Outer_std140_tint_explicit_layout_uint_4 %30 None
+         %69 = OpFunctionCall %_arr_Outer_std140_uint_4 %tint_convert_explicit_layout_1 %68
+               OpStore %74 %69
                OpBranch %83
          %83 = OpLabel
-         %85 = OpPhi %uint %uint_0 %80 %86 %82
-               OpLoopMerge %84 %82 None
-               OpBranch %81
-         %81 = OpLabel
-        %116 = OpUGreaterThanEqual %bool %85 %uint_4
-               OpSelectionMerge %118 None
-               OpBranchConditional %116 %119 %118
-        %119 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+         %88 = OpPhi %uint %uint_0 %83 %89 %85
+               OpLoopMerge %87 %85 None
                OpBranch %84
-        %118 = OpLabel
-        %120 = OpAccessChain %_ptr_Function_Outer %73 %85
-        %122 = OpAccessChain %_ptr_Function_Outer_std140 %71 %85
-        %124 = OpLoad %Outer_std140 %122 None
-        %125 = OpFunctionCall %Outer %tint_convert_Outer %124
-               OpStore %120 %125 None
-               OpBranch %82
-         %82 = OpLabel
-         %86 = OpIAdd %uint %85 %uint_1
-               OpBranch %83
          %84 = OpLabel
-        %l_a = OpLoad %_arr_Outer_uint_4 %73 None
-         %88 = OpLoad %Outer_std140_tint_explicit_layout %35 None
-         %89 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %88
-      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %89
-         %93 = OpLoad %_arr_Inner_std140_uint_4 %37 None
-         %94 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %93
-               OpStore %96 %94
-               OpBranch %101
-        %101 = OpLabel
+        %119 = OpUGreaterThanEqual %bool %88 %uint_4
+               OpSelectionMerge %121 None
+               OpBranchConditional %119 %122 %121
+        %122 = OpLabel
+               OpBranch %87
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_Outer %76 %88
+        %125 = OpAccessChain %_ptr_Function_Outer_std140 %74 %88
+        %127 = OpLoad %Outer_std140 %125 None
+        %128 = OpFunctionCall %Outer %tint_convert_Outer %127
+               OpStore %123 %128 None
+               OpBranch %85
+         %85 = OpLabel
+         %89 = OpIAdd %uint %88 %uint_1
+               OpBranch %86
+         %87 = OpLabel
+        %l_a = OpLoad %_arr_Outer_uint_4 %76 None
+         %91 = OpLoad %Outer_std140_tint_explicit_layout %38 None
+         %92 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %91
+      %l_a_i = OpFunctionCall %Outer %tint_convert_Outer %92
+         %96 = OpLoad %_arr_Inner_std140_uint_4 %40 None
+         %97 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %96
+               OpStore %99 %97
                OpBranch %104
         %104 = OpLabel
-        %106 = OpPhi %uint %uint_0 %101 %107 %103
-               OpLoopMerge %105 %103 None
-               OpBranch %102
-        %102 = OpLabel
-        %126 = OpUGreaterThanEqual %bool %106 %uint_4
-               OpSelectionMerge %127 None
-               OpBranchConditional %126 %128 %127
-        %128 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %109 = OpPhi %uint %uint_0 %104 %110 %106
+               OpLoopMerge %108 %106 None
                OpBranch %105
-        %127 = OpLabel
-        %129 = OpAccessChain %_ptr_Function_Inner %98 %106
-        %131 = OpAccessChain %_ptr_Function_Inner_std140 %96 %106
-        %133 = OpLoad %Inner_std140 %131 None
-        %134 = OpFunctionCall %Inner %tint_convert_Inner %133
-               OpStore %129 %134 None
-               OpBranch %103
-        %103 = OpLabel
-        %107 = OpIAdd %uint %106 %uint_1
-               OpBranch %104
         %105 = OpLabel
-    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %98 None
-        %109 = OpLoad %Inner_std140 %42 None
-  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %109
-        %112 = OpFunctionCall %int %i
-        %113 = OpBitcast %uint %112
-        %114 = OpExtInst %uint %33 UMin %113 %uint_3
-%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %114
+        %129 = OpUGreaterThanEqual %bool %109 %uint_4
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+               OpBranch %108
+        %130 = OpLabel
+        %132 = OpAccessChain %_ptr_Function_Inner %101 %109
+        %134 = OpAccessChain %_ptr_Function_Inner_std140 %99 %109
+        %136 = OpLoad %Inner_std140 %134 None
+        %137 = OpFunctionCall %Inner %tint_convert_Inner %136
+               OpStore %132 %137 None
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpIAdd %uint %109 %uint_1
+               OpBranch %107
+        %108 = OpLabel
+    %l_a_i_a = OpLoad %_arr_Inner_uint_4 %101 None
+        %112 = OpLoad %Inner_std140 %45 None
+  %l_a_i_a_i = OpFunctionCall %Inner %tint_convert_Inner %112
+        %115 = OpFunctionCall %int %i
+        %116 = OpBitcast %uint %115
+        %117 = OpExtInst %uint %36 UMin %116 %uint_3
+%l_a_i_a_i_m_i_i = OpVectorExtractDynamic %half %l_a_i_a_i_m_i %117
                OpReturn
                OpFunctionEnd
-%tint_convert_Inner = OpFunction %Inner None %136
+%tint_convert_Inner = OpFunction %Inner None %139
  %tint_input = OpFunctionParameter %Inner_std140
-        %137 = OpLabel
-        %138 = OpCompositeExtract %v4half %tint_input 0
-        %139 = OpCompositeExtract %v4half %tint_input 1
-        %140 = OpCompositeExtract %v4half %tint_input 2
-        %141 = OpCompositeExtract %v4half %tint_input 3
-        %142 = OpCompositeConstruct %mat4v4half %138 %139 %140 %141
-        %143 = OpCompositeConstruct %Inner %142
-               OpReturnValue %143
+        %140 = OpLabel
+        %141 = OpCompositeExtract %v4half %tint_input 0
+        %142 = OpCompositeExtract %v4half %tint_input 1
+        %143 = OpCompositeExtract %v4half %tint_input 2
+        %144 = OpCompositeExtract %v4half %tint_input 3
+        %145 = OpCompositeConstruct %mat4v4half %141 %142 %143 %144
+        %146 = OpCompositeConstruct %Inner %145
+               OpReturnValue %146
                OpFunctionEnd
-%tint_convert_Outer = OpFunction %Outer None %145
+%tint_convert_Outer = OpFunction %Outer None %148
 %tint_input_0 = OpFunctionParameter %Outer_std140
-        %146 = OpLabel
-        %148 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
-        %149 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %100
-        %147 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
-               OpStore %148 %147
-               OpBranch %150
-        %150 = OpLabel
+        %149 = OpLabel
+        %151 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function
+        %152 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %103
+        %150 = OpCompositeExtract %_arr_Inner_std140_uint_4_0 %tint_input_0 0
+               OpStore %151 %150
                OpBranch %153
         %153 = OpLabel
-        %155 = OpPhi %uint %uint_0 %150 %156 %152
-               OpLoopMerge %154 %152 None
-               OpBranch %151
-        %151 = OpLabel
-        %159 = OpUGreaterThanEqual %bool %155 %uint_4
-               OpSelectionMerge %160 None
-               OpBranchConditional %159 %161 %160
-        %161 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %158 = OpPhi %uint %uint_0 %153 %159 %155
+               OpLoopMerge %157 %155 None
                OpBranch %154
-        %160 = OpLabel
-        %162 = OpAccessChain %_ptr_Function_Inner %149 %155
-        %163 = OpAccessChain %_ptr_Function_Inner_std140 %148 %155
-        %164 = OpLoad %Inner_std140 %163 None
-        %165 = OpFunctionCall %Inner %tint_convert_Inner %164
-               OpStore %162 %165 None
-               OpBranch %152
-        %152 = OpLabel
-        %156 = OpIAdd %uint %155 %uint_1
-               OpBranch %153
         %154 = OpLabel
-        %157 = OpLoad %_arr_Inner_uint_4 %149 None
-        %158 = OpCompositeConstruct %Outer %157
-               OpReturnValue %158
+        %162 = OpUGreaterThanEqual %bool %158 %uint_4
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+               OpBranch %157
+        %163 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_Inner %152 %158
+        %166 = OpAccessChain %_ptr_Function_Inner_std140 %151 %158
+        %167 = OpLoad %Inner_std140 %166 None
+        %168 = OpFunctionCall %Inner %tint_convert_Inner %167
+               OpStore %165 %168 None
+               OpBranch %155
+        %155 = OpLabel
+        %159 = OpIAdd %uint %158 %uint_1
+               OpBranch %156
+        %157 = OpLabel
+        %160 = OpLoad %_arr_Inner_uint_4 %152 None
+        %161 = OpCompositeConstruct %Outer %160
+               OpReturnValue %161
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %167
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_std140_uint_4_0 None %170
 %tint_source = OpFunctionParameter %_arr_Inner_std140_uint_4
-        %168 = OpLabel
-        %169 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
-        %171 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %172
-               OpStore %169 %tint_source
-               OpBranch %173
-        %173 = OpLabel
+        %171 = OpLabel
+        %172 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function
+        %174 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4_0 Function %175
+               OpStore %172 %tint_source
                OpBranch %176
         %176 = OpLabel
-        %178 = OpPhi %uint %uint_0 %173 %179 %175
-               OpLoopMerge %177 %175 None
-               OpBranch %174
-        %174 = OpLabel
-        %181 = OpUGreaterThanEqual %bool %178 %uint_4
-               OpSelectionMerge %182 None
-               OpBranchConditional %181 %183 %182
-        %183 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %181 = OpPhi %uint %uint_0 %176 %182 %178
+               OpLoopMerge %180 %178 None
                OpBranch %177
-        %182 = OpLabel
-        %184 = OpAccessChain %_ptr_Function_Inner_std140 %169 %178
-        %185 = OpLoad %Inner_std140 %184 None
-        %186 = OpAccessChain %_ptr_Function_Inner_std140 %171 %178
-               OpStore %186 %185 None
-               OpBranch %175
-        %175 = OpLabel
-        %179 = OpIAdd %uint %178 %uint_1
-               OpBranch %176
         %177 = OpLabel
-        %180 = OpLoad %_arr_Inner_std140_uint_4_0 %171 None
-               OpReturnValue %180
+        %184 = OpUGreaterThanEqual %bool %181 %uint_4
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+               OpBranch %180
+        %185 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_Inner_std140 %172 %181
+        %188 = OpLoad %Inner_std140 %187 None
+        %189 = OpAccessChain %_ptr_Function_Inner_std140 %174 %181
+               OpStore %189 %188 None
+               OpBranch %178
+        %178 = OpLabel
+        %182 = OpIAdd %uint %181 %uint_1
+               OpBranch %179
+        %180 = OpLabel
+        %183 = OpLoad %_arr_Inner_std140_uint_4_0 %174 None
+               OpReturnValue %183
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %188
+%tint_convert_explicit_layout_0 = OpFunction %Outer_std140 None %191
 %tint_source_0 = OpFunctionParameter %Outer_std140_tint_explicit_layout
-        %189 = OpLabel
-        %190 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
-        %191 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %190
-        %192 = OpCompositeConstruct %Outer_std140 %191
-               OpReturnValue %192
+        %192 = OpLabel
+        %193 = OpCompositeExtract %_arr_Inner_std140_uint_4 %tint_source_0 0
+        %194 = OpFunctionCall %_arr_Inner_std140_uint_4_0 %tint_convert_explicit_layout %193
+        %195 = OpCompositeConstruct %Outer_std140 %194
+               OpReturnValue %195
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %194
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_std140_uint_4 None %197
 %tint_source_1 = OpFunctionParameter %_arr_Outer_std140_tint_explicit_layout_uint_4
-        %195 = OpLabel
-        %196 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
-        %198 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %199
-               OpStore %196 %tint_source_1
-               OpBranch %200
-        %200 = OpLabel
+        %198 = OpLabel
+        %199 = OpVariable %_ptr_Function__arr_Outer_std140_tint_explicit_layout_uint_4 Function
+        %201 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %202
+               OpStore %199 %tint_source_1
                OpBranch %203
         %203 = OpLabel
-        %205 = OpPhi %uint %uint_0 %200 %206 %202
-               OpLoopMerge %204 %202 None
-               OpBranch %201
-        %201 = OpLabel
-        %208 = OpUGreaterThanEqual %bool %205 %uint_4
-               OpSelectionMerge %209 None
-               OpBranchConditional %208 %210 %209
-        %210 = OpLabel
+               OpBranch %206
+        %206 = OpLabel
+        %208 = OpPhi %uint %uint_0 %203 %209 %205
+               OpLoopMerge %207 %205 None
                OpBranch %204
-        %209 = OpLabel
-        %211 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %196 %205
-        %213 = OpLoad %Outer_std140_tint_explicit_layout %211 None
-        %214 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %213
-        %215 = OpAccessChain %_ptr_Function_Outer_std140 %198 %205
-               OpStore %215 %214 None
-               OpBranch %202
-        %202 = OpLabel
-        %206 = OpIAdd %uint %205 %uint_1
-               OpBranch %203
         %204 = OpLabel
-        %207 = OpLoad %_arr_Outer_std140_uint_4 %198 None
-               OpReturnValue %207
+        %211 = OpUGreaterThanEqual %bool %208 %uint_4
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %212
+        %213 = OpLabel
+               OpBranch %207
+        %212 = OpLabel
+        %214 = OpAccessChain %_ptr_Function_Outer_std140_tint_explicit_layout %199 %208
+        %216 = OpLoad %Outer_std140_tint_explicit_layout %214 None
+        %217 = OpFunctionCall %Outer_std140 %tint_convert_explicit_layout_0 %216
+        %218 = OpAccessChain %_ptr_Function_Outer_std140 %201 %208
+               OpStore %218 %217 None
+               OpBranch %205
+        %205 = OpLabel
+        %209 = OpIAdd %uint %208 %uint_1
+               OpBranch %206
+        %207 = OpLabel
+        %210 = OpLoad %_arr_Outer_std140_uint_4 %201 None
+               OpReturnValue %210
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 56303fa..8b0b80c 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -15,19 +15,20 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_1 = min(uint(i()), 3u);
   uint v_2 = min(uint(i()), 3u);
   uint v_3 = min(uint(i()), 3u);
+  uint v_4 = min(uint(i()), 3u);
   Outer l_a[4] = v.inner;
-  Outer l_a_i = v.inner[v_1];
-  Inner l_a_i_a[4] = v.inner[v_1].a;
-  Inner l_a_i_a_i = v.inner[v_1].a[v_2];
-  mat4 l_a_i_a_i_m = v.inner[v_1].a[v_2].m;
-  vec4 l_a_i_a_i_m_i = v.inner[v_1].a[v_2].m[v_3];
-  float l_a_i_a_i_m_i_i = v.inner[v_1].a[v_2].m[v_3][min(uint(i()), 3u)];
+  Outer l_a_i = v.inner[v_2];
+  Inner l_a_i_a[4] = v.inner[v_2].a;
+  Inner l_a_i_a_i = v.inner[v_2].a[v_3];
+  mat4 l_a_i_a_i_m = v.inner[v_2].a[v_3].m;
+  vec4 l_a_i_a_i_m_i = v.inner[v_2].a[v_3].m[v_4];
+  float l_a_i_a_i_m_i_i = v.inner[v_2].a[v_3].m[v_4][min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index a2759c5..9894f56 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 129
+; Bound: 132
 ; Schema: 0
                OpCapability Shader
-         %34 = OpExtInstImport "GLSL.std.450"
+         %37 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -68,7 +68,7 @@
          %18 = OpTypeFunction %int
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
 %_ptr_Uniform__arr_Outer_tint_explicit_layout_uint_4 = OpTypePointer Uniform %_arr_Outer_tint_explicit_layout_uint_4
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
@@ -81,131 +81,134 @@
       %Outer = OpTypeStruct %_arr_Inner_uint_4_0
 %_arr_Outer_uint_4 = OpTypeArray %Outer %uint_4
 %_ptr_Uniform_float = OpTypePointer Uniform %float
-         %74 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
+         %77 = OpTypeFunction %_arr_Inner_uint_4_0 %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4 = OpTypePointer Function %_arr_Inner_uint_4
 %_ptr_Function__arr_Inner_uint_4_0 = OpTypePointer Function %_arr_Inner_uint_4_0
-         %80 = OpConstantNull %_arr_Inner_uint_4_0
+         %83 = OpConstantNull %_arr_Inner_uint_4_0
        %bool = OpTypeBool
 %_ptr_Function_Inner = OpTypePointer Function %Inner
      %uint_1 = OpConstant %uint 1
-         %99 = OpTypeFunction %Outer %Outer_tint_explicit_layout
-        %105 = OpTypeFunction %_arr_Outer_uint_4 %_arr_Outer_tint_explicit_layout_uint_4
+        %102 = OpTypeFunction %Outer %Outer_tint_explicit_layout
+        %108 = OpTypeFunction %_arr_Outer_uint_4 %_arr_Outer_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 = OpTypePointer Function %_arr_Outer_tint_explicit_layout_uint_4
 %_ptr_Function__arr_Outer_uint_4 = OpTypePointer Function %_arr_Outer_uint_4
-        %111 = OpConstantNull %_arr_Outer_uint_4
+        %114 = OpConstantNull %_arr_Outer_uint_4
 %_ptr_Function_Outer_tint_explicit_layout = OpTypePointer Function %Outer_tint_explicit_layout
 %_ptr_Function_Outer = OpTypePointer Function %Outer
           %i = OpFunction %int None %18
          %19 = OpLabel
          %20 = OpLoad %int %counter None
-         %21 = OpIAdd %int %20 %int_1
-               OpStore %counter %21 None
-         %23 = OpLoad %int %counter None
-               OpReturnValue %23
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_1
+         %24 = OpIAdd %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %counter %25 None
+         %26 = OpLoad %int %counter None
+               OpReturnValue %26
                OpFunctionEnd
-          %f = OpFunction %void None %26
-         %27 = OpLabel
+          %f = OpFunction %void None %29
+         %30 = OpLabel
         %p_a = OpAccessChain %_ptr_Uniform__arr_Outer_tint_explicit_layout_uint_4 %1 %uint_0
-         %31 = OpFunctionCall %int %i
-         %32 = OpBitcast %uint %31
-         %33 = OpExtInst %uint %34 UMin %32 %uint_3
-      %p_a_i = OpAccessChain %_ptr_Uniform_Outer_tint_explicit_layout %p_a %33
+         %34 = OpFunctionCall %int %i
+         %35 = OpBitcast %uint %34
+         %36 = OpExtInst %uint %37 UMin %35 %uint_3
+      %p_a_i = OpAccessChain %_ptr_Uniform_Outer_tint_explicit_layout %p_a %36
     %p_a_i_a = OpAccessChain %_ptr_Uniform__arr_Inner_uint_4 %p_a_i %uint_0
-         %40 = OpFunctionCall %int %i
-         %41 = OpBitcast %uint %40
-         %42 = OpExtInst %uint %34 UMin %41 %uint_3
-  %p_a_i_a_i = OpAccessChain %_ptr_Uniform_Inner %p_a_i_a %42
+         %43 = OpFunctionCall %int %i
+         %44 = OpBitcast %uint %43
+         %45 = OpExtInst %uint %37 UMin %44 %uint_3
+  %p_a_i_a_i = OpAccessChain %_ptr_Uniform_Inner %p_a_i_a %45
 %p_a_i_a_i_m = OpAccessChain %_ptr_Uniform_mat4v4float %p_a_i_a_i %uint_0
-         %47 = OpFunctionCall %int %i
-         %48 = OpBitcast %uint %47
-         %49 = OpExtInst %uint %34 UMin %48 %uint_3
-%p_a_i_a_i_m_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i_a_i_m %49
-         %52 = OpLoad %_arr_Outer_tint_explicit_layout_uint_4 %p_a None
-        %l_a = OpFunctionCall %_arr_Outer_uint_4 %tint_convert_explicit_layout_1 %52
-         %58 = OpLoad %Outer_tint_explicit_layout %p_a_i None
-      %l_a_i = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %58
-         %61 = OpLoad %_arr_Inner_uint_4 %p_a_i_a None
-    %l_a_i_a = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %61
+         %50 = OpFunctionCall %int %i
+         %51 = OpBitcast %uint %50
+         %52 = OpExtInst %uint %37 UMin %51 %uint_3
+%p_a_i_a_i_m_i = OpAccessChain %_ptr_Uniform_v4float %p_a_i_a_i_m %52
+         %55 = OpLoad %_arr_Outer_tint_explicit_layout_uint_4 %p_a None
+        %l_a = OpFunctionCall %_arr_Outer_uint_4 %tint_convert_explicit_layout_1 %55
+         %61 = OpLoad %Outer_tint_explicit_layout %p_a_i None
+      %l_a_i = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %61
+         %64 = OpLoad %_arr_Inner_uint_4 %p_a_i_a None
+    %l_a_i_a = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %64
   %l_a_i_a_i = OpLoad %Inner %p_a_i_a_i None
 %l_a_i_a_i_m = OpLoad %mat4v4float %p_a_i_a_i_m None
 %l_a_i_a_i_m_i = OpLoad %v4float %p_a_i_a_i_m_i None
-         %67 = OpFunctionCall %int %i
-         %68 = OpBitcast %uint %67
-         %69 = OpExtInst %uint %34 UMin %68 %uint_3
-         %70 = OpAccessChain %_ptr_Uniform_float %p_a_i_a_i_m_i %69
-%l_a_i_a_i_m_i_i = OpLoad %float %70 None
+         %70 = OpFunctionCall %int %i
+         %71 = OpBitcast %uint %70
+         %72 = OpExtInst %uint %37 UMin %71 %uint_3
+         %73 = OpAccessChain %_ptr_Uniform_float %p_a_i_a_i_m_i %72
+%l_a_i_a_i_m_i_i = OpLoad %float %73 None
                OpReturn
                OpFunctionEnd
-%tint_convert_explicit_layout = OpFunction %_arr_Inner_uint_4_0 None %74
+%tint_convert_explicit_layout = OpFunction %_arr_Inner_uint_4_0 None %77
 %tint_source = OpFunctionParameter %_arr_Inner_uint_4
-         %75 = OpLabel
-         %76 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
-         %78 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %80
-               OpStore %76 %tint_source
-               OpBranch %81
-         %81 = OpLabel
+         %78 = OpLabel
+         %79 = OpVariable %_ptr_Function__arr_Inner_uint_4 Function
+         %81 = OpVariable %_ptr_Function__arr_Inner_uint_4_0 Function %83
+               OpStore %79 %tint_source
                OpBranch %84
          %84 = OpLabel
-         %86 = OpPhi %uint %uint_0 %81 %87 %83
-               OpLoopMerge %85 %83 None
-               OpBranch %82
-         %82 = OpLabel
-         %89 = OpUGreaterThanEqual %bool %86 %uint_4
-               OpSelectionMerge %91 None
-               OpBranchConditional %89 %92 %91
-         %92 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+         %89 = OpPhi %uint %uint_0 %84 %90 %86
+               OpLoopMerge %88 %86 None
                OpBranch %85
-         %91 = OpLabel
-         %93 = OpAccessChain %_ptr_Function_Inner %76 %86
-         %95 = OpLoad %Inner %93 None
-         %96 = OpAccessChain %_ptr_Function_Inner %78 %86
-               OpStore %96 %95 None
-               OpBranch %83
-         %83 = OpLabel
-         %87 = OpIAdd %uint %86 %uint_1
-               OpBranch %84
          %85 = OpLabel
-         %88 = OpLoad %_arr_Inner_uint_4_0 %78 None
-               OpReturnValue %88
+         %92 = OpUGreaterThanEqual %bool %89 %uint_4
+               OpSelectionMerge %94 None
+               OpBranchConditional %92 %95 %94
+         %95 = OpLabel
+               OpBranch %88
+         %94 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_Inner %79 %89
+         %98 = OpLoad %Inner %96 None
+         %99 = OpAccessChain %_ptr_Function_Inner %81 %89
+               OpStore %99 %98 None
+               OpBranch %86
+         %86 = OpLabel
+         %90 = OpIAdd %uint %89 %uint_1
+               OpBranch %87
+         %88 = OpLabel
+         %91 = OpLoad %_arr_Inner_uint_4_0 %81 None
+               OpReturnValue %91
                OpFunctionEnd
-%tint_convert_explicit_layout_0 = OpFunction %Outer None %99
+%tint_convert_explicit_layout_0 = OpFunction %Outer None %102
 %tint_source_0 = OpFunctionParameter %Outer_tint_explicit_layout
-        %100 = OpLabel
-        %101 = OpCompositeExtract %_arr_Inner_uint_4 %tint_source_0 0
-        %102 = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %101
-        %103 = OpCompositeConstruct %Outer %102
-               OpReturnValue %103
+        %103 = OpLabel
+        %104 = OpCompositeExtract %_arr_Inner_uint_4 %tint_source_0 0
+        %105 = OpFunctionCall %_arr_Inner_uint_4_0 %tint_convert_explicit_layout %104
+        %106 = OpCompositeConstruct %Outer %105
+               OpReturnValue %106
                OpFunctionEnd
-%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_uint_4 None %105
+%tint_convert_explicit_layout_1 = OpFunction %_arr_Outer_uint_4 None %108
 %tint_source_1 = OpFunctionParameter %_arr_Outer_tint_explicit_layout_uint_4
-        %106 = OpLabel
-        %107 = OpVariable %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 Function
-        %109 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %111
-               OpStore %107 %tint_source_1
-               OpBranch %112
-        %112 = OpLabel
+        %109 = OpLabel
+        %110 = OpVariable %_ptr_Function__arr_Outer_tint_explicit_layout_uint_4 Function
+        %112 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %114
+               OpStore %110 %tint_source_1
                OpBranch %115
         %115 = OpLabel
-        %117 = OpPhi %uint %uint_0 %112 %118 %114
-               OpLoopMerge %116 %114 None
-               OpBranch %113
-        %113 = OpLabel
-        %120 = OpUGreaterThanEqual %bool %117 %uint_4
-               OpSelectionMerge %121 None
-               OpBranchConditional %120 %122 %121
-        %122 = OpLabel
+               OpBranch %118
+        %118 = OpLabel
+        %120 = OpPhi %uint %uint_0 %115 %121 %117
+               OpLoopMerge %119 %117 None
                OpBranch %116
-        %121 = OpLabel
-        %123 = OpAccessChain %_ptr_Function_Outer_tint_explicit_layout %107 %117
-        %125 = OpLoad %Outer_tint_explicit_layout %123 None
-        %126 = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %125
-        %127 = OpAccessChain %_ptr_Function_Outer %109 %117
-               OpStore %127 %126 None
-               OpBranch %114
-        %114 = OpLabel
-        %118 = OpIAdd %uint %117 %uint_1
-               OpBranch %115
         %116 = OpLabel
-        %119 = OpLoad %_arr_Outer_uint_4 %109 None
-               OpReturnValue %119
+        %123 = OpUGreaterThanEqual %bool %120 %uint_4
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %124
+        %125 = OpLabel
+               OpBranch %119
+        %124 = OpLabel
+        %126 = OpAccessChain %_ptr_Function_Outer_tint_explicit_layout %110 %120
+        %128 = OpLoad %Outer_tint_explicit_layout %126 None
+        %129 = OpFunctionCall %Outer %tint_convert_explicit_layout_0 %128
+        %130 = OpAccessChain %_ptr_Function_Outer %112 %120
+               OpStore %130 %129 None
+               OpBranch %117
+        %117 = OpLabel
+        %121 = OpIAdd %uint %120 %uint_1
+               OpBranch %118
+        %119 = OpLabel
+        %122 = OpLoad %_arr_Outer_uint_4 %112 None
+               OpReturnValue %122
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index c3370d2..6fdec26 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -8,12 +8,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat2 v_1 = f16mat2(v.inner_col0, v.inner_col1);
-  f16mat2 l_m = v_1;
-  f16vec2 l_m_i = v_1[min(uint(i()), 1u)];
+  f16mat2 v_2 = f16mat2(v.inner_col0, v.inner_col1);
+  f16mat2 l_m = v_2;
+  f16vec2 l_m_i = v_2[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index d709a24..e8f38cc 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 43
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %36 = OpExtInstImport "GLSL.std.450"
+         %39 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -35,11 +35,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v2half = OpTypePointer Uniform %v2half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
  %mat2v2half = OpTypeMatrix %v2half 2
@@ -48,24 +48,27 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %31 = OpVariable %_ptr_Function_mat2v2half Function
-         %21 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_0
-         %25 = OpLoad %v2half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_1
-         %28 = OpLoad %v2half %26 None
-        %l_m = OpCompositeConstruct %mat2v2half %25 %28
-               OpStore %31 %l_m
-         %33 = OpFunctionCall %int %i
-         %34 = OpBitcast %uint %33
-         %35 = OpExtInst %uint %36 UMin %34 %uint_1
-         %37 = OpAccessChain %_ptr_Function_v2half %31 %35
-      %l_m_i = OpLoad %v2half %37 None
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %34 = OpVariable %_ptr_Function_mat2v2half Function
+         %25 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_0
+         %28 = OpLoad %v2half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_1
+         %31 = OpLoad %v2half %29 None
+        %l_m = OpCompositeConstruct %mat2v2half %28 %31
+               OpStore %34 %l_m
+         %36 = OpFunctionCall %int %i
+         %37 = OpBitcast %uint %36
+         %38 = OpExtInst %uint %39 UMin %37 %uint_1
+         %40 = OpAccessChain %_ptr_Function_v2half %34 %38
+      %l_m_i = OpLoad %v2half %40 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 4978a8e..87d7a7d3 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -7,12 +7,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  mat2 v_1 = mat2(v.inner_col0, v.inner_col1);
-  mat2 l_m = v_1;
-  vec2 l_m_i = v_1[min(uint(i()), 1u)];
+  mat2 v_2 = mat2(v.inner_col0, v.inner_col1);
+  mat2 l_m = v_2;
+  vec2 l_m_i = v_2[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 15c091c..34d2034 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 43
 ; Schema: 0
                OpCapability Shader
-         %36 = OpExtInstImport "GLSL.std.450"
+         %39 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -32,11 +32,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
 %mat2v2float = OpTypeMatrix %v2float 2
@@ -45,24 +45,27 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %31 = OpVariable %_ptr_Function_mat2v2float Function
-         %21 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0
-         %25 = OpLoad %v2float %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_1
-         %28 = OpLoad %v2float %26 None
-        %l_m = OpCompositeConstruct %mat2v2float %25 %28
-               OpStore %31 %l_m
-         %33 = OpFunctionCall %int %i
-         %34 = OpBitcast %uint %33
-         %35 = OpExtInst %uint %36 UMin %34 %uint_1
-         %37 = OpAccessChain %_ptr_Function_v2float %31 %35
-      %l_m_i = OpLoad %v2float %37 None
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %34 = OpVariable %_ptr_Function_mat2v2float Function
+         %25 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0
+         %28 = OpLoad %v2float %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_1
+         %31 = OpLoad %v2float %29 None
+        %l_m = OpCompositeConstruct %mat2v2float %28 %31
+               OpStore %34 %l_m
+         %36 = OpFunctionCall %int %i
+         %37 = OpBitcast %uint %36
+         %38 = OpExtInst %uint %39 UMin %37 %uint_1
+         %40 = OpAccessChain %_ptr_Function_v2float %34 %38
+      %l_m_i = OpLoad %v2float %40 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 006d78e..846838d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -8,12 +8,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat2x3 v_1 = f16mat2x3(v.inner_col0, v.inner_col1);
-  f16mat2x3 l_m = v_1;
-  f16vec3 l_m_i = v_1[min(uint(i()), 1u)];
+  f16mat2x3 v_2 = f16mat2x3(v.inner_col0, v.inner_col1);
+  f16mat2x3 l_m = v_2;
+  f16vec3 l_m_i = v_2[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 539e853..2f5f361 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 43
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %36 = OpExtInstImport "GLSL.std.450"
+         %39 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -35,11 +35,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v3half = OpTypePointer Uniform %v3half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
  %mat2v3half = OpTypeMatrix %v3half 2
@@ -48,24 +48,27 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %31 = OpVariable %_ptr_Function_mat2v3half Function
-         %21 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_0
-         %25 = OpLoad %v3half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_1
-         %28 = OpLoad %v3half %26 None
-        %l_m = OpCompositeConstruct %mat2v3half %25 %28
-               OpStore %31 %l_m
-         %33 = OpFunctionCall %int %i
-         %34 = OpBitcast %uint %33
-         %35 = OpExtInst %uint %36 UMin %34 %uint_1
-         %37 = OpAccessChain %_ptr_Function_v3half %31 %35
-      %l_m_i = OpLoad %v3half %37 None
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %34 = OpVariable %_ptr_Function_mat2v3half Function
+         %25 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_0
+         %28 = OpLoad %v3half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_1
+         %31 = OpLoad %v3half %29 None
+        %l_m = OpCompositeConstruct %mat2v3half %28 %31
+               OpStore %34 %l_m
+         %36 = OpFunctionCall %int %i
+         %37 = OpBitcast %uint %36
+         %38 = OpExtInst %uint %39 UMin %37 %uint_1
+         %40 = OpAccessChain %_ptr_Function_v3half %34 %38
+      %l_m_i = OpLoad %v3half %40 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index bc80aa9..d45cdec 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -8,12 +8,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  mat2x3 v_1 = mat2x3(v.inner_col0, v.inner_col1);
-  mat2x3 l_m = v_1;
-  vec3 l_m_i = v_1[min(uint(i()), 1u)];
+  mat2x3 v_2 = mat2x3(v.inner_col0, v.inner_col1);
+  mat2x3 l_m = v_2;
+  vec3 l_m_i = v_2[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index a050239..6745710 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 43
 ; Schema: 0
                OpCapability Shader
-         %36 = OpExtInstImport "GLSL.std.450"
+         %39 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -32,11 +32,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
 %mat2v3float = OpTypeMatrix %v3float 2
@@ -45,24 +45,27 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %31 = OpVariable %_ptr_Function_mat2v3float Function
-         %21 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0
-         %25 = OpLoad %v3float %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_1
-         %28 = OpLoad %v3float %26 None
-        %l_m = OpCompositeConstruct %mat2v3float %25 %28
-               OpStore %31 %l_m
-         %33 = OpFunctionCall %int %i
-         %34 = OpBitcast %uint %33
-         %35 = OpExtInst %uint %36 UMin %34 %uint_1
-         %37 = OpAccessChain %_ptr_Function_v3float %31 %35
-      %l_m_i = OpLoad %v3float %37 None
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %34 = OpVariable %_ptr_Function_mat2v3float Function
+         %25 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0
+         %28 = OpLoad %v3float %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_1
+         %31 = OpLoad %v3float %29 None
+        %l_m = OpCompositeConstruct %mat2v3float %28 %31
+               OpStore %34 %l_m
+         %36 = OpFunctionCall %int %i
+         %37 = OpBitcast %uint %36
+         %38 = OpExtInst %uint %39 UMin %37 %uint_1
+         %40 = OpAccessChain %_ptr_Function_v3float %34 %38
+      %l_m_i = OpLoad %v3float %40 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 74224e3..a0664ea 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -8,12 +8,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat2x4 v_1 = f16mat2x4(v.inner_col0, v.inner_col1);
-  f16mat2x4 l_m = v_1;
-  f16vec4 l_m_i = v_1[min(uint(i()), 1u)];
+  f16mat2x4 v_2 = f16mat2x4(v.inner_col0, v.inner_col1);
+  f16mat2x4 l_m = v_2;
+  f16vec4 l_m_i = v_2[min(uint(i()), 1u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 6899370..2355b65 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 43
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %36 = OpExtInstImport "GLSL.std.450"
+         %39 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -35,11 +35,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v4half = OpTypePointer Uniform %v4half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
  %mat2v4half = OpTypeMatrix %v4half 2
@@ -48,24 +48,27 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %31 = OpVariable %_ptr_Function_mat2v4half Function
-         %21 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_0
-         %25 = OpLoad %v4half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_1
-         %28 = OpLoad %v4half %26 None
-        %l_m = OpCompositeConstruct %mat2v4half %25 %28
-               OpStore %31 %l_m
-         %33 = OpFunctionCall %int %i
-         %34 = OpBitcast %uint %33
-         %35 = OpExtInst %uint %36 UMin %34 %uint_1
-         %37 = OpAccessChain %_ptr_Function_v4half %31 %35
-      %l_m_i = OpLoad %v4half %37 None
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %34 = OpVariable %_ptr_Function_mat2v4half Function
+         %25 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_0
+         %28 = OpLoad %v4half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_1
+         %31 = OpLoad %v4half %29 None
+        %l_m = OpCompositeConstruct %mat2v4half %28 %31
+               OpStore %34 %l_m
+         %36 = OpFunctionCall %int %i
+         %37 = OpBitcast %uint %36
+         %38 = OpExtInst %uint %39 UMin %37 %uint_1
+         %40 = OpAccessChain %_ptr_Function_v4half %34 %38
+      %l_m_i = OpLoad %v4half %40 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 566f493..cafbe18 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -6,12 +6,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_1 = min(uint(i()), 1u);
+  uint v_2 = min(uint(i()), 1u);
   mat2x4 l_m = v.inner;
-  vec4 l_m_i = v.inner[v_1];
+  vec4 l_m_i = v.inner[v_2];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 885aeb1..2332a91 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 38
 ; Schema: 0
                OpCapability Shader
-         %29 = OpExtInstImport "GLSL.std.450"
+         %32 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -35,29 +35,32 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %12 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %20 = OpTypeFunction %void
+         %24 = OpTypeFunction %void
 %_ptr_Uniform_mat2v4float = OpTypePointer Uniform %mat2v4float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
 %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
           %i = OpFunction %int None %12
          %13 = OpLabel
          %14 = OpLoad %int %counter None
-         %15 = OpIAdd %int %14 %int_1
-               OpStore %counter %15 None
-         %17 = OpLoad %int %counter None
-               OpReturnValue %17
+         %16 = OpBitcast %uint %14
+         %17 = OpBitcast %uint %int_1
+         %19 = OpIAdd %uint %16 %17
+         %20 = OpBitcast %int %19
+               OpStore %counter %20 None
+         %21 = OpLoad %int %counter None
+               OpReturnValue %21
                OpFunctionEnd
-          %f = OpFunction %void None %20
-         %21 = OpLabel
+          %f = OpFunction %void None %24
+         %25 = OpLabel
         %p_m = OpAccessChain %_ptr_Uniform_mat2v4float %1 %uint_0
-         %26 = OpFunctionCall %int %i
-         %27 = OpBitcast %uint %26
-         %28 = OpExtInst %uint %29 UMin %27 %uint_1
-      %p_m_i = OpAccessChain %_ptr_Uniform_v4float %p_m %28
+         %29 = OpFunctionCall %int %i
+         %30 = OpBitcast %uint %29
+         %31 = OpExtInst %uint %32 UMin %30 %uint_1
+      %p_m_i = OpAccessChain %_ptr_Uniform_v4float %p_m %31
         %l_m = OpLoad %mat2v4float %p_m None
       %l_m_i = OpLoad %v4float %p_m_i None
                OpReturn
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index b11ca7d..3b7392b 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -9,12 +9,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat3x2 v_1 = f16mat3x2(v.inner_col0, v.inner_col1, v.inner_col2);
-  f16mat3x2 l_m = v_1;
-  f16vec2 l_m_i = v_1[min(uint(i()), 2u)];
+  f16mat3x2 v_2 = f16mat3x2(v.inner_col0, v.inner_col1, v.inner_col2);
+  f16mat3x2 l_m = v_2;
+  f16vec2 l_m_i = v_2[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 53588e8..7761bc5 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 43
+; Bound: 46
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %39 = OpExtInstImport "GLSL.std.450"
+         %42 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -37,11 +37,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v2half = OpTypePointer Uniform %v2half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -51,26 +51,29 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %34 = OpVariable %_ptr_Function_mat3v2half Function
-         %21 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_0
-         %25 = OpLoad %v2half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_1
-         %28 = OpLoad %v2half %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %37 = OpVariable %_ptr_Function_mat3v2half Function
+         %25 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_0
+         %28 = OpLoad %v2half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_1
          %31 = OpLoad %v2half %29 None
-        %l_m = OpCompositeConstruct %mat3v2half %25 %28 %31
-               OpStore %34 %l_m
-         %36 = OpFunctionCall %int %i
-         %37 = OpBitcast %uint %36
-         %38 = OpExtInst %uint %39 UMin %37 %uint_2
-         %40 = OpAccessChain %_ptr_Function_v2half %34 %38
-      %l_m_i = OpLoad %v2half %40 None
+         %32 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_2
+         %34 = OpLoad %v2half %32 None
+        %l_m = OpCompositeConstruct %mat3v2half %28 %31 %34
+               OpStore %37 %l_m
+         %39 = OpFunctionCall %int %i
+         %40 = OpBitcast %uint %39
+         %41 = OpExtInst %uint %42 UMin %40 %uint_2
+         %43 = OpAccessChain %_ptr_Function_v2half %37 %41
+      %l_m_i = OpLoad %v2half %43 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 3a5136e..e9207ee 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -8,12 +8,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  mat3x2 v_1 = mat3x2(v.inner_col0, v.inner_col1, v.inner_col2);
-  mat3x2 l_m = v_1;
-  vec2 l_m_i = v_1[min(uint(i()), 2u)];
+  mat3x2 v_2 = mat3x2(v.inner_col0, v.inner_col1, v.inner_col2);
+  mat3x2 l_m = v_2;
+  vec2 l_m_i = v_2[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index fa1ce06..bfa8645 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 43
+; Bound: 46
 ; Schema: 0
                OpCapability Shader
-         %39 = OpExtInstImport "GLSL.std.450"
+         %42 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -34,11 +34,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -48,26 +48,29 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %34 = OpVariable %_ptr_Function_mat3v2float Function
-         %21 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0
-         %25 = OpLoad %v2float %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_1
-         %28 = OpLoad %v2float %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %37 = OpVariable %_ptr_Function_mat3v2float Function
+         %25 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0
+         %28 = OpLoad %v2float %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_1
          %31 = OpLoad %v2float %29 None
-        %l_m = OpCompositeConstruct %mat3v2float %25 %28 %31
-               OpStore %34 %l_m
-         %36 = OpFunctionCall %int %i
-         %37 = OpBitcast %uint %36
-         %38 = OpExtInst %uint %39 UMin %37 %uint_2
-         %40 = OpAccessChain %_ptr_Function_v2float %34 %38
-      %l_m_i = OpLoad %v2float %40 None
+         %32 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_2
+         %34 = OpLoad %v2float %32 None
+        %l_m = OpCompositeConstruct %mat3v2float %28 %31 %34
+               OpStore %37 %l_m
+         %39 = OpFunctionCall %int %i
+         %40 = OpBitcast %uint %39
+         %41 = OpExtInst %uint %42 UMin %40 %uint_2
+         %43 = OpAccessChain %_ptr_Function_v2float %37 %41
+      %l_m_i = OpLoad %v2float %43 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 164799c..6e5f29f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -9,12 +9,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat3 v_1 = f16mat3(v.inner_col0, v.inner_col1, v.inner_col2);
-  f16mat3 l_m = v_1;
-  f16vec3 l_m_i = v_1[min(uint(i()), 2u)];
+  f16mat3 v_2 = f16mat3(v.inner_col0, v.inner_col1, v.inner_col2);
+  f16mat3 l_m = v_2;
+  f16vec3 l_m_i = v_2[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index e0d08b3..f724f5f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 43
+; Bound: 46
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %39 = OpExtInstImport "GLSL.std.450"
+         %42 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -37,11 +37,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v3half = OpTypePointer Uniform %v3half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -51,26 +51,29 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %34 = OpVariable %_ptr_Function_mat3v3half Function
-         %21 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_0
-         %25 = OpLoad %v3half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_1
-         %28 = OpLoad %v3half %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %37 = OpVariable %_ptr_Function_mat3v3half Function
+         %25 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_0
+         %28 = OpLoad %v3half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_1
          %31 = OpLoad %v3half %29 None
-        %l_m = OpCompositeConstruct %mat3v3half %25 %28 %31
-               OpStore %34 %l_m
-         %36 = OpFunctionCall %int %i
-         %37 = OpBitcast %uint %36
-         %38 = OpExtInst %uint %39 UMin %37 %uint_2
-         %40 = OpAccessChain %_ptr_Function_v3half %34 %38
-      %l_m_i = OpLoad %v3half %40 None
+         %32 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_2
+         %34 = OpLoad %v3half %32 None
+        %l_m = OpCompositeConstruct %mat3v3half %28 %31 %34
+               OpStore %37 %l_m
+         %39 = OpFunctionCall %int %i
+         %40 = OpBitcast %uint %39
+         %41 = OpExtInst %uint %42 UMin %40 %uint_2
+         %43 = OpAccessChain %_ptr_Function_v3half %37 %41
+      %l_m_i = OpLoad %v3half %43 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 554813d..f499167 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -10,12 +10,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  mat3 v_1 = mat3(v.inner_col0, v.inner_col1, v.inner_col2);
-  mat3 l_m = v_1;
-  vec3 l_m_i = v_1[min(uint(i()), 2u)];
+  mat3 v_2 = mat3(v.inner_col0, v.inner_col1, v.inner_col2);
+  mat3 l_m = v_2;
+  vec3 l_m_i = v_2[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 8656d3b..2b3b77c 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 43
+; Bound: 46
 ; Schema: 0
                OpCapability Shader
-         %39 = OpExtInstImport "GLSL.std.450"
+         %42 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -34,11 +34,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -48,26 +48,29 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %34 = OpVariable %_ptr_Function_mat3v3float Function
-         %21 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0
-         %25 = OpLoad %v3float %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_1
-         %28 = OpLoad %v3float %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %37 = OpVariable %_ptr_Function_mat3v3float Function
+         %25 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0
+         %28 = OpLoad %v3float %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_1
          %31 = OpLoad %v3float %29 None
-        %l_m = OpCompositeConstruct %mat3v3float %25 %28 %31
-               OpStore %34 %l_m
-         %36 = OpFunctionCall %int %i
-         %37 = OpBitcast %uint %36
-         %38 = OpExtInst %uint %39 UMin %37 %uint_2
-         %40 = OpAccessChain %_ptr_Function_v3float %34 %38
-      %l_m_i = OpLoad %v3float %40 None
+         %32 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_2
+         %34 = OpLoad %v3float %32 None
+        %l_m = OpCompositeConstruct %mat3v3float %28 %31 %34
+               OpStore %37 %l_m
+         %39 = OpFunctionCall %int %i
+         %40 = OpBitcast %uint %39
+         %41 = OpExtInst %uint %42 UMin %40 %uint_2
+         %43 = OpAccessChain %_ptr_Function_v3float %37 %41
+      %l_m_i = OpLoad %v3float %43 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 985459a..2e0db94 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -9,12 +9,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat3x4 v_1 = f16mat3x4(v.inner_col0, v.inner_col1, v.inner_col2);
-  f16mat3x4 l_m = v_1;
-  f16vec4 l_m_i = v_1[min(uint(i()), 2u)];
+  f16mat3x4 v_2 = f16mat3x4(v.inner_col0, v.inner_col1, v.inner_col2);
+  f16mat3x4 l_m = v_2;
+  f16vec4 l_m_i = v_2[min(uint(i()), 2u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index b746ddc..547475f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 43
+; Bound: 46
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %39 = OpExtInstImport "GLSL.std.450"
+         %42 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -37,11 +37,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v4half = OpTypePointer Uniform %v4half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -51,26 +51,29 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %34 = OpVariable %_ptr_Function_mat3v4half Function
-         %21 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_0
-         %25 = OpLoad %v4half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_1
-         %28 = OpLoad %v4half %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %37 = OpVariable %_ptr_Function_mat3v4half Function
+         %25 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_0
+         %28 = OpLoad %v4half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_1
          %31 = OpLoad %v4half %29 None
-        %l_m = OpCompositeConstruct %mat3v4half %25 %28 %31
-               OpStore %34 %l_m
-         %36 = OpFunctionCall %int %i
-         %37 = OpBitcast %uint %36
-         %38 = OpExtInst %uint %39 UMin %37 %uint_2
-         %40 = OpAccessChain %_ptr_Function_v4half %34 %38
-      %l_m_i = OpLoad %v4half %40 None
+         %32 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_2
+         %34 = OpLoad %v4half %32 None
+        %l_m = OpCompositeConstruct %mat3v4half %28 %31 %34
+               OpStore %37 %l_m
+         %39 = OpFunctionCall %int %i
+         %40 = OpBitcast %uint %39
+         %41 = OpExtInst %uint %42 UMin %40 %uint_2
+         %43 = OpAccessChain %_ptr_Function_v4half %37 %41
+      %l_m_i = OpLoad %v4half %43 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 127e6c6..4a0c1eb 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -6,12 +6,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_1 = min(uint(i()), 2u);
+  uint v_2 = min(uint(i()), 2u);
   mat3x4 l_m = v.inner;
-  vec4 l_m_i = v.inner[v_1];
+  vec4 l_m_i = v.inner[v_2];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 6129daf..e0a4b37 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 38
 ; Schema: 0
                OpCapability Shader
-         %29 = OpExtInstImport "GLSL.std.450"
+         %32 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -35,29 +35,32 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %12 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %20 = OpTypeFunction %void
+         %24 = OpTypeFunction %void
 %_ptr_Uniform_mat3v4float = OpTypePointer Uniform %mat3v4float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_2 = OpConstant %uint 2
 %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
           %i = OpFunction %int None %12
          %13 = OpLabel
          %14 = OpLoad %int %counter None
-         %15 = OpIAdd %int %14 %int_1
-               OpStore %counter %15 None
-         %17 = OpLoad %int %counter None
-               OpReturnValue %17
+         %16 = OpBitcast %uint %14
+         %17 = OpBitcast %uint %int_1
+         %19 = OpIAdd %uint %16 %17
+         %20 = OpBitcast %int %19
+               OpStore %counter %20 None
+         %21 = OpLoad %int %counter None
+               OpReturnValue %21
                OpFunctionEnd
-          %f = OpFunction %void None %20
-         %21 = OpLabel
+          %f = OpFunction %void None %24
+         %25 = OpLabel
         %p_m = OpAccessChain %_ptr_Uniform_mat3v4float %1 %uint_0
-         %26 = OpFunctionCall %int %i
-         %27 = OpBitcast %uint %26
-         %28 = OpExtInst %uint %29 UMin %27 %uint_2
-      %p_m_i = OpAccessChain %_ptr_Uniform_v4float %p_m %28
+         %29 = OpFunctionCall %int %i
+         %30 = OpBitcast %uint %29
+         %31 = OpExtInst %uint %32 UMin %30 %uint_2
+      %p_m_i = OpAccessChain %_ptr_Uniform_v4float %p_m %31
         %l_m = OpLoad %mat3v4float %p_m None
       %l_m_i = OpLoad %v4float %p_m_i None
                OpReturn
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 2a94775..eebcff6 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -10,12 +10,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat4x2 v_1 = f16mat4x2(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
-  f16mat4x2 l_m = v_1;
-  f16vec2 l_m_i = v_1[min(uint(i()), 3u)];
+  f16mat4x2 v_2 = f16mat4x2(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
+  f16mat4x2 l_m = v_2;
+  f16vec2 l_m_i = v_2[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index b692f31..3f2c67a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 46
+; Bound: 49
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %42 = OpExtInstImport "GLSL.std.450"
+         %45 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -39,11 +39,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v2half = OpTypePointer Uniform %v2half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -54,28 +54,31 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %37 = OpVariable %_ptr_Function_mat4v2half Function
-         %21 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_0
-         %25 = OpLoad %v2half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_1
-         %28 = OpLoad %v2half %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %40 = OpVariable %_ptr_Function_mat4v2half Function
+         %25 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_0
+         %28 = OpLoad %v2half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_1
          %31 = OpLoad %v2half %29 None
-         %32 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_3
+         %32 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_2
          %34 = OpLoad %v2half %32 None
-        %l_m = OpCompositeConstruct %mat4v2half %25 %28 %31 %34
-               OpStore %37 %l_m
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %42 UMin %40 %uint_3
-         %43 = OpAccessChain %_ptr_Function_v2half %37 %41
-      %l_m_i = OpLoad %v2half %43 None
+         %35 = OpAccessChain %_ptr_Uniform_v2half %1 %uint_3
+         %37 = OpLoad %v2half %35 None
+        %l_m = OpCompositeConstruct %mat4v2half %28 %31 %34 %37
+               OpStore %40 %l_m
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %45 UMin %43 %uint_3
+         %46 = OpAccessChain %_ptr_Function_v2half %40 %44
+      %l_m_i = OpLoad %v2half %46 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 1fea73b..b3032c2 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -9,12 +9,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  mat4x2 v_1 = mat4x2(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
-  mat4x2 l_m = v_1;
-  vec2 l_m_i = v_1[min(uint(i()), 3u)];
+  mat4x2 v_2 = mat4x2(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
+  mat4x2 l_m = v_2;
+  vec2 l_m_i = v_2[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index ec73bb5..e0ff0aa 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 46
+; Bound: 49
 ; Schema: 0
                OpCapability Shader
-         %42 = OpExtInstImport "GLSL.std.450"
+         %45 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -36,11 +36,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -51,28 +51,31 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %37 = OpVariable %_ptr_Function_mat4v2float Function
-         %21 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0
-         %25 = OpLoad %v2float %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_1
-         %28 = OpLoad %v2float %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %40 = OpVariable %_ptr_Function_mat4v2float Function
+         %25 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0
+         %28 = OpLoad %v2float %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_1
          %31 = OpLoad %v2float %29 None
-         %32 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_3
+         %32 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_2
          %34 = OpLoad %v2float %32 None
-        %l_m = OpCompositeConstruct %mat4v2float %25 %28 %31 %34
-               OpStore %37 %l_m
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %42 UMin %40 %uint_3
-         %43 = OpAccessChain %_ptr_Function_v2float %37 %41
-      %l_m_i = OpLoad %v2float %43 None
+         %35 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_3
+         %37 = OpLoad %v2float %35 None
+        %l_m = OpCompositeConstruct %mat4v2float %28 %31 %34 %37
+               OpStore %40 %l_m
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %45 UMin %43 %uint_3
+         %46 = OpAccessChain %_ptr_Function_v2float %40 %44
+      %l_m_i = OpLoad %v2float %46 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index 8f17a68..e022fe7 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -10,12 +10,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat4x3 v_1 = f16mat4x3(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
-  f16mat4x3 l_m = v_1;
-  f16vec3 l_m_i = v_1[min(uint(i()), 3u)];
+  f16mat4x3 v_2 = f16mat4x3(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
+  f16mat4x3 l_m = v_2;
+  f16vec3 l_m_i = v_2[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index befd937..9a8388b 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 46
+; Bound: 49
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %42 = OpExtInstImport "GLSL.std.450"
+         %45 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -39,11 +39,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v3half = OpTypePointer Uniform %v3half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -54,28 +54,31 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %37 = OpVariable %_ptr_Function_mat4v3half Function
-         %21 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_0
-         %25 = OpLoad %v3half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_1
-         %28 = OpLoad %v3half %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %40 = OpVariable %_ptr_Function_mat4v3half Function
+         %25 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_0
+         %28 = OpLoad %v3half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_1
          %31 = OpLoad %v3half %29 None
-         %32 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_3
+         %32 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_2
          %34 = OpLoad %v3half %32 None
-        %l_m = OpCompositeConstruct %mat4v3half %25 %28 %31 %34
-               OpStore %37 %l_m
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %42 UMin %40 %uint_3
-         %43 = OpAccessChain %_ptr_Function_v3half %37 %41
-      %l_m_i = OpLoad %v3half %43 None
+         %35 = OpAccessChain %_ptr_Uniform_v3half %1 %uint_3
+         %37 = OpLoad %v3half %35 None
+        %l_m = OpCompositeConstruct %mat4v3half %28 %31 %34 %37
+               OpStore %40 %l_m
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %45 UMin %43 %uint_3
+         %46 = OpAccessChain %_ptr_Function_v3half %40 %44
+      %l_m_i = OpLoad %v3half %46 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index 8a04114..69a6791 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -12,12 +12,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  mat4x3 v_1 = mat4x3(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
-  mat4x3 l_m = v_1;
-  vec3 l_m_i = v_1[min(uint(i()), 3u)];
+  mat4x3 v_2 = mat4x3(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
+  mat4x3 l_m = v_2;
+  vec3 l_m_i = v_2[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 5dda853..46d0e67 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 46
+; Bound: 49
 ; Schema: 0
                OpCapability Shader
-         %42 = OpExtInstImport "GLSL.std.450"
+         %45 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -36,11 +36,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -51,28 +51,31 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %37 = OpVariable %_ptr_Function_mat4v3float Function
-         %21 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0
-         %25 = OpLoad %v3float %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_1
-         %28 = OpLoad %v3float %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %40 = OpVariable %_ptr_Function_mat4v3float Function
+         %25 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0
+         %28 = OpLoad %v3float %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_1
          %31 = OpLoad %v3float %29 None
-         %32 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_3
+         %32 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_2
          %34 = OpLoad %v3float %32 None
-        %l_m = OpCompositeConstruct %mat4v3float %25 %28 %31 %34
-               OpStore %37 %l_m
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %42 UMin %40 %uint_3
-         %43 = OpAccessChain %_ptr_Function_v3float %37 %41
-      %l_m_i = OpLoad %v3float %43 None
+         %35 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_3
+         %37 = OpLoad %v3float %35 None
+        %l_m = OpCompositeConstruct %mat4v3float %28 %31 %34 %37
+               OpStore %40 %l_m
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %45 UMin %43 %uint_3
+         %46 = OpAccessChain %_ptr_Function_v3float %40 %44
+      %l_m_i = OpLoad %v3float %46 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
index c565af0..7f0962b 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -10,12 +10,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  f16mat4 v_1 = f16mat4(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
-  f16mat4 l_m = v_1;
-  f16vec4 l_m_i = v_1[min(uint(i()), 3u)];
+  f16mat4 v_2 = f16mat4(v.inner_col0, v.inner_col1, v.inner_col2, v.inner_col3);
+  f16mat4 l_m = v_2;
+  f16vec4 l_m_i = v_2[min(uint(i()), 3u)];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
index 9c41614..f081737 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,13 +1,13 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 46
+; Bound: 49
 ; Schema: 0
                OpCapability Shader
                OpCapability Float16
                OpCapability UniformAndStorageBuffer16BitAccess
                OpCapability StorageBuffer16BitAccess
-         %42 = OpExtInstImport "GLSL.std.450"
+         %45 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -39,11 +39,11 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %19 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
 %_ptr_Uniform_v4half = OpTypePointer Uniform %v4half
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
      %uint_2 = OpConstant %uint 2
@@ -54,28 +54,31 @@
           %i = OpFunction %int None %11
          %12 = OpLabel
          %13 = OpLoad %int %counter None
-         %14 = OpIAdd %int %13 %int_1
-               OpStore %counter %14 None
-         %16 = OpLoad %int %counter None
-               OpReturnValue %16
+         %15 = OpBitcast %uint %13
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %counter %19 None
+         %20 = OpLoad %int %counter None
+               OpReturnValue %20
                OpFunctionEnd
-          %f = OpFunction %void None %19
-         %20 = OpLabel
-         %37 = OpVariable %_ptr_Function_mat4v4half Function
-         %21 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_0
-         %25 = OpLoad %v4half %21 None
-         %26 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_1
-         %28 = OpLoad %v4half %26 None
-         %29 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_2
+          %f = OpFunction %void None %23
+         %24 = OpLabel
+         %40 = OpVariable %_ptr_Function_mat4v4half Function
+         %25 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_0
+         %28 = OpLoad %v4half %25 None
+         %29 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_1
          %31 = OpLoad %v4half %29 None
-         %32 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_3
+         %32 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_2
          %34 = OpLoad %v4half %32 None
-        %l_m = OpCompositeConstruct %mat4v4half %25 %28 %31 %34
-               OpStore %37 %l_m
-         %39 = OpFunctionCall %int %i
-         %40 = OpBitcast %uint %39
-         %41 = OpExtInst %uint %42 UMin %40 %uint_3
-         %43 = OpAccessChain %_ptr_Function_v4half %37 %41
-      %l_m_i = OpLoad %v4half %43 None
+         %35 = OpAccessChain %_ptr_Uniform_v4half %1 %uint_3
+         %37 = OpLoad %v4half %35 None
+        %l_m = OpCompositeConstruct %mat4v4half %28 %31 %34 %37
+               OpStore %40 %l_m
+         %42 = OpFunctionCall %int %i
+         %43 = OpBitcast %uint %42
+         %44 = OpExtInst %uint %45 UMin %43 %uint_3
+         %46 = OpAccessChain %_ptr_Function_v4half %40 %44
+      %l_m_i = OpLoad %v4half %46 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
index bb405d0..3e385a8 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -6,12 +6,13 @@
 } v;
 int counter = 0;
 int i() {
-  counter = (counter + 1);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(1)));
   return counter;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  uint v_1 = min(uint(i()), 3u);
+  uint v_2 = min(uint(i()), 3u);
   mat4 l_m = v.inner;
-  vec4 l_m_i = v.inner[v_1];
+  vec4 l_m_i = v.inner[v_2];
 }
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
index 4b68d0f..1bdf9d3 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 38
 ; Schema: 0
                OpCapability Shader
-         %29 = OpExtInstImport "GLSL.std.450"
+         %32 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %f "f"
                OpExecutionMode %f LocalSize 1 1 1
@@ -35,29 +35,32 @@
       %int_0 = OpConstant %int 0
     %counter = OpVariable %_ptr_Private_int Private %int_0
          %12 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %void = OpTypeVoid
-         %20 = OpTypeFunction %void
+         %24 = OpTypeFunction %void
 %_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
      %uint_3 = OpConstant %uint 3
 %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
           %i = OpFunction %int None %12
          %13 = OpLabel
          %14 = OpLoad %int %counter None
-         %15 = OpIAdd %int %14 %int_1
-               OpStore %counter %15 None
-         %17 = OpLoad %int %counter None
-               OpReturnValue %17
+         %16 = OpBitcast %uint %14
+         %17 = OpBitcast %uint %int_1
+         %19 = OpIAdd %uint %16 %17
+         %20 = OpBitcast %int %19
+               OpStore %counter %20 None
+         %21 = OpLoad %int %counter None
+               OpReturnValue %21
                OpFunctionEnd
-          %f = OpFunction %void None %20
-         %21 = OpLabel
+          %f = OpFunction %void None %24
+         %25 = OpLabel
         %p_m = OpAccessChain %_ptr_Uniform_mat4v4float %1 %uint_0
-         %26 = OpFunctionCall %int %i
-         %27 = OpBitcast %uint %26
-         %28 = OpExtInst %uint %29 UMin %27 %uint_3
-      %p_m_i = OpAccessChain %_ptr_Uniform_v4float %p_m %28
+         %29 = OpFunctionCall %int %i
+         %30 = OpBitcast %uint %29
+         %31 = OpExtInst %uint %32 UMin %30 %uint_3
+      %p_m_i = OpAccessChain %_ptr_Uniform_v4float %p_m %31
         %l_m = OpLoad %mat4v4float %p_m None
       %l_m_i = OpLoad %v4float %p_m_i None
                OpReturn
diff --git a/test/tint/bug/chromium/344265982.wgsl.expected.glsl b/test/tint/bug/chromium/344265982.wgsl.expected.glsl
index c37f44f..71876e0 100644
--- a/test/tint/bug/chromium/344265982.wgsl.expected.glsl
+++ b/test/tint/bug/chromium/344265982.wgsl.expected.glsl
@@ -31,12 +31,14 @@
       }
       if (tint_continue) {
         {
-          i = (i + 1);
+          uint v_3 = uint(i);
+          i = int((v_3 + uint(1)));
         }
         continue;
       }
       {
-        i = (i + 1);
+        uint v_3 = uint(i);
+        i = int((v_3 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/chromium/344265982.wgsl.expected.spvasm b/test/tint/bug/chromium/344265982.wgsl.expected.spvasm
index f9aab32..6700948 100644
--- a/test/tint/bug/chromium/344265982.wgsl.expected.spvasm
+++ b/test/tint/bug/chromium/344265982.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 49
+; Bound: 52
 ; Schema: 0
                OpCapability Shader
          %29 = OpExtInstImport "GLSL.std.450"
@@ -63,11 +63,11 @@
                OpSelectionMerge %37 None
                OpSwitch %34 %35 1 %36
          %35 = OpLabel
-         %41 = OpLoad %int %i None
-         %42 = OpBitcast %uint %41
-         %43 = OpExtInst %uint %29 UMin %42 %uint_3
-         %44 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %43
-               OpStore %44 %int_2 None
+         %44 = OpLoad %int %i None
+         %45 = OpBitcast %uint %44
+         %46 = OpExtInst %uint %29 UMin %45 %uint_3
+         %47 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %46
+               OpStore %47 %int_2 None
                OpBranch %37
          %36 = OpLabel
                OpBranch %14
@@ -75,14 +75,17 @@
                OpBranch %14
          %14 = OpLabel
          %38 = OpLoad %int %i None
-         %39 = OpIAdd %int %38 %int_1
-               OpStore %i %39 None
+         %39 = OpBitcast %uint %38
+         %40 = OpBitcast %uint %int_1
+         %42 = OpIAdd %uint %39 %40
+         %43 = OpBitcast %int %42
+               OpStore %i %43 None
                OpBranch %15
          %16 = OpLabel
                OpReturn
                OpFunctionEnd
        %main = OpFunction %void None %10
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %foo
+         %50 = OpLabel
+         %51 = OpFunctionCall %void %foo
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl
index 6054677..2a6712e 100644
--- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl
@@ -38,7 +38,8 @@
         v_2 = (offset.y > 1.0f);
       }
       if (v_2) {
-        i = (i + 1);
+        uint v_3 = uint(i);
+        i = int((v_3 + uint(1)));
         {
           uint tint_low_inc = (tint_loop_idx.x - 1u);
           tint_loop_idx.x = tint_low_inc;
@@ -48,7 +49,8 @@
         continue;
       }
       float sampleDepth = 0.0f;
-      i = (i + 1);
+      uint v_4 = uint(i);
+      i = int((v_4 + uint(1)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
index 931d53c..6564a4d 100644
--- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
+++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 104
+; Bound: 110
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -63,7 +63,7 @@
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-        %100 = OpTypeFunction %void
+        %106 = OpTypeFunction %void
  %main_inner = OpFunction %v4float None %16
         %vUV = OpFunctionParameter %v2float
          %17 = OpLabel
@@ -107,8 +107,8 @@
          %61 = OpLabel
                OpBranch %60
          %62 = OpLabel
-         %93 = OpCompositeExtract %float %offset 1
-         %65 = OpFOrdLessThan %bool %93 %sampleDepth
+         %96 = OpCompositeExtract %float %offset 1
+         %65 = OpFOrdLessThan %bool %96 %sampleDepth
                OpBranch %60
          %60 = OpLabel
          %63 = OpPhi %bool %true %61 %65 %62
@@ -117,8 +117,8 @@
          %67 = OpLabel
                OpBranch %66
          %68 = OpLabel
-         %94 = OpCompositeExtract %float %offset 0
-         %70 = OpFOrdGreaterThan %bool %94 %float_1
+         %97 = OpCompositeExtract %float %offset 0
+         %70 = OpFOrdGreaterThan %bool %97 %float_1
                OpBranch %66
          %66 = OpLabel
          %69 = OpPhi %bool %true %67 %70 %68
@@ -127,44 +127,50 @@
          %72 = OpLabel
                OpBranch %71
          %73 = OpLabel
-         %95 = OpCompositeExtract %float %offset 1
-         %75 = OpFOrdGreaterThan %bool %95 %float_1
+         %98 = OpCompositeExtract %float %offset 1
+         %75 = OpFOrdGreaterThan %bool %98 %float_1
                OpBranch %71
          %71 = OpLabel
          %74 = OpPhi %bool %true %72 %75 %73
                OpSelectionMerge %76 None
                OpBranchConditional %74 %77 %76
          %77 = OpLabel
-         %96 = OpLoad %int %i None
-         %97 = OpIAdd %int %96 %int_1
-               OpStore %i %97 None
+         %99 = OpLoad %int %i None
+        %100 = OpBitcast %uint %99
+        %101 = OpBitcast %uint %int_1
+        %102 = OpIAdd %uint %100 %101
+        %103 = OpBitcast %int %102
+               OpStore %i %103 None
                OpBranch %31
          %76 = OpLabel
          %78 = OpLoad %int %i None
-         %79 = OpIAdd %int %78 %int_1
-               OpStore %i %79 None
+         %79 = OpBitcast %uint %78
+         %80 = OpBitcast %uint %int_1
+         %81 = OpIAdd %uint %79 %80
+         %82 = OpBitcast %int %81
+               OpStore %i %82 None
                OpBranch %31
          %31 = OpLabel
-         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %83 = OpLoad %uint %80 None
-%tint_low_inc = OpISub %uint %83 %uint_1
-         %86 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %86 %tint_low_inc None
-         %87 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %87 %uint_1 %uint_0
-         %89 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %90 = OpLoad %uint %89 None
-         %91 = OpISub %uint %90 %tint_carry
+         %83 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %86 = OpLoad %uint %83 None
+%tint_low_inc = OpISub %uint %86 %uint_1
+         %89 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %89 %tint_low_inc None
+         %90 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %90 %uint_1 %uint_0
          %92 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %92 %91 None
+         %93 = OpLoad %uint %92 None
+         %94 = OpISub %uint %93 %tint_carry
+         %95 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %95 %94 None
                OpBranch %32
          %33 = OpLabel
                OpReturnValue %34
                OpFunctionEnd
-       %main = OpFunction %void None %100
-        %101 = OpLabel
-        %102 = OpLoad %v2float %main_loc0_Input None
-        %103 = OpFunctionCall %v4float %main_inner %102
-               OpStore %main_loc0_Output %103 None
+       %main = OpFunction %void None %106
+        %107 = OpLabel
+        %108 = OpLoad %v2float %main_loc0_Input None
+        %109 = OpFunctionCall %v4float %main_inner %108
+               OpStore %main_loc0_Output %109 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.glsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.glsl
index 06e4548..0f8e1a2 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.glsl
@@ -17,7 +17,8 @@
       v4u[min(uint(i), 3u)] = 1u;
       v2b[min(uint(i), 1u)] = true;
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
@@ -34,7 +35,8 @@
       }
       foo();
       {
-        i = (i + 1);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.spvasm b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.spvasm
index 4c33b38..2da2ce0 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.spvasm
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 82
+; Bound: 88
 ; Schema: 0
                OpCapability Shader
          %41 = OpExtInstImport "GLSL.std.450"
@@ -92,37 +92,43 @@
                OpBranch %27
          %27 = OpLabel
          %65 = OpLoad %int %i None
-         %66 = OpIAdd %int %65 %int_1
-               OpStore %i %66 None
+         %66 = OpBitcast %uint %65
+         %67 = OpBitcast %uint %int_1
+         %68 = OpIAdd %uint %66 %67
+         %69 = OpBitcast %int %68
+               OpStore %i %69 None
                OpBranch %28
          %29 = OpLabel
                OpReturn
                OpFunctionEnd
        %main = OpFunction %void None %23
-         %68 = OpLabel
+         %71 = OpLabel
         %i_0 = OpVariable %_ptr_Function_int Function
-               OpBranch %69
-         %69 = OpLabel
-               OpStore %i_0 %int_0
                OpBranch %72
          %72 = OpLabel
-               OpLoopMerge %73 %71 None
-               OpBranch %70
-         %70 = OpLabel
-         %75 = OpLoad %int %i_0 None
-         %76 = OpSLessThan %bool %75 %int_2
-               OpSelectionMerge %77 None
-               OpBranchConditional %76 %77 %78
-         %78 = OpLabel
+               OpStore %i_0 %int_0
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %74 None
                OpBranch %73
-         %77 = OpLabel
-         %79 = OpFunctionCall %void %foo
-               OpBranch %71
-         %71 = OpLabel
-         %80 = OpLoad %int %i_0 None
-         %81 = OpIAdd %int %80 %int_1
-               OpStore %i_0 %81 None
-               OpBranch %72
          %73 = OpLabel
+         %78 = OpLoad %int %i_0 None
+         %79 = OpSLessThan %bool %78 %int_2
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %80 %81
+         %81 = OpLabel
+               OpBranch %76
+         %80 = OpLabel
+         %82 = OpFunctionCall %void %foo
+               OpBranch %74
+         %74 = OpLabel
+         %83 = OpLoad %int %i_0 None
+         %84 = OpBitcast %uint %83
+         %85 = OpBitcast %uint %int_1
+         %86 = OpIAdd %uint %84 %85
+         %87 = OpBitcast %int %86
+               OpStore %i_0 %87 None
+               OpBranch %75
+         %76 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.glsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.glsl
index 9cd1b74..dd0ebfb 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.glsl
@@ -22,7 +22,8 @@
       }
       foo();
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.spvasm b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.spvasm
index a0bad64..c45b758 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.spvasm
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 71
+; Bound: 74
 ; Schema: 0
                OpCapability Shader
          %31 = OpExtInstImport "GLSL.std.450"
@@ -99,8 +99,11 @@
                OpBranch %59
          %59 = OpLabel
          %69 = OpLoad %int %i_0 None
-         %70 = OpIAdd %int %69 %int_1
-               OpStore %i_0 %70 None
+         %70 = OpBitcast %uint %69
+         %71 = OpBitcast %uint %int_1
+         %72 = OpIAdd %uint %70 %71
+         %73 = OpBitcast %int %72
+               OpStore %i_0 %73 None
                OpBranch %60
          %61 = OpLabel
                OpReturn
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.glsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.glsl
index d9c9d31..27cc20f 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.glsl
@@ -34,7 +34,8 @@
       v3b[min(uint(i), 2u)] = true;
       v4b[min(uint(i), 3u)] = true;
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.spvasm b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.spvasm
index 8ce5745..34f272c 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.spvasm
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 130
+; Bound: 133
 ; Schema: 0
                OpCapability Shader
          %73 = OpExtInstImport "GLSL.std.450"
@@ -169,8 +169,11 @@
                OpBranch %59
          %59 = OpLabel
         %128 = OpLoad %int %i None
-        %129 = OpIAdd %int %128 %int_1
-               OpStore %i %129 None
+        %129 = OpBitcast %uint %128
+        %130 = OpBitcast %uint %int_1
+        %131 = OpIAdd %uint %129 %130
+        %132 = OpBitcast %int %131
+               OpStore %i %132 None
                OpBranch %60
          %61 = OpLabel
                OpReturn
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.glsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.glsl
index 1215bd2..04e2484 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.glsl
@@ -26,7 +26,8 @@
       v4u_2[min(uint(i), 3u)] = 1u;
       v2b_2[min(uint(i), 1u)] = true;
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.spvasm b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.spvasm
index 30ec0c6..de73a5b 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.spvasm
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 86
+; Bound: 89
 ; Schema: 0
                OpCapability Shader
          %45 = OpExtInstImport "GLSL.std.450"
@@ -117,8 +117,11 @@
                OpBranch %31
          %31 = OpLabel
          %84 = OpLoad %int %i None
-         %85 = OpIAdd %int %84 %int_1
-               OpStore %i %85 None
+         %85 = OpBitcast %uint %84
+         %86 = OpBitcast %uint %int_1
+         %87 = OpIAdd %uint %85 %86
+         %88 = OpBitcast %int %87
+               OpStore %i %88 None
                OpBranch %32
          %33 = OpLabel
                OpReturn
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.glsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.glsl
index 42d897f..005c53f 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.glsl
@@ -26,7 +26,8 @@
       v2u[min(uint(i), 1u)] = 1u;
       v2b[min(uint(i), 1u)] = true;
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.spvasm b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.spvasm
index bd21757..7a84c7a 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.spvasm
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 131
+; Bound: 134
 ; Schema: 0
                OpCapability Shader
          %68 = OpExtInstImport "GLSL.std.450"
@@ -131,8 +131,11 @@
                OpBranch %59
          %59 = OpLabel
         %129 = OpLoad %int %i_0 None
-        %130 = OpIAdd %int %129 %int_1
-               OpStore %i_0 %130 None
+        %130 = OpBitcast %uint %129
+        %131 = OpBitcast %uint %int_1
+        %132 = OpIAdd %uint %130 %131
+        %133 = OpBitcast %int %132
+               OpStore %i_0 %133 None
                OpBranch %60
          %61 = OpLabel
                OpStore %i %int_0
diff --git a/test/tint/bug/tint/1121.wgsl.expected.glsl b/test/tint/bug/tint/1121.wgsl.expected.glsl
index fd08b38..4453919 100644
--- a/test/tint/bug/tint/1121.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1121.wgsl.expected.glsl
@@ -103,12 +103,17 @@
           } else {
             break;
           }
-          ivec2 tilePixel0Idx = ivec2((x * TILE_SIZE), (y * TILE_SIZE));
-          vec2 v_19 = (2.0f * vec2(tilePixel0Idx));
-          vec2 floorCoord = ((v_19 / v_2.inner.fullScreenSize.xy) - vec2(1.0f));
-          ivec2 v_20 = tilePixel0Idx;
-          vec2 v_21 = (2.0f * vec2((v_20 + ivec2(TILE_SIZE))));
-          vec2 ceilCoord = ((v_21 / v_2.inner.fullScreenSize.xy) - vec2(1.0f));
+          uint v_19 = uint(x);
+          int v_20 = int((v_19 * uint(TILE_SIZE)));
+          uint v_21 = uint(y);
+          ivec2 tilePixel0Idx = ivec2(v_20, int((v_21 * uint(TILE_SIZE))));
+          vec2 v_22 = (2.0f * vec2(tilePixel0Idx));
+          vec2 floorCoord = ((v_22 / v_2.inner.fullScreenSize.xy) - vec2(1.0f));
+          ivec2 v_23 = tilePixel0Idx;
+          ivec2 v_24 = ivec2(TILE_SIZE);
+          uvec2 v_25 = uvec2(v_23);
+          vec2 v_26 = (2.0f * vec2(ivec2((v_25 + uvec2(v_24)))));
+          vec2 ceilCoord = ((v_26 / v_2.inner.fullScreenSize.xy) - vec2(1.0f));
           vec2 viewFloorCoord = vec2((((-(viewNear) * floorCoord.x) - (M[2u].x * viewNear)) / M[0u].x), (((-(viewNear) * floorCoord.y) - (M[2u].y * viewNear)) / M[1u].y));
           vec2 viewCeilCoord = vec2((((-(viewNear) * ceilCoord.x) - (M[2u].x * viewNear)) / M[0u].x), (((-(viewNear) * ceilCoord.y) - (M[2u].y * viewNear)) / M[1u].y));
           frustumPlanes[0u] = vec4(1.0f, 0.0f, (-(viewFloorCoord.x) / viewNear), 0.0f);
@@ -124,29 +129,29 @@
                 break;
               }
               vec4 p = vec4(0.0f);
-              uint v_22 = min(i, 5u);
-              if ((frustumPlanes[v_22].x > 0.0f)) {
+              uint v_27 = min(i, 5u);
+              if ((frustumPlanes[v_27].x > 0.0f)) {
                 p.x = boxMax.x;
               } else {
                 p.x = boxMin.x;
               }
-              uint v_23 = min(i, 5u);
-              if ((frustumPlanes[v_23].y > 0.0f)) {
+              uint v_28 = min(i, 5u);
+              if ((frustumPlanes[v_28].y > 0.0f)) {
                 p.y = boxMax.y;
               } else {
                 p.y = boxMin.y;
               }
-              uint v_24 = min(i, 5u);
-              if ((frustumPlanes[v_24].z > 0.0f)) {
+              uint v_29 = min(i, 5u);
+              if ((frustumPlanes[v_29].z > 0.0f)) {
                 p.z = boxMax.z;
               } else {
                 p.z = boxMin.z;
               }
               p.w = 1.0f;
-              float v_25 = dp;
-              vec4 v_26 = p;
-              uint v_27 = min(i, 5u);
-              dp = (v_25 + min(0.0f, dot(v_26, frustumPlanes[v_27])));
+              float v_30 = dp;
+              vec4 v_31 = p;
+              uint v_32 = min(i, 5u);
+              dp = (v_30 + min(0.0f, dot(v_31, frustumPlanes[v_32])));
               {
                 i = (i + 1u);
               }
@@ -154,39 +159,47 @@
             }
           }
           if ((dp >= 0.0f)) {
-            uint tileId = uint((x + (y * TILE_COUNT_X)));
-            bool v_28 = false;
+            int v_33 = x;
+            uint v_34 = uint(y);
+            int v_35 = int((v_34 * uint(TILE_COUNT_X)));
+            uint v_36 = uint(v_33);
+            uint tileId = uint(int((v_36 + uint(v_35))));
+            bool v_37 = false;
             if ((tileId < 0u)) {
-              v_28 = true;
+              v_37 = true;
             } else {
-              v_28 = (tileId >= v_1.inner.numTiles);
+              v_37 = (tileId >= v_1.inner.numTiles);
             }
-            if (v_28) {
+            if (v_37) {
               {
-                x = (x + 1);
+                uint v_38 = uint(x);
+                x = int((v_38 + uint(1)));
               }
               continue;
             }
-            uint v_29 = min(tileId, 3u);
-            uint offset = atomicAdd(v.inner.data[v_29].count, 1u);
+            uint v_39 = min(tileId, 3u);
+            uint offset = atomicAdd(v.inner.data[v_39].count, 1u);
             if ((offset >= v_1.inner.numTileLightSlot)) {
               {
-                x = (x + 1);
+                uint v_38 = uint(x);
+                x = int((v_38 + uint(1)));
               }
               continue;
             }
-            uint v_30 = min(tileId, 3u);
-            uint v_31 = min(offset, 63u);
-            v.inner.data[v_30].lightId[v_31] = GlobalInvocationID.x;
+            uint v_40 = min(tileId, 3u);
+            uint v_41 = min(offset, 63u);
+            v.inner.data[v_40].lightId[v_41] = GlobalInvocationID.x;
           }
           {
-            x = (x + 1);
+            uint v_38 = uint(x);
+            x = int((v_38 + uint(1)));
           }
           continue;
         }
       }
       {
-        y = (y + 1);
+        uint v_42 = uint(y);
+        y = int((v_42 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/tint/1121.wgsl.expected.spvasm b/test/tint/bug/tint/1121.wgsl.expected.spvasm
index ef23ca4..61531d0 100644
--- a/test/tint/bug/tint/1121.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1121.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 460
+; Bound: 482
 ; Schema: 0
                OpCapability Shader
          %55 = OpExtInstImport "GLSL.std.450"
@@ -181,14 +181,15 @@
 %_ptr_Function_v2int = OpTypePointer Function %v2int
     %v2float = OpTypeVector %float 2
     %float_2 = OpConstant %float 2
-        %236 = OpConstantComposite %v2float %float_1 %float_1
+        %245 = OpConstantComposite %v2float %float_1 %float_1
 %_ptr_Function_v2float = OpTypePointer Function %v2float
-        %358 = OpConstantNull %v4float
+     %v2uint = OpTypeVector %uint 2
+        %374 = OpConstantNull %v4float
        %true = OpConstantTrue %bool
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
     %uint_63 = OpConstant %uint 63
 %_ptr_StorageBuffer_uint_0 = OpTypePointer StorageBuffer %uint
-        %456 = OpTypeFunction %void
+        %478 = OpTypeFunction %void
  %main_inner = OpFunction %void None %34
 %GlobalInvocationID = OpFunctionParameter %v3uint
          %35 = OpLabel
@@ -210,7 +211,7 @@
 %viewCeilCoord = OpVariable %_ptr_Function_v2float Function
          %dp = OpVariable %_ptr_Function_float Function
           %i = OpVariable %_ptr_Function_uint Function
-          %p = OpVariable %_ptr_Function_v4float Function %358
+          %p = OpVariable %_ptr_Function_v4float Function %374
      %tileId = OpVariable %_ptr_Function_uint Function
      %offset = OpVariable %_ptr_Function_uint Function
          %36 = OpCompositeExtract %uint %GlobalInvocationID 0
@@ -373,303 +374,324 @@
                OpLoopMerge %209 %207 None
                OpBranch %206
         %206 = OpLabel
-        %214 = OpLoad %int %x None
-        %215 = OpSLessThan %bool %214 %TILE_COUNT_X
-               OpSelectionMerge %216 None
-               OpBranchConditional %215 %216 %217
-        %217 = OpLabel
+        %217 = OpLoad %int %x None
+        %218 = OpSLessThan %bool %217 %TILE_COUNT_X
+               OpSelectionMerge %219 None
+               OpBranchConditional %218 %219 %220
+        %220 = OpLabel
                OpBranch %209
-        %216 = OpLabel
-        %218 = OpLoad %int %x None
-        %219 = OpIMul %int %218 %TILE_SIZE
-        %220 = OpLoad %int %y None
-        %221 = OpIMul %int %220 %TILE_SIZE
-        %223 = OpCompositeConstruct %v2int %219 %221
-               OpStore %tilePixel0Idx %223
-        %226 = OpLoad %v2int %tilePixel0Idx None
-        %228 = OpConvertSToF %v2float %226
-        %229 = OpVectorTimesScalar %v2float %228 %float_2
-        %231 = OpAccessChain %_ptr_Uniform_v4float %23 %uint_0 %uint_4
-        %232 = OpLoad %v4float %231 None
-        %233 = OpVectorShuffle %v2float %232 %232 0 1
-        %234 = OpFDiv %v2float %229 %233
-        %235 = OpFSub %v2float %234 %236
-               OpStore %floorCoord %235
-        %239 = OpLoad %v2int %tilePixel0Idx None
-        %240 = OpCompositeConstruct %v2int %TILE_SIZE %TILE_SIZE
-        %241 = OpIAdd %v2int %239 %240
-        %242 = OpConvertSToF %v2float %241
-        %243 = OpVectorTimesScalar %v2float %242 %float_2
-        %244 = OpAccessChain %_ptr_Uniform_v4float %23 %uint_0 %uint_4
-        %245 = OpLoad %v4float %244 None
-        %246 = OpVectorShuffle %v2float %245 %245 0 1
-        %247 = OpFDiv %v2float %243 %246
-        %248 = OpFSub %v2float %247 %236
-               OpStore %ceilCoord %248
-        %250 = OpLoad %float %viewNear None
-        %251 = OpFNegate %float %250
-        %252 = OpAccessChain %_ptr_Function_float %floorCoord %uint_0
-        %253 = OpLoad %float %252 None
-        %254 = OpFMul %float %251 %253
-        %255 = OpAccessChain %_ptr_Function_v4float %M %uint_2
-        %256 = OpAccessChain %_ptr_Function_float %255 %uint_0
-        %257 = OpLoad %float %256 None
-        %258 = OpLoad %float %viewNear None
-        %259 = OpFMul %float %257 %258
-        %260 = OpFSub %float %254 %259
-        %261 = OpAccessChain %_ptr_Function_v4float %M %uint_0
-        %262 = OpAccessChain %_ptr_Function_float %261 %uint_0
-        %263 = OpLoad %float %262 None
-        %264 = OpFDiv %float %260 %263
-        %265 = OpLoad %float %viewNear None
-        %266 = OpFNegate %float %265
-        %267 = OpAccessChain %_ptr_Function_float %floorCoord %uint_1
-        %268 = OpLoad %float %267 None
-        %269 = OpFMul %float %266 %268
-        %270 = OpAccessChain %_ptr_Function_v4float %M %uint_2
-        %271 = OpAccessChain %_ptr_Function_float %270 %uint_1
-        %272 = OpLoad %float %271 None
-        %273 = OpLoad %float %viewNear None
-        %274 = OpFMul %float %272 %273
-        %275 = OpFSub %float %269 %274
-        %276 = OpAccessChain %_ptr_Function_v4float %M %uint_1
-        %277 = OpAccessChain %_ptr_Function_float %276 %uint_1
-        %278 = OpLoad %float %277 None
-        %279 = OpFDiv %float %275 %278
-        %280 = OpCompositeConstruct %v2float %264 %279
-               OpStore %viewFloorCoord %280
-        %282 = OpLoad %float %viewNear None
-        %283 = OpFNegate %float %282
-        %284 = OpAccessChain %_ptr_Function_float %ceilCoord %uint_0
+        %219 = OpLabel
+        %221 = OpLoad %int %x None
+        %222 = OpBitcast %uint %221
+        %223 = OpBitcast %uint %TILE_SIZE
+        %224 = OpIMul %uint %222 %223
+        %225 = OpBitcast %int %224
+        %226 = OpLoad %int %y None
+        %227 = OpBitcast %uint %226
+        %228 = OpBitcast %uint %TILE_SIZE
+        %229 = OpIMul %uint %227 %228
+        %230 = OpBitcast %int %229
+        %232 = OpCompositeConstruct %v2int %225 %230
+               OpStore %tilePixel0Idx %232
+        %235 = OpLoad %v2int %tilePixel0Idx None
+        %237 = OpConvertSToF %v2float %235
+        %238 = OpVectorTimesScalar %v2float %237 %float_2
+        %240 = OpAccessChain %_ptr_Uniform_v4float %23 %uint_0 %uint_4
+        %241 = OpLoad %v4float %240 None
+        %242 = OpVectorShuffle %v2float %241 %241 0 1
+        %243 = OpFDiv %v2float %238 %242
+        %244 = OpFSub %v2float %243 %245
+               OpStore %floorCoord %244
+        %248 = OpLoad %v2int %tilePixel0Idx None
+        %249 = OpCompositeConstruct %v2int %TILE_SIZE %TILE_SIZE
+        %251 = OpBitcast %v2uint %248
+        %252 = OpBitcast %v2uint %249
+        %253 = OpIAdd %v2uint %251 %252
+        %254 = OpBitcast %v2int %253
+        %255 = OpConvertSToF %v2float %254
+        %256 = OpVectorTimesScalar %v2float %255 %float_2
+        %257 = OpAccessChain %_ptr_Uniform_v4float %23 %uint_0 %uint_4
+        %258 = OpLoad %v4float %257 None
+        %259 = OpVectorShuffle %v2float %258 %258 0 1
+        %260 = OpFDiv %v2float %256 %259
+        %261 = OpFSub %v2float %260 %245
+               OpStore %ceilCoord %261
+        %263 = OpLoad %float %viewNear None
+        %264 = OpFNegate %float %263
+        %265 = OpAccessChain %_ptr_Function_float %floorCoord %uint_0
+        %266 = OpLoad %float %265 None
+        %267 = OpFMul %float %264 %266
+        %268 = OpAccessChain %_ptr_Function_v4float %M %uint_2
+        %269 = OpAccessChain %_ptr_Function_float %268 %uint_0
+        %270 = OpLoad %float %269 None
+        %271 = OpLoad %float %viewNear None
+        %272 = OpFMul %float %270 %271
+        %273 = OpFSub %float %267 %272
+        %274 = OpAccessChain %_ptr_Function_v4float %M %uint_0
+        %275 = OpAccessChain %_ptr_Function_float %274 %uint_0
+        %276 = OpLoad %float %275 None
+        %277 = OpFDiv %float %273 %276
+        %278 = OpLoad %float %viewNear None
+        %279 = OpFNegate %float %278
+        %280 = OpAccessChain %_ptr_Function_float %floorCoord %uint_1
+        %281 = OpLoad %float %280 None
+        %282 = OpFMul %float %279 %281
+        %283 = OpAccessChain %_ptr_Function_v4float %M %uint_2
+        %284 = OpAccessChain %_ptr_Function_float %283 %uint_1
         %285 = OpLoad %float %284 None
-        %286 = OpFMul %float %283 %285
-        %287 = OpAccessChain %_ptr_Function_v4float %M %uint_2
-        %288 = OpAccessChain %_ptr_Function_float %287 %uint_0
-        %289 = OpLoad %float %288 None
-        %290 = OpLoad %float %viewNear None
-        %291 = OpFMul %float %289 %290
-        %292 = OpFSub %float %286 %291
-        %293 = OpAccessChain %_ptr_Function_v4float %M %uint_0
-        %294 = OpAccessChain %_ptr_Function_float %293 %uint_0
-        %295 = OpLoad %float %294 None
-        %296 = OpFDiv %float %292 %295
-        %297 = OpLoad %float %viewNear None
-        %298 = OpFNegate %float %297
-        %299 = OpAccessChain %_ptr_Function_float %ceilCoord %uint_1
-        %300 = OpLoad %float %299 None
-        %301 = OpFMul %float %298 %300
-        %302 = OpAccessChain %_ptr_Function_v4float %M %uint_2
-        %303 = OpAccessChain %_ptr_Function_float %302 %uint_1
-        %304 = OpLoad %float %303 None
-        %305 = OpLoad %float %viewNear None
-        %306 = OpFMul %float %304 %305
-        %307 = OpFSub %float %301 %306
-        %308 = OpAccessChain %_ptr_Function_v4float %M %uint_1
-        %309 = OpAccessChain %_ptr_Function_float %308 %uint_1
-        %310 = OpLoad %float %309 None
-        %311 = OpFDiv %float %307 %310
-        %312 = OpCompositeConstruct %v2float %296 %311
-               OpStore %viewCeilCoord %312
-        %314 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_0
-        %315 = OpAccessChain %_ptr_Function_float %viewFloorCoord %uint_0
-        %316 = OpLoad %float %315 None
-        %317 = OpFNegate %float %316
+        %286 = OpLoad %float %viewNear None
+        %287 = OpFMul %float %285 %286
+        %288 = OpFSub %float %282 %287
+        %289 = OpAccessChain %_ptr_Function_v4float %M %uint_1
+        %290 = OpAccessChain %_ptr_Function_float %289 %uint_1
+        %291 = OpLoad %float %290 None
+        %292 = OpFDiv %float %288 %291
+        %293 = OpCompositeConstruct %v2float %277 %292
+               OpStore %viewFloorCoord %293
+        %295 = OpLoad %float %viewNear None
+        %296 = OpFNegate %float %295
+        %297 = OpAccessChain %_ptr_Function_float %ceilCoord %uint_0
+        %298 = OpLoad %float %297 None
+        %299 = OpFMul %float %296 %298
+        %300 = OpAccessChain %_ptr_Function_v4float %M %uint_2
+        %301 = OpAccessChain %_ptr_Function_float %300 %uint_0
+        %302 = OpLoad %float %301 None
+        %303 = OpLoad %float %viewNear None
+        %304 = OpFMul %float %302 %303
+        %305 = OpFSub %float %299 %304
+        %306 = OpAccessChain %_ptr_Function_v4float %M %uint_0
+        %307 = OpAccessChain %_ptr_Function_float %306 %uint_0
+        %308 = OpLoad %float %307 None
+        %309 = OpFDiv %float %305 %308
+        %310 = OpLoad %float %viewNear None
+        %311 = OpFNegate %float %310
+        %312 = OpAccessChain %_ptr_Function_float %ceilCoord %uint_1
+        %313 = OpLoad %float %312 None
+        %314 = OpFMul %float %311 %313
+        %315 = OpAccessChain %_ptr_Function_v4float %M %uint_2
+        %316 = OpAccessChain %_ptr_Function_float %315 %uint_1
+        %317 = OpLoad %float %316 None
         %318 = OpLoad %float %viewNear None
-        %319 = OpFDiv %float %317 %318
-        %320 = OpCompositeConstruct %v4float %float_1 %float_0 %319 %float_0
-               OpStore %314 %320 None
-        %321 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_1
-        %322 = OpAccessChain %_ptr_Function_float %viewCeilCoord %uint_0
+        %319 = OpFMul %float %317 %318
+        %320 = OpFSub %float %314 %319
+        %321 = OpAccessChain %_ptr_Function_v4float %M %uint_1
+        %322 = OpAccessChain %_ptr_Function_float %321 %uint_1
         %323 = OpLoad %float %322 None
-        %324 = OpLoad %float %viewNear None
-        %325 = OpFDiv %float %323 %324
-        %326 = OpCompositeConstruct %v4float %float_n1 %float_0 %325 %float_0
-               OpStore %321 %326 None
-        %327 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_2
-        %328 = OpAccessChain %_ptr_Function_float %viewFloorCoord %uint_1
+        %324 = OpFDiv %float %320 %323
+        %325 = OpCompositeConstruct %v2float %309 %324
+               OpStore %viewCeilCoord %325
+        %327 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_0
+        %328 = OpAccessChain %_ptr_Function_float %viewFloorCoord %uint_0
         %329 = OpLoad %float %328 None
         %330 = OpFNegate %float %329
         %331 = OpLoad %float %viewNear None
         %332 = OpFDiv %float %330 %331
-        %333 = OpCompositeConstruct %v4float %float_0 %float_1 %332 %float_0
+        %333 = OpCompositeConstruct %v4float %float_1 %float_0 %332 %float_0
                OpStore %327 %333 None
-        %334 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_3
-        %335 = OpAccessChain %_ptr_Function_float %viewCeilCoord %uint_1
+        %334 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_1
+        %335 = OpAccessChain %_ptr_Function_float %viewCeilCoord %uint_0
         %336 = OpLoad %float %335 None
         %337 = OpLoad %float %viewNear None
         %338 = OpFDiv %float %336 %337
-        %339 = OpCompositeConstruct %v4float %float_0 %float_n1 %338 %float_0
+        %339 = OpCompositeConstruct %v4float %float_n1 %float_0 %338 %float_0
                OpStore %334 %339 None
+        %340 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_2
+        %341 = OpAccessChain %_ptr_Function_float %viewFloorCoord %uint_1
+        %342 = OpLoad %float %341 None
+        %343 = OpFNegate %float %342
+        %344 = OpLoad %float %viewNear None
+        %345 = OpFDiv %float %343 %344
+        %346 = OpCompositeConstruct %v4float %float_0 %float_1 %345 %float_0
+               OpStore %340 %346 None
+        %347 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %uint_3
+        %348 = OpAccessChain %_ptr_Function_float %viewCeilCoord %uint_1
+        %349 = OpLoad %float %348 None
+        %350 = OpLoad %float %viewNear None
+        %351 = OpFDiv %float %349 %350
+        %352 = OpCompositeConstruct %v4float %float_0 %float_n1 %351 %float_0
+               OpStore %347 %352 None
                OpStore %dp %float_0
-               OpBranch %341
-        %341 = OpLabel
+               OpBranch %354
+        %354 = OpLabel
                OpStore %i %uint_0
-               OpBranch %344
-        %344 = OpLabel
-               OpLoopMerge %345 %343 None
-               OpBranch %342
-        %342 = OpLabel
-        %353 = OpLoad %uint %i None
-        %354 = OpULessThan %bool %353 %uint_6
-               OpSelectionMerge %355 None
-               OpBranchConditional %354 %355 %356
-        %356 = OpLabel
-               OpBranch %345
+               OpBranch %357
+        %357 = OpLabel
+               OpLoopMerge %358 %356 None
+               OpBranch %355
         %355 = OpLabel
-        %359 = OpLoad %uint %i None
-        %360 = OpExtInst %uint %55 UMin %359 %uint_5
-        %361 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %360
-        %362 = OpAccessChain %_ptr_Function_float %361 %uint_0
-        %363 = OpLoad %float %362 None
-        %364 = OpFOrdGreaterThan %bool %363 %float_0
-               OpSelectionMerge %365 None
-               OpBranchConditional %364 %366 %367
-        %366 = OpLabel
-        %434 = OpAccessChain %_ptr_Function_float %boxMax %uint_0
-        %435 = OpLoad %float %434 None
-        %436 = OpAccessChain %_ptr_Function_float %p %uint_0
-               OpStore %436 %435 None
-               OpBranch %365
-        %367 = OpLabel
-        %437 = OpAccessChain %_ptr_Function_float %boxMin %uint_0
-        %438 = OpLoad %float %437 None
-        %439 = OpAccessChain %_ptr_Function_float %p %uint_0
-               OpStore %439 %438 None
-               OpBranch %365
-        %365 = OpLabel
-        %368 = OpLoad %uint %i None
-        %369 = OpExtInst %uint %55 UMin %368 %uint_5
-        %370 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %369
-        %371 = OpAccessChain %_ptr_Function_float %370 %uint_1
-        %372 = OpLoad %float %371 None
-        %373 = OpFOrdGreaterThan %bool %372 %float_0
-               OpSelectionMerge %374 None
-               OpBranchConditional %373 %375 %376
-        %375 = OpLabel
-        %440 = OpAccessChain %_ptr_Function_float %boxMax %uint_1
-        %441 = OpLoad %float %440 None
-        %442 = OpAccessChain %_ptr_Function_float %p %uint_1
-               OpStore %442 %441 None
-               OpBranch %374
-        %376 = OpLabel
-        %443 = OpAccessChain %_ptr_Function_float %boxMin %uint_1
-        %444 = OpLoad %float %443 None
-        %445 = OpAccessChain %_ptr_Function_float %p %uint_1
-               OpStore %445 %444 None
-               OpBranch %374
-        %374 = OpLabel
-        %377 = OpLoad %uint %i None
-        %378 = OpExtInst %uint %55 UMin %377 %uint_5
-        %379 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %378
-        %380 = OpAccessChain %_ptr_Function_float %379 %uint_2
-        %381 = OpLoad %float %380 None
-        %382 = OpFOrdGreaterThan %bool %381 %float_0
-               OpSelectionMerge %383 None
-               OpBranchConditional %382 %384 %385
-        %384 = OpLabel
-        %446 = OpAccessChain %_ptr_Function_float %boxMax %uint_2
-        %447 = OpLoad %float %446 None
-        %448 = OpAccessChain %_ptr_Function_float %p %uint_2
-               OpStore %448 %447 None
-               OpBranch %383
-        %385 = OpLabel
-        %449 = OpAccessChain %_ptr_Function_float %boxMin %uint_2
-        %450 = OpLoad %float %449 None
-        %451 = OpAccessChain %_ptr_Function_float %p %uint_2
-               OpStore %451 %450 None
-               OpBranch %383
+        %369 = OpLoad %uint %i None
+        %370 = OpULessThan %bool %369 %uint_6
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %371 %372
+        %372 = OpLabel
+               OpBranch %358
+        %371 = OpLabel
+        %375 = OpLoad %uint %i None
+        %376 = OpExtInst %uint %55 UMin %375 %uint_5
+        %377 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %376
+        %378 = OpAccessChain %_ptr_Function_float %377 %uint_0
+        %379 = OpLoad %float %378 None
+        %380 = OpFOrdGreaterThan %bool %379 %float_0
+               OpSelectionMerge %381 None
+               OpBranchConditional %380 %382 %383
+        %382 = OpLabel
+        %456 = OpAccessChain %_ptr_Function_float %boxMax %uint_0
+        %457 = OpLoad %float %456 None
+        %458 = OpAccessChain %_ptr_Function_float %p %uint_0
+               OpStore %458 %457 None
+               OpBranch %381
         %383 = OpLabel
-        %386 = OpAccessChain %_ptr_Function_float %p %uint_3
-               OpStore %386 %float_1 None
-        %387 = OpLoad %float %dp None
-        %388 = OpLoad %v4float %p None
-        %389 = OpLoad %uint %i None
-        %390 = OpExtInst %uint %55 UMin %389 %uint_5
-        %391 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %390
-        %392 = OpLoad %v4float %391 None
-        %393 = OpDot %float %388 %392
-        %394 = OpExtInst %float %55 NMin %float_0 %393
-        %395 = OpFAdd %float %387 %394
-               OpStore %dp %395 None
-               OpBranch %343
-        %343 = OpLabel
-        %396 = OpLoad %uint %i None
-        %397 = OpIAdd %uint %396 %uint_1
-               OpStore %i %397 None
-               OpBranch %344
-        %345 = OpLabel
-        %346 = OpLoad %float %dp None
-        %347 = OpFOrdGreaterThanEqual %bool %346 %float_0
-               OpSelectionMerge %348 None
-               OpBranchConditional %347 %349 %348
-        %349 = OpLabel
-        %398 = OpLoad %int %x None
-        %399 = OpLoad %int %y None
-        %400 = OpIMul %int %399 %TILE_COUNT_X
-        %401 = OpIAdd %int %398 %400
-        %402 = OpBitcast %uint %401
-               OpStore %tileId %402
-        %404 = OpLoad %uint %tileId None
-        %405 = OpULessThan %bool %404 %uint_0
-               OpSelectionMerge %406 None
-               OpBranchConditional %405 %407 %408
-        %407 = OpLabel
-               OpBranch %406
-        %408 = OpLabel
-        %452 = OpLoad %uint %tileId None
-        %453 = OpAccessChain %_ptr_Uniform_uint %19 %uint_0 %uint_1
-        %454 = OpLoad %uint %453 None
-        %411 = OpUGreaterThanEqual %bool %452 %454
-               OpBranch %406
-        %406 = OpLabel
-        %409 = OpPhi %bool %true %407 %411 %408
-               OpSelectionMerge %412 None
-               OpBranchConditional %409 %413 %412
-        %413 = OpLabel
-               OpBranch %207
-        %412 = OpLabel
-        %414 = OpLoad %uint %tileId None
-        %415 = OpExtInst %uint %55 UMin %414 %uint_3
-        %416 = OpAccessChain %_ptr_StorageBuffer_uint %9 %uint_0 %uint_0 %415 %uint_0
-        %418 = OpAtomicIAdd %uint %416 %uint_1 %uint_0 %uint_1
-               OpStore %offset %418
-        %420 = OpLoad %uint %offset None
-        %421 = OpAccessChain %_ptr_Uniform_uint %19 %uint_0 %uint_4
-        %422 = OpLoad %uint %421 None
-        %423 = OpUGreaterThanEqual %bool %420 %422
-               OpSelectionMerge %424 None
-               OpBranchConditional %423 %425 %424
-        %425 = OpLabel
-               OpBranch %207
-        %424 = OpLabel
+        %459 = OpAccessChain %_ptr_Function_float %boxMin %uint_0
+        %460 = OpLoad %float %459 None
+        %461 = OpAccessChain %_ptr_Function_float %p %uint_0
+               OpStore %461 %460 None
+               OpBranch %381
+        %381 = OpLabel
+        %384 = OpLoad %uint %i None
+        %385 = OpExtInst %uint %55 UMin %384 %uint_5
+        %386 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %385
+        %387 = OpAccessChain %_ptr_Function_float %386 %uint_1
+        %388 = OpLoad %float %387 None
+        %389 = OpFOrdGreaterThan %bool %388 %float_0
+               OpSelectionMerge %390 None
+               OpBranchConditional %389 %391 %392
+        %391 = OpLabel
+        %462 = OpAccessChain %_ptr_Function_float %boxMax %uint_1
+        %463 = OpLoad %float %462 None
+        %464 = OpAccessChain %_ptr_Function_float %p %uint_1
+               OpStore %464 %463 None
+               OpBranch %390
+        %392 = OpLabel
+        %465 = OpAccessChain %_ptr_Function_float %boxMin %uint_1
+        %466 = OpLoad %float %465 None
+        %467 = OpAccessChain %_ptr_Function_float %p %uint_1
+               OpStore %467 %466 None
+               OpBranch %390
+        %390 = OpLabel
+        %393 = OpLoad %uint %i None
+        %394 = OpExtInst %uint %55 UMin %393 %uint_5
+        %395 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %394
+        %396 = OpAccessChain %_ptr_Function_float %395 %uint_2
+        %397 = OpLoad %float %396 None
+        %398 = OpFOrdGreaterThan %bool %397 %float_0
+               OpSelectionMerge %399 None
+               OpBranchConditional %398 %400 %401
+        %400 = OpLabel
+        %468 = OpAccessChain %_ptr_Function_float %boxMax %uint_2
+        %469 = OpLoad %float %468 None
+        %470 = OpAccessChain %_ptr_Function_float %p %uint_2
+               OpStore %470 %469 None
+               OpBranch %399
+        %401 = OpLabel
+        %471 = OpAccessChain %_ptr_Function_float %boxMin %uint_2
+        %472 = OpLoad %float %471 None
+        %473 = OpAccessChain %_ptr_Function_float %p %uint_2
+               OpStore %473 %472 None
+               OpBranch %399
+        %399 = OpLabel
+        %402 = OpAccessChain %_ptr_Function_float %p %uint_3
+               OpStore %402 %float_1 None
+        %403 = OpLoad %float %dp None
+        %404 = OpLoad %v4float %p None
+        %405 = OpLoad %uint %i None
+        %406 = OpExtInst %uint %55 UMin %405 %uint_5
+        %407 = OpAccessChain %_ptr_Function_v4float %frustumPlanes %406
+        %408 = OpLoad %v4float %407 None
+        %409 = OpDot %float %404 %408
+        %410 = OpExtInst %float %55 NMin %float_0 %409
+        %411 = OpFAdd %float %403 %410
+               OpStore %dp %411 None
+               OpBranch %356
+        %356 = OpLabel
+        %412 = OpLoad %uint %i None
+        %413 = OpIAdd %uint %412 %uint_1
+               OpStore %i %413 None
+               OpBranch %357
+        %358 = OpLabel
+        %359 = OpLoad %float %dp None
+        %360 = OpFOrdGreaterThanEqual %bool %359 %float_0
+               OpSelectionMerge %361 None
+               OpBranchConditional %360 %362 %361
+        %362 = OpLabel
+        %414 = OpLoad %int %x None
+        %415 = OpLoad %int %y None
+        %416 = OpBitcast %uint %415
+        %417 = OpBitcast %uint %TILE_COUNT_X
+        %418 = OpIMul %uint %416 %417
+        %419 = OpBitcast %int %418
+        %420 = OpBitcast %uint %414
+        %421 = OpBitcast %uint %419
+        %422 = OpIAdd %uint %420 %421
+        %423 = OpBitcast %int %422
+        %424 = OpBitcast %uint %423
+               OpStore %tileId %424
         %426 = OpLoad %uint %tileId None
-        %427 = OpLoad %uint %offset None
-        %428 = OpExtInst %uint %55 UMin %426 %uint_3
-        %429 = OpExtInst %uint %55 UMin %427 %uint_63
-        %431 = OpAccessChain %_ptr_StorageBuffer_uint_0 %9 %uint_0 %uint_0 %428 %uint_1 %429
-        %433 = OpCompositeExtract %uint %GlobalInvocationID 0
-               OpStore %431 %433 None
-               OpBranch %348
-        %348 = OpLabel
+        %427 = OpULessThan %bool %426 %uint_0
+               OpSelectionMerge %428 None
+               OpBranchConditional %427 %429 %430
+        %429 = OpLabel
+               OpBranch %428
+        %430 = OpLabel
+        %474 = OpLoad %uint %tileId None
+        %475 = OpAccessChain %_ptr_Uniform_uint %19 %uint_0 %uint_1
+        %476 = OpLoad %uint %475 None
+        %433 = OpUGreaterThanEqual %bool %474 %476
+               OpBranch %428
+        %428 = OpLabel
+        %431 = OpPhi %bool %true %429 %433 %430
+               OpSelectionMerge %434 None
+               OpBranchConditional %431 %435 %434
+        %435 = OpLabel
+               OpBranch %207
+        %434 = OpLabel
+        %436 = OpLoad %uint %tileId None
+        %437 = OpExtInst %uint %55 UMin %436 %uint_3
+        %438 = OpAccessChain %_ptr_StorageBuffer_uint %9 %uint_0 %uint_0 %437 %uint_0
+        %440 = OpAtomicIAdd %uint %438 %uint_1 %uint_0 %uint_1
+               OpStore %offset %440
+        %442 = OpLoad %uint %offset None
+        %443 = OpAccessChain %_ptr_Uniform_uint %19 %uint_0 %uint_4
+        %444 = OpLoad %uint %443 None
+        %445 = OpUGreaterThanEqual %bool %442 %444
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %446
+        %447 = OpLabel
+               OpBranch %207
+        %446 = OpLabel
+        %448 = OpLoad %uint %tileId None
+        %449 = OpLoad %uint %offset None
+        %450 = OpExtInst %uint %55 UMin %448 %uint_3
+        %451 = OpExtInst %uint %55 UMin %449 %uint_63
+        %453 = OpAccessChain %_ptr_StorageBuffer_uint_0 %9 %uint_0 %uint_0 %450 %uint_1 %451
+        %455 = OpCompositeExtract %uint %GlobalInvocationID 0
+               OpStore %453 %455 None
+               OpBranch %361
+        %361 = OpLabel
                OpBranch %207
         %207 = OpLabel
-        %350 = OpLoad %int %x None
-        %351 = OpIAdd %int %350 %int_1
-               OpStore %x %351 None
+        %363 = OpLoad %int %x None
+        %364 = OpBitcast %uint %363
+        %365 = OpBitcast %uint %int_1
+        %366 = OpIAdd %uint %364 %365
+        %367 = OpBitcast %int %366
+               OpStore %x %367 None
                OpBranch %208
         %209 = OpLabel
                OpBranch %185
         %185 = OpLabel
         %210 = OpLoad %int %y None
-        %211 = OpIAdd %int %210 %int_1
-               OpStore %y %211 None
+        %211 = OpBitcast %uint %210
+        %212 = OpBitcast %uint %int_1
+        %214 = OpIAdd %uint %211 %212
+        %215 = OpBitcast %int %214
+               OpStore %y %215 None
                OpBranch %186
         %187 = OpLabel
                OpReturn
                OpFunctionEnd
-       %main = OpFunction %void None %456
-        %457 = OpLabel
-        %458 = OpLoad %v3uint %main_global_invocation_id_Input None
-        %459 = OpFunctionCall %void %main_inner %458
+       %main = OpFunction %void None %478
+        %479 = OpLabel
+        %480 = OpLoad %v3uint %main_global_invocation_id_Input None
+        %481 = OpFunctionCall %void %main_inner %480
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/1542.wgsl.expected.glsl b/test/tint/bug/tint/1542.wgsl.expected.glsl
index 695e99b..f318657 100644
--- a/test/tint/bug/tint/1542.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1542.wgsl.expected.glsl
@@ -12,5 +12,5 @@
 } v;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  ivec3 temp = (v.inner.d << (uvec3(0u) & uvec3(31u)));
+  ivec3 temp = ivec3((uvec3(v.inner.d) << (uvec3(0u) & uvec3(31u))));
 }
diff --git a/test/tint/bug/tint/1542.wgsl.expected.spvasm b/test/tint/bug/tint/1542.wgsl.expected.spvasm
index c06e0d6..e2f77e1 100644
--- a/test/tint/bug/tint/1542.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1542.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 22
+; Bound: 24
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -39,6 +39,8 @@
          %11 = OpAccessChain %_ptr_Uniform_v3int %1 %uint_0 %uint_0
          %15 = OpLoad %v3int %11 None
          %16 = OpBitwiseAnd %v3uint %17 %19
-       %temp = OpShiftLeftLogical %v3int %15 %16
+         %21 = OpBitcast %v3uint %15
+         %22 = OpShiftLeftLogical %v3uint %21 %16
+       %temp = OpBitcast %v3int %22
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/1557.wgsl.expected.glsl b/test/tint/bug/tint/1557.wgsl.expected.glsl
index 8a1148d..9d73f41 100644
--- a/test/tint/bug/tint/1557.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1557.wgsl.expected.glsl
@@ -18,7 +18,8 @@
       if ((j >= 1)) {
         break;
       }
-      j = (j + 1);
+      uint v_1 = uint(j);
+      j = int((v_1 + uint(1)));
       int k = f();
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
diff --git a/test/tint/bug/tint/1557.wgsl.expected.spvasm b/test/tint/bug/tint/1557.wgsl.expected.spvasm
index 4fde7bb..34e1917 100644
--- a/test/tint/bug/tint/1557.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1557.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 70
+; Bound: 73
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -78,48 +78,51 @@
                OpBranch %19
          %37 = OpLabel
          %39 = OpLoad %int %j None
-         %40 = OpIAdd %int %39 %int_1
-               OpStore %j %40 None
-         %41 = OpFunctionCall %int %f
-               OpStore %k %41
+         %40 = OpBitcast %uint %39
+         %41 = OpBitcast %uint %int_1
+         %42 = OpIAdd %uint %40 %41
+         %43 = OpBitcast %int %42
+               OpStore %j %43 None
+         %44 = OpFunctionCall %int %f
+               OpStore %k %44
                OpBranch %17
          %17 = OpLabel
-         %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %46 = OpLoad %uint %43 None
-%tint_low_inc = OpISub %uint %46 %uint_1
-         %49 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %49 %tint_low_inc None
-         %50 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %50 %uint_1 %uint_0
-         %52 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %53 = OpLoad %uint %52 None
-         %54 = OpISub %uint %53 %tint_carry
+         %46 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %49 = OpLoad %uint %46 None
+%tint_low_inc = OpISub %uint %49 %uint_1
+         %52 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %52 %tint_low_inc None
+         %53 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %53 %uint_1 %uint_0
          %55 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %55 %54 None
+         %56 = OpLoad %uint %55 None
+         %57 = OpISub %uint %56 %tint_carry
+         %58 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %58 %57 None
                OpBranch %18
          %19 = OpLabel
                OpReturn
                OpFunctionEnd
        %main = OpFunction %void None %11
-         %57 = OpLabel
-         %58 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
-         %60 = OpLoad %int %58 None
-               OpSelectionMerge %63 None
-               OpSwitch %60 %61 0 %62
-         %61 = OpLabel
-               OpBranch %63
-         %62 = OpLabel
-         %64 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
-         %65 = OpLoad %int %64 None
-               OpSelectionMerge %68 None
-               OpSwitch %65 %66 0 %67
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
+         %63 = OpLoad %int %61 None
+               OpSelectionMerge %66 None
+               OpSwitch %63 %64 0 %65
+         %64 = OpLabel
+               OpBranch %66
+         %65 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
+         %68 = OpLoad %int %67 None
+               OpSelectionMerge %71 None
+               OpSwitch %68 %69 0 %70
+         %69 = OpLabel
+         %72 = OpFunctionCall %void %g
+               OpBranch %71
+         %70 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %66
          %66 = OpLabel
-         %69 = OpFunctionCall %void %g
-               OpBranch %68
-         %67 = OpLabel
-               OpBranch %68
-         %68 = OpLabel
-               OpBranch %63
-         %63 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/1605.wgsl.expected.glsl b/test/tint/bug/tint/1605.wgsl.expected.glsl
index f4fb323..7e40898 100644
--- a/test/tint/bug/tint/1605.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1605.wgsl.expected.glsl
@@ -35,7 +35,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/tint/1605.wgsl.expected.spvasm b/test/tint/bug/tint/1605.wgsl.expected.spvasm
index 6ca170f..98e94bb 100644
--- a/test/tint/bug/tint/1605.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1605.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 101
+; Bound: 107
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -52,7 +52,7 @@
       %false = OpConstantFalse %bool
      %int_n1 = OpConstant %int -1
        %void = OpTypeVoid
-         %98 = OpTypeFunction %void
+        %104 = OpTypeFunction %void
      %func_3 = OpFunction %bool None %7
           %8 = OpLabel
 %return_value = OpVariable %_ptr_Function_bool Function %11
@@ -97,40 +97,43 @@
                OpLoopMerge %51 %49 None
                OpBranch %48
          %48 = OpLabel
-         %75 = OpLoad %v2uint %tint_loop_idx_0 None
-         %76 = OpIEqual %v2bool %75 %34
-         %77 = OpAll %bool %76
-               OpSelectionMerge %78 None
-               OpBranchConditional %77 %79 %78
-         %79 = OpLabel
-               OpBranch %51
-         %78 = OpLabel
-         %80 = OpLoad %int %j None
-         %81 = OpIEqual %bool %80 %int_1
-               OpSelectionMerge %82 None
-               OpBranchConditional %81 %82 %83
-         %83 = OpLabel
-               OpBranch %51
+         %78 = OpLoad %v2uint %tint_loop_idx_0 None
+         %79 = OpIEqual %v2bool %78 %34
+         %80 = OpAll %bool %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
          %82 = OpLabel
+               OpBranch %51
+         %81 = OpLabel
+         %83 = OpLoad %int %j None
+         %84 = OpIEqual %bool %83 %int_1
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %85 %86
+         %86 = OpLabel
+               OpBranch %51
+         %85 = OpLabel
                OpStore %continue_execution %false None
                OpStore %return_value %false None
                OpBranch %51
          %49 = OpLabel
-         %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %85 = OpLoad %uint %84 None
-%tint_low_inc_1 = OpISub %uint %85 %uint_1
          %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %87 %tint_low_inc_1 None
-         %88 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %88 %uint_1 %uint_0
-         %90 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-         %91 = OpLoad %uint %90 None
-         %92 = OpISub %uint %91 %tint_carry_1
+         %88 = OpLoad %uint %87 None
+%tint_low_inc_1 = OpISub %uint %88 %uint_1
+         %90 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %90 %tint_low_inc_1 None
+         %91 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %91 %uint_1 %uint_0
          %93 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %93 %92 None
-         %94 = OpLoad %int %j None
-         %95 = OpIAdd %int %94 %int_1
-               OpStore %j %95 None
+         %94 = OpLoad %uint %93 None
+         %95 = OpISub %uint %94 %tint_carry_1
+         %96 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %96 %95 None
+         %97 = OpLoad %int %j None
+         %98 = OpBitcast %uint %97
+         %99 = OpBitcast %uint %int_1
+        %100 = OpIAdd %uint %98 %99
+        %101 = OpBitcast %int %100
+               OpStore %j %101 None
                OpBranch %50
          %51 = OpLabel
          %52 = OpLoad %bool %continue_execution None
@@ -155,8 +158,11 @@
          %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %67 %66 None
          %68 = OpLoad %int %i None
-         %69 = OpIAdd %int %68 %int_1
-               OpStore %i %69 None
+         %69 = OpBitcast %uint %68
+         %70 = OpBitcast %uint %int_1
+         %72 = OpIAdd %uint %69 %70
+         %73 = OpBitcast %int %72
+               OpStore %i %73 None
                OpBranch %17
          %18 = OpLabel
          %19 = OpLoad %bool %continue_execution None
@@ -169,8 +175,8 @@
          %22 = OpLoad %bool %return_value None
                OpReturnValue %22
                OpFunctionEnd
-       %main = OpFunction %void None %98
-         %99 = OpLabel
-        %100 = OpFunctionCall %bool %func_3
+       %main = OpFunction %void None %104
+        %105 = OpLabel
+        %106 = OpFunctionCall %bool %func_3
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/1664.wgsl.expected.glsl b/test/tint/bug/tint/1664.wgsl.expected.glsl
index 27de912..43b2bb1 100644
--- a/test/tint/bug/tint/1664.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1664.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   int a = 2147483647;
   int b = 1;
-  int c = (a + 1);
+  uint v = uint(a);
+  int c = int((v + uint(1)));
 }
diff --git a/test/tint/bug/tint/1664.wgsl.expected.spvasm b/test/tint/bug/tint/1664.wgsl.expected.spvasm
index 9adf942..985bf9f 100644
--- a/test/tint/bug/tint/1664.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1664.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 9
+; Bound: 13
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,8 +16,12 @@
         %int = OpTypeInt 32 1
           %a = OpConstant %int 2147483647
           %b = OpConstant %int 1
+       %uint = OpTypeInt 32 0
          %f0 = OpFunction %void None %3
           %4 = OpLabel
-          %c = OpIAdd %int %a %b
+          %9 = OpBitcast %uint %a
+         %10 = OpBitcast %uint %b
+         %11 = OpIAdd %uint %9 %10
+          %c = OpBitcast %int %11
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/1677.wgsl.expected.glsl b/test/tint/bug/tint/1677.wgsl.expected.glsl
index 3574e4b..2a0e15c 100644
--- a/test/tint/bug/tint/1677.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1677.wgsl.expected.glsl
@@ -11,7 +11,8 @@
   Input inner;
 } v;
 void main_inner(uvec3 id) {
-  ivec3 pos = (v.inner.position - ivec3(0));
+  uvec3 v_1 = uvec3(v.inner.position);
+  ivec3 pos = ivec3((v_1 - uvec3(ivec3(0))));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/bug/tint/1677.wgsl.expected.spvasm b/test/tint/bug/tint/1677.wgsl.expected.spvasm
index da708ae..c5d6286 100644
--- a/test/tint/bug/tint/1677.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1677.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 27
+; Bound: 30
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -37,19 +37,22 @@
          %14 = OpTypeFunction %void %v3uint
 %_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
      %uint_0 = OpConstant %uint 0
-         %21 = OpConstantNull %v3int
-         %23 = OpTypeFunction %void
+         %22 = OpConstantNull %v3int
+         %26 = OpTypeFunction %void
  %main_inner = OpFunction %void None %14
          %id = OpFunctionParameter %v3uint
          %15 = OpLabel
          %16 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0 %uint_0
          %19 = OpLoad %v3int %16 None
-        %pos = OpISub %v3int %19 %21
+         %20 = OpBitcast %v3uint %19
+         %21 = OpBitcast %v3uint %22
+         %23 = OpISub %v3uint %20 %21
+        %pos = OpBitcast %v3int %23
                OpReturn
                OpFunctionEnd
-       %main = OpFunction %void None %23
-         %24 = OpLabel
-         %25 = OpLoad %v3uint %main_global_invocation_id_Input None
-         %26 = OpFunctionCall %void %main_inner %25
+       %main = OpFunction %void None %26
+         %27 = OpLabel
+         %28 = OpLoad %v3uint %main_global_invocation_id_Input None
+         %29 = OpFunctionCall %void %main_inner %28
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/2063.wgsl.expected.glsl b/test/tint/bug/tint/2063.wgsl.expected.glsl
index 136f145..f4ec920 100644
--- a/test/tint/bug/tint/2063.wgsl.expected.glsl
+++ b/test/tint/bug/tint/2063.wgsl.expected.glsl
@@ -6,7 +6,7 @@
     atomicExchange(arg_0, 0);
   }
   barrier();
-  int res = atomicAdd(arg_0, -(-1));
+  int res = atomicAdd(arg_0, int((~(uint(-1)) + 1u)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/bug/tint/354627692.wgsl.expected.glsl b/test/tint/bug/tint/354627692.wgsl.expected.glsl
index 63e8b22..b971705 100644
--- a/test/tint/bug/tint/354627692.wgsl.expected.glsl
+++ b/test/tint/bug/tint/354627692.wgsl.expected.glsl
@@ -25,10 +25,12 @@
               break;
             }
             if ((i > 5)) {
-              i = (i * 2);
+              uint v_1 = uint(i);
+              i = int((v_1 * uint(2)));
               break;
             } else {
-              i = (i * 2);
+              uint v_2 = uint(i);
+              i = int((v_2 * uint(2)));
               break;
             }
             /* unreachable */
diff --git a/test/tint/bug/tint/354627692.wgsl.expected.spvasm b/test/tint/bug/tint/354627692.wgsl.expected.spvasm
index 25006b3..26d19af 100644
--- a/test/tint/bug/tint/354627692.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/354627692.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 83
+; Bound: 89
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -104,13 +104,19 @@
                OpBranchConditional %63 %66 %67
          %66 = OpLabel
          %78 = OpLoad %int %i None
-         %79 = OpIMul %int %78 %int_2
-               OpStore %i %79 None
+         %79 = OpBitcast %uint %78
+         %80 = OpBitcast %uint %int_2
+         %82 = OpIMul %uint %79 %80
+         %83 = OpBitcast %int %82
+               OpStore %i %83 None
                OpBranch %52
          %67 = OpLabel
-         %81 = OpLoad %int %i None
-         %82 = OpIMul %int %81 %int_2
-               OpStore %i %82 None
+         %84 = OpLoad %int %i None
+         %85 = OpBitcast %uint %84
+         %86 = OpBitcast %uint %int_2
+         %87 = OpIMul %uint %85 %86
+         %88 = OpBitcast %int %87
+               OpStore %i %88 None
                OpBranch %52
          %65 = OpLabel
                OpBranch %52
diff --git a/test/tint/bug/tint/379127084.wgsl.expected.glsl b/test/tint/bug/tint/379127084.wgsl.expected.glsl
index 6c0554e..ff2011d 100644
--- a/test/tint/bug/tint/379127084.wgsl.expected.glsl
+++ b/test/tint/bug/tint/379127084.wgsl.expected.glsl
@@ -125,7 +125,8 @@
               tint_loop_idx_1.x = tint_low_inc_1;
               uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
               tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-              _72_h = (_72_h + 1);
+              uint v_15 = uint(_72_h);
+              _72_h = int((v_15 + uint(1)));
               if ((_72_h >= 4)) { break; }
             }
             continue;
@@ -148,7 +149,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        _61_o = (_61_o + 1);
+        uint v_16 = uint(_61_o);
+        _61_o = int((v_16 + uint(1)));
       }
       continue;
     }
@@ -158,14 +160,14 @@
   }
   vec4 _skTemp15 = clamp(_58_l, vec4(0.0f), vec4(1.0f));
   _58_l = _skTemp15;
-  vec3 v_15 = vec3(_58_l.xyz);
-  vec3 v_16 = vec3((v_15 * float(_58_l.w)));
-  float _skTemp16 = dot(vec3(0.21259999275207519531f, 0.71520000696182250977f, 0.07220000028610229492f), vec4(v_16, float(float(_58_l.w))).xyz);
+  vec3 v_17 = vec3(_58_l.xyz);
+  vec3 v_18 = vec3((v_17 * float(_58_l.w)));
+  float _skTemp16 = dot(vec3(0.21259999275207519531f, 0.71520000696182250977f, 0.07220000028610229492f), vec4(v_18, float(float(_58_l.w))).xyz);
   float _skTemp17 = clamp(_skTemp16, 0.0f, 1.0f);
   vec4 _84_a = vec4(0.0f, 0.0f, 0.0f, _skTemp17);
-  uint v_17 = shadingSsboIndex;
-  uint v_18 = min(v_17, (uint(_storage1.fsUniformData.length()) - 1u));
-  int _85_d = _storage1.fsUniformData[v_18].inHSL_4;
+  uint v_19 = shadingSsboIndex;
+  uint v_20 = min(v_19, (uint(_storage1.fsUniformData.length()) - 1u));
+  int _85_d = _storage1.fsUniformData[v_20].inHSL_4;
   if (bool(_85_d)) {
     vec4 _skTemp18 = vec4(0.0f);
     if ((_84_a.y < _84_a.z)) {
@@ -195,13 +197,13 @@
     float _skTemp23 = max(_84_a.w, 0.00009999999747378752f);
     _84_a = vec4((_84_a.xyz / _skTemp23), _84_a.w);
   }
-  uint v_19 = shadingSsboIndex;
-  uint v_20 = min(v_19, (uint(_storage1.fsUniformData.length()) - 1u));
-  mat4 v_21 = _storage1.fsUniformData[v_20].matrix_4;
-  vec4 v_22 = (v_21 * vec4(_84_a));
-  uint v_23 = shadingSsboIndex;
-  uint v_24 = min(v_23, (uint(_storage1.fsUniformData.length()) - 1u));
-  vec4 _94_f = vec4((v_22 + _storage1.fsUniformData[v_24].translate_4));
+  uint v_21 = shadingSsboIndex;
+  uint v_22 = min(v_21, (uint(_storage1.fsUniformData.length()) - 1u));
+  mat4 v_23 = _storage1.fsUniformData[v_22].matrix_4;
+  vec4 v_24 = (v_23 * vec4(_84_a));
+  uint v_25 = shadingSsboIndex;
+  uint v_26 = min(v_25, (uint(_storage1.fsUniformData.length()) - 1u));
+  vec4 _94_f = vec4((v_24 + _storage1.fsUniformData[v_26].translate_4));
   if (bool(_85_d)) {
     float _skTemp24 = abs(((2.0f * _94_f.z) - 1.0f));
     float _95_b = ((1.0f - _skTemp24) * _94_f.y);
@@ -213,9 +215,9 @@
     vec4 _skTemp28 = clamp(vec4(((((_97_d - 0.5f) * _95_b) + _94_f.z) * _94_f.w), _94_f.w), vec4(0.0f), vec4(1.0f));
     _94_f = _skTemp28;
   } else {
-    uint v_25 = shadingSsboIndex;
-    uint v_26 = min(v_25, (uint(_storage1.fsUniformData.length()) - 1u));
-    if (bool(_storage1.fsUniformData[v_26].clampRGB_4)) {
+    uint v_27 = shadingSsboIndex;
+    uint v_28 = min(v_27, (uint(_storage1.fsUniformData.length()) - 1u));
+    if (bool(_storage1.fsUniformData[v_28].clampRGB_4)) {
       vec4 _skTemp29 = clamp(_94_f, vec4(0.0f), vec4(1.0f));
       _94_f = _skTemp29;
     } else {
diff --git a/test/tint/bug/tint/379127084.wgsl.expected.spvasm b/test/tint/bug/tint/379127084.wgsl.expected.spvasm
index 42c66be..d33f65d 100644
--- a/test/tint/bug/tint/379127084.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/379127084.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 608
+; Bound: 614
 ; Schema: 0
                OpCapability Shader
          %48 = OpExtInstImport "GLSL.std.450"
@@ -213,42 +213,42 @@
      %v2bool = OpTypeVector %bool 2
 %_ptr_Function_uint = OpTypePointer Function %uint
       %int_1 = OpConstant %int 1
-        %197 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
+        %200 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
     %float_6 = OpConstant %float 6
 %float_9_99999975en05 = OpConstant %float 9.99999975e-05
     %float_2 = OpConstant %float 2
 %float_0_666666687 = OpConstant %float 0.666666687
 %float_0_333333343 = OpConstant %float 0.333333343
-        %276 = OpConstantComposite %v3float %float_0 %float_0_666666687 %float_0_333333343
+        %279 = OpConstantComposite %v3float %float_0 %float_0_666666687 %float_0_333333343
     %float_3 = OpConstant %float 3
-        %288 = OpConstantNull %v3float
-        %289 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+        %291 = OpConstantNull %v3float
+        %292 = OpConstantComposite %v3float %float_1 %float_1 %float_1
      %uint_8 = OpConstant %uint 8
-        %335 = OpConstantComposite %v2float %float_1 %float_1
+        %338 = OpConstantComposite %v2float %float_1 %float_1
      %uint_4 = OpConstant %uint 4
 %float_0_00390625 = OpConstant %float 0.00390625
 %float_n0_474999994 = OpConstant %float -0.474999994
   %float_n16 = OpConstant %float -16
 %float_15_9899998 = OpConstant %float 15.9899998
-        %361 = OpTypeSampledImage %20
+        %364 = OpTypeSampledImage %20
       %false = OpConstantFalse %bool
   %float_256 = OpConstant %float 256
-        %390 = OpConstantComposite %v4float %float_0_00390625 %float_0_00390625 %float_0_00390625 %float_0_00390625
-        %395 = OpConstantNull %v2float
-        %400 = OpConstantComposite %v2float %float_2 %float_2
-        %402 = OpConstantComposite %v2float %float_3 %float_3
+        %393 = OpConstantComposite %v4float %float_0_00390625 %float_0_00390625 %float_0_00390625 %float_0_00390625
+        %398 = OpConstantNull %v2float
+        %403 = OpConstantComposite %v2float %float_2 %float_2
+        %405 = OpConstantComposite %v2float %float_3 %float_3
    %float_n1 = OpConstant %float -1
 %float_n0_333333343 = OpConstant %float -0.333333343
   %float_255 = OpConstant %float 255
-        %463 = OpConstantComposite %v2float %float_255 %float_255
-        %466 = OpConstantComposite %v2float %float_0_5 %float_0_5
+        %466 = OpConstantComposite %v2float %float_255 %float_255
+        %469 = OpConstantComposite %v2float %float_0_5 %float_0_5
 %float_0_00392156886 = OpConstant %float 0.00392156886
-        %469 = OpConstantComposite %v2float %float_0_00392156886 %float_0_00392156886
+        %472 = OpConstantComposite %v2float %float_0_00392156886 %float_0_00392156886
  %float_0_25 = OpConstant %float 0.25
       %int_4 = OpConstant %int 4
-        %594 = OpTypeFunction %FSOut %FSIn
-        %597 = OpConstantNull %FSOut
-        %601 = OpTypeFunction %void
+        %600 = OpTypeFunction %FSOut %FSIn
+        %603 = OpConstantNull %FSOut
+        %607 = OpTypeFunction %void
   %_skslMain = OpFunction %void None %37
    %_stageIn = OpFunctionParameter %FSIn
 %_stageOut_root = OpFunctionParameter %_ptr_Function_FSOut
@@ -333,265 +333,268 @@
                OpSelectionMerge %178 None
                OpBranchConditional %177 %179 %180
         %179 = OpLabel
-        %325 = OpLoad %v2float %_57_k None
-   %_skTemp2 = OpExtInst %v2float %48 Floor %325
-        %327 = OpLoad %v4float %_62_f None
-        %328 = OpVectorShuffle %v2float %327 %327 2 3
-        %329 = OpCompositeConstruct %v4float %_skTemp2 %328
-               OpStore %_62_f %329 None
+        %328 = OpLoad %v2float %_57_k None
+   %_skTemp2 = OpExtInst %v2float %48 Floor %328
         %330 = OpLoad %v4float %_62_f None
-        %331 = OpVectorShuffle %v2float %330 %330 0 1
-        %332 = OpLoad %v4float %_62_f None
-        %333 = OpVectorShuffle %v2float %332 %332 0 1
-        %334 = OpFAdd %v2float %333 %335
-        %336 = OpCompositeConstruct %v4float %331 %334
-               OpStore %_62_f %336 None
-        %337 = OpLoad %uint %shadingSsboIndex None
-        %338 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
-        %339 = OpArrayLength %uint %_storage1 0
-        %340 = OpISub %uint %339 %uint_1
-        %341 = OpExtInst %uint %48 UMin %337 %340
-        %342 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %341 %uint_4
-        %344 = OpLoad %int %342 None
-        %345 = OpINotEqual %bool %344 %126
-               OpSelectionMerge %346 None
-               OpBranchConditional %345 %347 %346
-        %347 = OpLabel
-        %452 = OpLoad %v2float %_59_m None
-        %453 = OpVectorShuffle %v4float %452 %452 0 1 0 1
-        %454 = OpLoad %v4float %_62_f None
-   %_skTemp3 = OpExtInst %v4float %48 Step %453 %454
-        %456 = OpLoad %v4float %_62_f None
-        %457 = OpLoad %v2float %_59_m None
-        %458 = OpVectorShuffle %v4float %457 %457 0 1 0 1
-        %459 = OpFMul %v4float %_skTemp3 %458
-        %460 = OpFSub %v4float %456 %459
-               OpStore %_62_f %460 None
-               OpBranch %346
-        %346 = OpLabel
-        %348 = OpLoad %20 %permutationsSampler_1_Texture None
-        %349 = OpLoad %17 %permutationsSampler_1_Sampler None
-        %350 = OpAccessChain %_ptr_Function_float %_62_f %uint_0
-        %351 = OpLoad %float %350 None
-        %352 = OpFAdd %float %351 %float_0_5
-        %353 = OpFMul %float %352 %float_0_00390625
-        %355 = OpCompositeConstruct %v2float %353 %float_0_5
-        %356 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
-        %360 = OpSampledImage %361 %348 %349
-        %362 = OpImageSampleImplicitLod %v4float %360 %355 Bias %356
-      %_63_g = OpCompositeExtract %float %362 0
-        %364 = OpLoad %20 %permutationsSampler_1_Texture None
-        %365 = OpLoad %17 %permutationsSampler_1_Sampler None
-        %366 = OpAccessChain %_ptr_Function_float %_62_f %uint_2
-        %367 = OpLoad %float %366 None
-        %368 = OpFAdd %float %367 %float_0_5
-        %369 = OpFMul %float %368 %float_0_00390625
-        %370 = OpCompositeConstruct %v2float %369 %float_0_5
-        %371 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
-        %372 = OpSampledImage %361 %364 %365
-        %373 = OpImageSampleImplicitLod %v4float %372 %370 Bias %371
-      %_64_h = OpCompositeExtract %float %373 0
-        %375 = OpCompositeConstruct %v2float %_63_g %_64_h
-               OpStore %_65_i %375
-               OpSelectionMerge %377 None
-               OpBranchConditional %false %378 %377
-        %378 = OpLabel
-        %461 = OpLoad %v2float %_65_i None
-        %462 = OpFMul %v2float %461 %463
-        %465 = OpFAdd %v2float %462 %466
-   %_skTemp4 = OpExtInst %v2float %48 Floor %465
-        %468 = OpFMul %v2float %_skTemp4 %469
-               OpStore %_65_i %468 None
-               OpBranch %377
-        %377 = OpLabel
-        %380 = OpLoad %v2float %_65_i None
-        %381 = OpVectorShuffle %v4float %380 %380 0 1 0 1
-        %382 = OpVectorTimesScalar %v4float %381 %float_256
-        %384 = OpLoad %v4float %_62_f None
-        %385 = OpVectorShuffle %v4float %384 %384 1 1 3 3
-        %386 = OpFAdd %v4float %382 %385
-               OpStore %_66_j %386
-        %388 = OpLoad %v4float %_66_j None
-        %389 = OpFMul %v4float %388 %390
-               OpStore %_66_j %389 None
+        %331 = OpVectorShuffle %v2float %330 %330 2 3
+        %332 = OpCompositeConstruct %v4float %_skTemp2 %331
+               OpStore %_62_f %332 None
+        %333 = OpLoad %v4float %_62_f None
+        %334 = OpVectorShuffle %v2float %333 %333 0 1
+        %335 = OpLoad %v4float %_62_f None
+        %336 = OpVectorShuffle %v2float %335 %335 0 1
+        %337 = OpFAdd %v2float %336 %338
+        %339 = OpCompositeConstruct %v4float %334 %337
+               OpStore %_62_f %339 None
+        %340 = OpLoad %uint %shadingSsboIndex None
+        %341 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+        %342 = OpArrayLength %uint %_storage1 0
+        %343 = OpISub %uint %342 %uint_1
+        %344 = OpExtInst %uint %48 UMin %340 %343
+        %345 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %344 %uint_4
+        %347 = OpLoad %int %345 None
+        %348 = OpINotEqual %bool %347 %126
+               OpSelectionMerge %349 None
+               OpBranchConditional %348 %350 %349
+        %350 = OpLabel
+        %455 = OpLoad %v2float %_59_m None
+        %456 = OpVectorShuffle %v4float %455 %455 0 1 0 1
+        %457 = OpLoad %v4float %_62_f None
+   %_skTemp3 = OpExtInst %v4float %48 Step %456 %457
+        %459 = OpLoad %v4float %_62_f None
+        %460 = OpLoad %v2float %_59_m None
+        %461 = OpVectorShuffle %v4float %460 %460 0 1 0 1
+        %462 = OpFMul %v4float %_skTemp3 %461
+        %463 = OpFSub %v4float %459 %462
+               OpStore %_62_f %463 None
+               OpBranch %349
+        %349 = OpLabel
+        %351 = OpLoad %20 %permutationsSampler_1_Texture None
+        %352 = OpLoad %17 %permutationsSampler_1_Sampler None
+        %353 = OpAccessChain %_ptr_Function_float %_62_f %uint_0
+        %354 = OpLoad %float %353 None
+        %355 = OpFAdd %float %354 %float_0_5
+        %356 = OpFMul %float %355 %float_0_00390625
+        %358 = OpCompositeConstruct %v2float %356 %float_0_5
+        %359 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+        %363 = OpSampledImage %364 %351 %352
+        %365 = OpImageSampleImplicitLod %v4float %363 %358 Bias %359
+      %_63_g = OpCompositeExtract %float %365 0
+        %367 = OpLoad %20 %permutationsSampler_1_Texture None
+        %368 = OpLoad %17 %permutationsSampler_1_Sampler None
+        %369 = OpAccessChain %_ptr_Function_float %_62_f %uint_2
+        %370 = OpLoad %float %369 None
+        %371 = OpFAdd %float %370 %float_0_5
+        %372 = OpFMul %float %371 %float_0_00390625
+        %373 = OpCompositeConstruct %v2float %372 %float_0_5
+        %374 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+        %375 = OpSampledImage %364 %367 %368
+        %376 = OpImageSampleImplicitLod %v4float %375 %373 Bias %374
+      %_64_h = OpCompositeExtract %float %376 0
+        %378 = OpCompositeConstruct %v2float %_63_g %_64_h
+               OpStore %_65_i %378
+               OpSelectionMerge %380 None
+               OpBranchConditional %false %381 %380
+        %381 = OpLabel
+        %464 = OpLoad %v2float %_65_i None
+        %465 = OpFMul %v2float %464 %466
+        %468 = OpFAdd %v2float %465 %469
+   %_skTemp4 = OpExtInst %v2float %48 Floor %468
+        %471 = OpFMul %v2float %_skTemp4 %472
+               OpStore %_65_i %471 None
+               OpBranch %380
+        %380 = OpLabel
+        %383 = OpLoad %v2float %_65_i None
+        %384 = OpVectorShuffle %v4float %383 %383 0 1 0 1
+        %385 = OpVectorTimesScalar %v4float %384 %float_256
+        %387 = OpLoad %v4float %_62_f None
+        %388 = OpVectorShuffle %v4float %387 %387 1 1 3 3
+        %389 = OpFAdd %v4float %385 %388
+               OpStore %_66_j %389
+        %391 = OpLoad %v4float %_66_j None
+        %392 = OpFMul %v4float %391 %393
+               OpStore %_66_j %392 None
       %_67_p = OpLoad %v4float %_66_j None
-        %392 = OpLoad %v2float %_57_k None
-   %_skTemp5 = OpExtInst %v2float %48 Fract %392
-        %394 = OpFSub %v2float %_skTemp5 %395
-        %396 = OpFSub %v2float %335 %395
-        %397 = OpFDiv %v2float %394 %396
-        %398 = OpExtInst %v2float %48 NClamp %397 %395 %335
-        %399 = OpFMul %v2float %400 %398
-        %401 = OpFSub %v2float %402 %399
-        %403 = OpFMul %v2float %398 %401
-   %_skTemp6 = OpFMul %v2float %398 %403
+        %395 = OpLoad %v2float %_57_k None
+   %_skTemp5 = OpExtInst %v2float %48 Fract %395
+        %397 = OpFSub %v2float %_skTemp5 %398
+        %399 = OpFSub %v2float %338 %398
+        %400 = OpFDiv %v2float %397 %399
+        %401 = OpExtInst %v2float %48 NClamp %400 %398 %338
+        %402 = OpFMul %v2float %403 %401
+        %404 = OpFSub %v2float %405 %402
+        %406 = OpFMul %v2float %401 %404
+   %_skTemp6 = OpFMul %v2float %401 %406
                OpStore %_72_h %int_0
-               OpBranch %407
-        %407 = OpLabel
-               OpStore %tint_loop_idx_0 %160
                OpBranch %410
         %410 = OpLabel
-               OpLoopMerge %411 %409 None
-               OpBranch %408
-        %408 = OpLabel
-        %472 = OpLoad %v2uint %tint_loop_idx_0 None
-        %473 = OpIEqual %v2bool %472 %164
-        %474 = OpAll %bool %473
-               OpSelectionMerge %475 None
-               OpBranchConditional %474 %476 %475
-        %476 = OpLabel
+               OpStore %tint_loop_idx_0 %160
+               OpBranch %413
+        %413 = OpLabel
+               OpLoopMerge %414 %412 None
                OpBranch %411
-        %475 = OpLabel
-        %477 = OpLoad %int %_72_h None
-        %478 = OpConvertSToF %float %477
-        %479 = OpFAdd %float %478 %float_0_5
-      %_73_i = OpFMul %float %479 %float_0_25
-        %482 = OpLoad %20 %noiseSampler_1_Texture None
-        %483 = OpLoad %17 %noiseSampler_1_Sampler None
-        %484 = OpCompositeExtract %float %_67_p 0
-        %485 = OpCompositeConstruct %v2float %484 %_73_i
-        %486 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
-        %487 = OpSampledImage %361 %482 %483
-      %_74_j = OpImageSampleImplicitLod %v4float %487 %485 Bias %486
-        %489 = OpLoad %20 %noiseSampler_1_Texture None
-        %490 = OpLoad %17 %noiseSampler_1_Sampler None
-        %491 = OpCompositeExtract %float %_67_p 1
-        %492 = OpCompositeConstruct %v2float %491 %_73_i
-        %493 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
-        %494 = OpSampledImage %361 %489 %490
-      %_75_k = OpImageSampleImplicitLod %v4float %494 %492 Bias %493
-        %496 = OpLoad %20 %noiseSampler_1_Texture None
-        %497 = OpLoad %17 %noiseSampler_1_Sampler None
-        %498 = OpCompositeExtract %float %_67_p 3
-        %499 = OpCompositeConstruct %v2float %498 %_73_i
-        %500 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
-        %501 = OpSampledImage %361 %496 %497
-      %_76_l = OpImageSampleImplicitLod %v4float %501 %499 Bias %500
-        %503 = OpLoad %20 %noiseSampler_1_Texture None
-        %504 = OpLoad %17 %noiseSampler_1_Sampler None
-        %505 = OpCompositeExtract %float %_67_p 2
-        %506 = OpCompositeConstruct %v2float %505 %_73_i
-        %507 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
-        %508 = OpSampledImage %361 %503 %504
-      %_77_m = OpImageSampleImplicitLod %v4float %508 %506 Bias %507
-               OpStore %_78_n %_skTemp5
-        %511 = OpVectorShuffle %v2float %_74_j %_74_j 1 3
-        %512 = OpVectorShuffle %v2float %_74_j %_74_j 0 2
-        %513 = OpVectorTimesScalar %v2float %512 %float_0_00390625
-        %514 = OpFAdd %v2float %511 %513
-        %515 = OpVectorTimesScalar %v2float %514 %float_2
-        %516 = OpCompositeConstruct %v2float %float_1 %float_1
-        %517 = OpFSub %v2float %515 %516
-        %518 = OpLoad %v2float %_78_n None
-   %_skTemp7 = OpDot %float %517 %518
-               OpStore %_79_o %_skTemp7
-        %521 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
-        %522 = OpLoad %float %521 None
-        %523 = OpFSub %float %522 %float_1
-        %524 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
-               OpStore %524 %523 None
-        %525 = OpVectorShuffle %v2float %_75_k %_75_k 1 3
-        %526 = OpVectorShuffle %v2float %_75_k %_75_k 0 2
-        %527 = OpVectorTimesScalar %v2float %526 %float_0_00390625
-        %528 = OpFAdd %v2float %525 %527
-        %529 = OpVectorTimesScalar %v2float %528 %float_2
-        %530 = OpCompositeConstruct %v2float %float_1 %float_1
-        %531 = OpFSub %v2float %529 %530
-        %532 = OpLoad %v2float %_78_n None
-   %_skTemp8 = OpDot %float %531 %532
-               OpStore %_80_p %_skTemp8
-        %535 = OpLoad %float %_79_o None
-        %536 = OpLoad %float %_80_p None
-        %537 = OpCompositeExtract %float %_skTemp6 0
-   %_skTemp9 = OpExtInst %float %48 FMix %535 %536 %537
-        %539 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
-        %540 = OpLoad %float %539 None
-        %541 = OpFSub %float %540 %float_1
-        %542 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
-               OpStore %542 %541 None
-        %543 = OpVectorShuffle %v2float %_76_l %_76_l 1 3
-        %544 = OpVectorShuffle %v2float %_76_l %_76_l 0 2
-        %545 = OpVectorTimesScalar %v2float %544 %float_0_00390625
-        %546 = OpFAdd %v2float %543 %545
-        %547 = OpVectorTimesScalar %v2float %546 %float_2
-        %548 = OpCompositeConstruct %v2float %float_1 %float_1
-        %549 = OpFSub %v2float %547 %548
-        %550 = OpLoad %v2float %_78_n None
-  %_skTemp10 = OpDot %float %549 %550
-               OpStore %_80_p %_skTemp10 None
-        %552 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
-        %553 = OpLoad %float %552 None
-        %554 = OpFAdd %float %553 %float_1
-        %555 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
-               OpStore %555 %554 None
-        %556 = OpVectorShuffle %v2float %_77_m %_77_m 1 3
-        %557 = OpVectorShuffle %v2float %_77_m %_77_m 0 2
-        %558 = OpVectorTimesScalar %v2float %557 %float_0_00390625
-        %559 = OpFAdd %v2float %556 %558
-        %560 = OpVectorTimesScalar %v2float %559 %float_2
-        %561 = OpCompositeConstruct %v2float %float_1 %float_1
-        %562 = OpFSub %v2float %560 %561
-        %563 = OpLoad %v2float %_78_n None
-  %_skTemp11 = OpDot %float %562 %563
-               OpStore %_79_o %_skTemp11 None
-        %565 = OpLoad %float %_79_o None
-        %566 = OpLoad %float %_80_p None
-        %567 = OpCompositeExtract %float %_skTemp6 0
-  %_skTemp12 = OpExtInst %float %48 FMix %565 %566 %567
-        %569 = OpCompositeExtract %float %_skTemp6 1
-  %_skTemp13 = OpExtInst %float %48 FMix %_skTemp9 %_skTemp12 %569
-        %571 = OpLoad %int %_72_h None
-        %572 = OpBitcast %uint %571
-        %573 = OpExtInst %uint %48 UMin %572 %uint_3
-        %574 = OpAccessChain %_ptr_Function_float %_71_g %573
-               OpStore %574 %_skTemp13 None
-               OpBranch %409
-        %409 = OpLabel
-        %575 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-        %576 = OpLoad %uint %575 None
-        %577 = OpISub %uint %576 %uint_1
-        %578 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %578 %577 None
-        %579 = OpIEqual %bool %577 %uint_4294967295
-        %580 = OpSelect %uint %579 %uint_1 %uint_0
-        %581 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-        %582 = OpLoad %uint %581 None
-        %583 = OpISub %uint %582 %580
-        %584 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %584 %583 None
-        %585 = OpLoad %int %_72_h None
-        %586 = OpIAdd %int %585 %int_1
-               OpStore %_72_h %586 None
-        %587 = OpLoad %int %_72_h None
-        %588 = OpSGreaterThanEqual %bool %587 %int_4
-               OpBranchConditional %588 %411 %410
         %411 = OpLabel
-        %412 = OpLoad %v4float %_71_g None
-               OpStore %_83_q %412
-        %414 = OpINotEqual %bool %_56_d %int_0
-               OpSelectionMerge %415 None
-               OpBranchConditional %414 %416 %415
-        %416 = OpLabel
-        %590 = OpLoad %v4float %_83_q None
-  %_skTemp14 = OpExtInst %v4float %48 FAbs %590
+        %475 = OpLoad %v2uint %tint_loop_idx_0 None
+        %476 = OpIEqual %v2bool %475 %164
+        %477 = OpAll %bool %476
+               OpSelectionMerge %478 None
+               OpBranchConditional %477 %479 %478
+        %479 = OpLabel
+               OpBranch %414
+        %478 = OpLabel
+        %480 = OpLoad %int %_72_h None
+        %481 = OpConvertSToF %float %480
+        %482 = OpFAdd %float %481 %float_0_5
+      %_73_i = OpFMul %float %482 %float_0_25
+        %485 = OpLoad %20 %noiseSampler_1_Texture None
+        %486 = OpLoad %17 %noiseSampler_1_Sampler None
+        %487 = OpCompositeExtract %float %_67_p 0
+        %488 = OpCompositeConstruct %v2float %487 %_73_i
+        %489 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+        %490 = OpSampledImage %364 %485 %486
+      %_74_j = OpImageSampleImplicitLod %v4float %490 %488 Bias %489
+        %492 = OpLoad %20 %noiseSampler_1_Texture None
+        %493 = OpLoad %17 %noiseSampler_1_Sampler None
+        %494 = OpCompositeExtract %float %_67_p 1
+        %495 = OpCompositeConstruct %v2float %494 %_73_i
+        %496 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+        %497 = OpSampledImage %364 %492 %493
+      %_75_k = OpImageSampleImplicitLod %v4float %497 %495 Bias %496
+        %499 = OpLoad %20 %noiseSampler_1_Texture None
+        %500 = OpLoad %17 %noiseSampler_1_Sampler None
+        %501 = OpCompositeExtract %float %_67_p 3
+        %502 = OpCompositeConstruct %v2float %501 %_73_i
+        %503 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+        %504 = OpSampledImage %364 %499 %500
+      %_76_l = OpImageSampleImplicitLod %v4float %504 %502 Bias %503
+        %506 = OpLoad %20 %noiseSampler_1_Texture None
+        %507 = OpLoad %17 %noiseSampler_1_Sampler None
+        %508 = OpCompositeExtract %float %_67_p 2
+        %509 = OpCompositeConstruct %v2float %508 %_73_i
+        %510 = OpExtInst %float %48 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+        %511 = OpSampledImage %364 %506 %507
+      %_77_m = OpImageSampleImplicitLod %v4float %511 %509 Bias %510
+               OpStore %_78_n %_skTemp5
+        %514 = OpVectorShuffle %v2float %_74_j %_74_j 1 3
+        %515 = OpVectorShuffle %v2float %_74_j %_74_j 0 2
+        %516 = OpVectorTimesScalar %v2float %515 %float_0_00390625
+        %517 = OpFAdd %v2float %514 %516
+        %518 = OpVectorTimesScalar %v2float %517 %float_2
+        %519 = OpCompositeConstruct %v2float %float_1 %float_1
+        %520 = OpFSub %v2float %518 %519
+        %521 = OpLoad %v2float %_78_n None
+   %_skTemp7 = OpDot %float %520 %521
+               OpStore %_79_o %_skTemp7
+        %524 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+        %525 = OpLoad %float %524 None
+        %526 = OpFSub %float %525 %float_1
+        %527 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+               OpStore %527 %526 None
+        %528 = OpVectorShuffle %v2float %_75_k %_75_k 1 3
+        %529 = OpVectorShuffle %v2float %_75_k %_75_k 0 2
+        %530 = OpVectorTimesScalar %v2float %529 %float_0_00390625
+        %531 = OpFAdd %v2float %528 %530
+        %532 = OpVectorTimesScalar %v2float %531 %float_2
+        %533 = OpCompositeConstruct %v2float %float_1 %float_1
+        %534 = OpFSub %v2float %532 %533
+        %535 = OpLoad %v2float %_78_n None
+   %_skTemp8 = OpDot %float %534 %535
+               OpStore %_80_p %_skTemp8
+        %538 = OpLoad %float %_79_o None
+        %539 = OpLoad %float %_80_p None
+        %540 = OpCompositeExtract %float %_skTemp6 0
+   %_skTemp9 = OpExtInst %float %48 FMix %538 %539 %540
+        %542 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
+        %543 = OpLoad %float %542 None
+        %544 = OpFSub %float %543 %float_1
+        %545 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
+               OpStore %545 %544 None
+        %546 = OpVectorShuffle %v2float %_76_l %_76_l 1 3
+        %547 = OpVectorShuffle %v2float %_76_l %_76_l 0 2
+        %548 = OpVectorTimesScalar %v2float %547 %float_0_00390625
+        %549 = OpFAdd %v2float %546 %548
+        %550 = OpVectorTimesScalar %v2float %549 %float_2
+        %551 = OpCompositeConstruct %v2float %float_1 %float_1
+        %552 = OpFSub %v2float %550 %551
+        %553 = OpLoad %v2float %_78_n None
+  %_skTemp10 = OpDot %float %552 %553
+               OpStore %_80_p %_skTemp10 None
+        %555 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+        %556 = OpLoad %float %555 None
+        %557 = OpFAdd %float %556 %float_1
+        %558 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+               OpStore %558 %557 None
+        %559 = OpVectorShuffle %v2float %_77_m %_77_m 1 3
+        %560 = OpVectorShuffle %v2float %_77_m %_77_m 0 2
+        %561 = OpVectorTimesScalar %v2float %560 %float_0_00390625
+        %562 = OpFAdd %v2float %559 %561
+        %563 = OpVectorTimesScalar %v2float %562 %float_2
+        %564 = OpCompositeConstruct %v2float %float_1 %float_1
+        %565 = OpFSub %v2float %563 %564
+        %566 = OpLoad %v2float %_78_n None
+  %_skTemp11 = OpDot %float %565 %566
+               OpStore %_79_o %_skTemp11 None
+        %568 = OpLoad %float %_79_o None
+        %569 = OpLoad %float %_80_p None
+        %570 = OpCompositeExtract %float %_skTemp6 0
+  %_skTemp12 = OpExtInst %float %48 FMix %568 %569 %570
+        %572 = OpCompositeExtract %float %_skTemp6 1
+  %_skTemp13 = OpExtInst %float %48 FMix %_skTemp9 %_skTemp12 %572
+        %574 = OpLoad %int %_72_h None
+        %575 = OpBitcast %uint %574
+        %576 = OpExtInst %uint %48 UMin %575 %uint_3
+        %577 = OpAccessChain %_ptr_Function_float %_71_g %576
+               OpStore %577 %_skTemp13 None
+               OpBranch %412
+        %412 = OpLabel
+        %578 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+        %579 = OpLoad %uint %578 None
+        %580 = OpISub %uint %579 %uint_1
+        %581 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %581 %580 None
+        %582 = OpIEqual %bool %580 %uint_4294967295
+        %583 = OpSelect %uint %582 %uint_1 %uint_0
+        %584 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+        %585 = OpLoad %uint %584 None
+        %586 = OpISub %uint %585 %583
+        %587 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %587 %586 None
+        %588 = OpLoad %int %_72_h None
+        %589 = OpBitcast %uint %588
+        %590 = OpBitcast %uint %int_1
+        %591 = OpIAdd %uint %589 %590
+        %592 = OpBitcast %int %591
+               OpStore %_72_h %592 None
+        %593 = OpLoad %int %_72_h None
+        %594 = OpSGreaterThanEqual %bool %593 %int_4
+               OpBranchConditional %594 %414 %413
+        %414 = OpLabel
+        %415 = OpLoad %v4float %_71_g None
+               OpStore %_83_q %415
+        %417 = OpINotEqual %bool %_56_d %int_0
+               OpSelectionMerge %418 None
+               OpBranchConditional %417 %419 %418
+        %419 = OpLabel
+        %596 = OpLoad %v4float %_83_q None
+  %_skTemp14 = OpExtInst %v4float %48 FAbs %596
                OpStore %_83_q %_skTemp14 None
-               OpBranch %415
-        %415 = OpLabel
-        %417 = OpLoad %v4float %_58_l None
-        %418 = OpLoad %v4float %_83_q None
-        %419 = OpLoad %float %_60_n None
-        %420 = OpVectorTimesScalar %v4float %418 %419
-        %421 = OpFAdd %v4float %417 %420
-               OpStore %_58_l %421 None
-        %422 = OpLoad %v2float %_57_k None
-        %423 = OpFMul %v2float %422 %400
-               OpStore %_57_k %423 None
-        %424 = OpLoad %float %_60_n None
-        %425 = OpFMul %float %424 %float_0_5
-               OpStore %_60_n %425 None
-        %426 = OpLoad %v2float %_59_m None
-        %427 = OpFMul %v2float %426 %400
-               OpStore %_59_m %427 None
+               OpBranch %418
+        %418 = OpLabel
+        %420 = OpLoad %v4float %_58_l None
+        %421 = OpLoad %v4float %_83_q None
+        %422 = OpLoad %float %_60_n None
+        %423 = OpVectorTimesScalar %v4float %421 %422
+        %424 = OpFAdd %v4float %420 %423
+               OpStore %_58_l %424 None
+        %425 = OpLoad %v2float %_57_k None
+        %426 = OpFMul %v2float %425 %403
+               OpStore %_57_k %426 None
+        %427 = OpLoad %float %_60_n None
+        %428 = OpFMul %float %427 %float_0_5
+               OpStore %_60_n %428 None
+        %429 = OpLoad %v2float %_59_m None
+        %430 = OpFMul %v2float %429 %403
+               OpStore %_59_m %430 None
                OpBranch %178
         %180 = OpLabel
                OpBranch %89
@@ -611,18 +614,21 @@
         %191 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %191 %190 None
         %192 = OpLoad %int %_61_o None
-        %193 = OpIAdd %int %192 %int_1
-               OpStore %_61_o %193 None
+        %193 = OpBitcast %uint %192
+        %194 = OpBitcast %uint %int_1
+        %196 = OpIAdd %uint %193 %194
+        %197 = OpBitcast %int %196
+               OpStore %_61_o %197 None
                OpBranch %88
          %89 = OpLabel
          %90 = OpIEqual %bool %_56_d %int_0
                OpSelectionMerge %92 None
                OpBranchConditional %90 %93 %92
          %93 = OpLabel
-        %195 = OpLoad %v4float %_58_l None
-        %196 = OpFMul %v4float %195 %197
-        %198 = OpFAdd %v4float %196 %197
-               OpStore %_58_l %198 None
+        %198 = OpLoad %v4float %_58_l None
+        %199 = OpFMul %v4float %198 %200
+        %201 = OpFAdd %v4float %199 %200
+               OpStore %_58_l %201 None
                OpBranch %92
          %92 = OpLabel
          %94 = OpLoad %v4float %_58_l None
@@ -652,98 +658,98 @@
                OpSelectionMerge %127 None
                OpBranchConditional %125 %128 %129
         %128 = OpLabel
-        %200 = OpAccessChain %_ptr_Function_float %_84_a %uint_1
-        %201 = OpLoad %float %200 None
-        %202 = OpAccessChain %_ptr_Function_float %_84_a %uint_2
-        %203 = OpLoad %float %202 None
-        %204 = OpFOrdLessThan %bool %201 %203
-               OpSelectionMerge %205 None
-               OpBranchConditional %204 %206 %207
-        %206 = OpLabel
-        %428 = OpLoad %v4float %_84_a None
-        %429 = OpVectorShuffle %v2float %428 %428 2 1
-        %430 = OpCompositeConstruct %v4float %429 %float_n1 %float_0_666666687
-               OpStore %_skTemp18 %430 None
-               OpBranch %205
-        %207 = OpLabel
-        %432 = OpLoad %v4float %_84_a None
-        %433 = OpVectorShuffle %v2float %432 %432 1 2
-        %434 = OpCompositeConstruct %v4float %433 %float_0 %float_n0_333333343
-               OpStore %_skTemp18 %434 None
-               OpBranch %205
-        %205 = OpLabel
+        %203 = OpAccessChain %_ptr_Function_float %_84_a %uint_1
+        %204 = OpLoad %float %203 None
+        %205 = OpAccessChain %_ptr_Function_float %_84_a %uint_2
+        %206 = OpLoad %float %205 None
+        %207 = OpFOrdLessThan %bool %204 %206
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %210
+        %209 = OpLabel
+        %431 = OpLoad %v4float %_84_a None
+        %432 = OpVectorShuffle %v2float %431 %431 2 1
+        %433 = OpCompositeConstruct %v4float %432 %float_n1 %float_0_666666687
+               OpStore %_skTemp18 %433 None
+               OpBranch %208
+        %210 = OpLabel
+        %435 = OpLoad %v4float %_84_a None
+        %436 = OpVectorShuffle %v2float %435 %435 1 2
+        %437 = OpCompositeConstruct %v4float %436 %float_0 %float_n0_333333343
+               OpStore %_skTemp18 %437 None
+               OpBranch %208
+        %208 = OpLabel
       %_86_e = OpLoad %v4float %_skTemp18 None
-        %210 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
-        %211 = OpLoad %float %210 None
-        %212 = OpCompositeExtract %float %_86_e 0
-        %213 = OpFOrdLessThan %bool %211 %212
-               OpSelectionMerge %214 None
-               OpBranchConditional %213 %215 %216
-        %215 = OpLabel
-        %436 = OpCompositeExtract %float %_86_e 0
-        %437 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
-        %438 = OpLoad %float %437 None
-        %439 = OpVectorShuffle %v2float %_86_e %_86_e 1 3
-        %440 = OpCompositeConstruct %v4float %436 %438 %439
-               OpStore %_skTemp19 %440 None
-               OpBranch %214
-        %216 = OpLabel
-        %441 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
-        %442 = OpLoad %float %441 None
-        %443 = OpCompositeExtract %float %_86_e 0
-        %444 = OpVectorShuffle %v2float %_86_e %_86_e 1 2
-        %445 = OpCompositeConstruct %v4float %442 %443 %444
-               OpStore %_skTemp19 %445 None
-               OpBranch %214
-        %214 = OpLabel
+        %213 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
+        %214 = OpLoad %float %213 None
+        %215 = OpCompositeExtract %float %_86_e 0
+        %216 = OpFOrdLessThan %bool %214 %215
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %218 = OpLabel
+        %439 = OpCompositeExtract %float %_86_e 0
+        %440 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
+        %441 = OpLoad %float %440 None
+        %442 = OpVectorShuffle %v2float %_86_e %_86_e 1 3
+        %443 = OpCompositeConstruct %v4float %439 %441 %442
+               OpStore %_skTemp19 %443 None
+               OpBranch %217
+        %219 = OpLabel
+        %444 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
+        %445 = OpLoad %float %444 None
+        %446 = OpCompositeExtract %float %_86_e 0
+        %447 = OpVectorShuffle %v2float %_86_e %_86_e 1 2
+        %448 = OpCompositeConstruct %v4float %445 %446 %447
+               OpStore %_skTemp19 %448 None
+               OpBranch %217
+        %217 = OpLabel
       %_87_f = OpLoad %v4float %_skTemp19 None
       %_88_h = OpCompositeExtract %float %_87_f 0
-        %219 = OpCompositeExtract %float %_87_f 1
-        %220 = OpCompositeExtract %float %_87_f 2
-  %_skTemp20 = OpExtInst %float %48 NMin %219 %220
+        %222 = OpCompositeExtract %float %_87_f 1
+        %223 = OpCompositeExtract %float %_87_f 2
+  %_skTemp20 = OpExtInst %float %48 NMin %222 %223
       %_89_i = OpFSub %float %_88_h %_skTemp20
-        %223 = OpFMul %float %_89_i %float_0_5
-      %_90_j = OpFSub %float %_88_h %223
-        %225 = OpCompositeExtract %float %_87_f 3
-        %226 = OpCompositeExtract %float %_87_f 1
-        %227 = OpCompositeExtract %float %_87_f 2
-        %228 = OpFSub %float %226 %227
-        %229 = OpFMul %float %_89_i %float_6
-        %231 = OpFAdd %float %229 %float_9_99999975en05
-        %233 = OpFDiv %float %228 %231
-        %234 = OpFAdd %float %225 %233
-  %_skTemp21 = OpExtInst %float %48 FAbs %234
-        %236 = OpFMul %float %_90_j %float_2
-        %238 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
-        %239 = OpLoad %float %238 None
-        %240 = OpFSub %float %236 %239
-  %_skTemp22 = OpExtInst %float %48 FAbs %240
-        %242 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
-        %243 = OpLoad %float %242 None
-        %244 = OpFAdd %float %243 %float_9_99999975en05
-        %245 = OpFSub %float %244 %_skTemp22
-      %_92_l = OpFDiv %float %_89_i %245
-        %247 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
-        %248 = OpLoad %float %247 None
-        %249 = OpFAdd %float %248 %float_9_99999975en05
-      %_93_m = OpFDiv %float %_90_j %249
-        %251 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
-        %252 = OpLoad %float %251 None
-        %253 = OpCompositeConstruct %v4float %_skTemp21 %_92_l %_93_m %252
-               OpStore %_84_a %253 None
-               OpBranch %127
-        %129 = OpLabel
+        %226 = OpFMul %float %_89_i %float_0_5
+      %_90_j = OpFSub %float %_88_h %226
+        %228 = OpCompositeExtract %float %_87_f 3
+        %229 = OpCompositeExtract %float %_87_f 1
+        %230 = OpCompositeExtract %float %_87_f 2
+        %231 = OpFSub %float %229 %230
+        %232 = OpFMul %float %_89_i %float_6
+        %234 = OpFAdd %float %232 %float_9_99999975en05
+        %236 = OpFDiv %float %231 %234
+        %237 = OpFAdd %float %228 %236
+  %_skTemp21 = OpExtInst %float %48 FAbs %237
+        %239 = OpFMul %float %_90_j %float_2
+        %241 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+        %242 = OpLoad %float %241 None
+        %243 = OpFSub %float %239 %242
+  %_skTemp22 = OpExtInst %float %48 FAbs %243
+        %245 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+        %246 = OpLoad %float %245 None
+        %247 = OpFAdd %float %246 %float_9_99999975en05
+        %248 = OpFSub %float %247 %_skTemp22
+      %_92_l = OpFDiv %float %_89_i %248
+        %250 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+        %251 = OpLoad %float %250 None
+        %252 = OpFAdd %float %251 %float_9_99999975en05
+      %_93_m = OpFDiv %float %_90_j %252
         %254 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
         %255 = OpLoad %float %254 None
-  %_skTemp23 = OpExtInst %float %48 NMax %255 %float_9_99999975en05
-        %257 = OpLoad %v4float %_84_a None
-        %258 = OpVectorShuffle %v3float %257 %257 0 1 2
-        %259 = OpCompositeConstruct %v3float %_skTemp23 %_skTemp23 %_skTemp23
-        %260 = OpFDiv %v3float %258 %259
-        %261 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
-        %262 = OpLoad %float %261 None
-        %263 = OpCompositeConstruct %v4float %260 %262
-               OpStore %_84_a %263 None
+        %256 = OpCompositeConstruct %v4float %_skTemp21 %_92_l %_93_m %255
+               OpStore %_84_a %256 None
+               OpBranch %127
+        %129 = OpLabel
+        %257 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+        %258 = OpLoad %float %257 None
+  %_skTemp23 = OpExtInst %float %48 NMax %258 %float_9_99999975en05
+        %260 = OpLoad %v4float %_84_a None
+        %261 = OpVectorShuffle %v3float %260 %260 0 1 2
+        %262 = OpCompositeConstruct %v3float %_skTemp23 %_skTemp23 %_skTemp23
+        %263 = OpFDiv %v3float %261 %262
+        %264 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+        %265 = OpLoad %float %264 None
+        %266 = OpCompositeConstruct %v4float %263 %265
+               OpStore %_84_a %266 None
                OpBranch %127
         %127 = OpLabel
         %130 = OpLoad %uint %shadingSsboIndex None
@@ -768,75 +774,75 @@
                OpSelectionMerge %153 None
                OpBranchConditional %152 %154 %155
         %154 = OpLabel
-        %264 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
-        %265 = OpLoad %float %264 None
-        %266 = OpFMul %float %float_2 %265
-        %267 = OpFSub %float %266 %float_1
-  %_skTemp24 = OpExtInst %float %48 FAbs %267
-        %269 = OpFSub %float %float_1 %_skTemp24
-        %270 = OpAccessChain %_ptr_Function_float %_94_f %uint_1
-        %271 = OpLoad %float %270 None
-      %_95_b = OpFMul %float %269 %271
-        %273 = OpLoad %v4float %_94_f None
-        %274 = OpVectorShuffle %v3float %273 %273 0 0 0
-      %_96_c = OpFAdd %v3float %274 %276
+        %267 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
+        %268 = OpLoad %float %267 None
+        %269 = OpFMul %float %float_2 %268
+        %270 = OpFSub %float %269 %float_1
+  %_skTemp24 = OpExtInst %float %48 FAbs %270
+        %272 = OpFSub %float %float_1 %_skTemp24
+        %273 = OpAccessChain %_ptr_Function_float %_94_f %uint_1
+        %274 = OpLoad %float %273 None
+      %_95_b = OpFMul %float %272 %274
+        %276 = OpLoad %v4float %_94_f None
+        %277 = OpVectorShuffle %v3float %276 %276 0 0 0
+      %_96_c = OpFAdd %v3float %277 %279
   %_skTemp25 = OpExtInst %v3float %48 Fract %_96_c
-        %280 = OpVectorTimesScalar %v3float %_skTemp25 %float_6
-        %281 = OpCompositeConstruct %v3float %float_3 %float_3 %float_3
-        %283 = OpFSub %v3float %280 %281
-  %_skTemp26 = OpExtInst %v3float %48 FAbs %283
-        %285 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
-        %286 = OpFSub %v3float %_skTemp26 %285
-  %_skTemp27 = OpExtInst %v3float %48 NClamp %286 %288 %289
-        %290 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
-        %291 = OpFSub %v3float %_skTemp27 %290
-        %292 = OpVectorTimesScalar %v3float %291 %_95_b
-        %293 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
-        %294 = OpLoad %float %293 None
-        %295 = OpCompositeConstruct %v3float %294 %294 %294
-        %296 = OpFAdd %v3float %292 %295
-        %297 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
-        %298 = OpLoad %float %297 None
-        %299 = OpVectorTimesScalar %v3float %296 %298
+        %283 = OpVectorTimesScalar %v3float %_skTemp25 %float_6
+        %284 = OpCompositeConstruct %v3float %float_3 %float_3 %float_3
+        %286 = OpFSub %v3float %283 %284
+  %_skTemp26 = OpExtInst %v3float %48 FAbs %286
+        %288 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
+        %289 = OpFSub %v3float %_skTemp26 %288
+  %_skTemp27 = OpExtInst %v3float %48 NClamp %289 %291 %292
+        %293 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
+        %294 = OpFSub %v3float %_skTemp27 %293
+        %295 = OpVectorTimesScalar %v3float %294 %_95_b
+        %296 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
+        %297 = OpLoad %float %296 None
+        %298 = OpCompositeConstruct %v3float %297 %297 %297
+        %299 = OpFAdd %v3float %295 %298
         %300 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
         %301 = OpLoad %float %300 None
-        %302 = OpCompositeConstruct %v4float %299 %301
-  %_skTemp28 = OpExtInst %v4float %48 NClamp %302 %70 %96
+        %302 = OpVectorTimesScalar %v3float %299 %301
+        %303 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+        %304 = OpLoad %float %303 None
+        %305 = OpCompositeConstruct %v4float %302 %304
+  %_skTemp28 = OpExtInst %v4float %48 NClamp %305 %70 %96
                OpStore %_94_f %_skTemp28 None
                OpBranch %153
         %155 = OpLabel
-        %304 = OpLoad %uint %shadingSsboIndex None
-        %305 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
-        %306 = OpArrayLength %uint %_storage1 0
-        %307 = OpISub %uint %306 %uint_1
-        %308 = OpExtInst %uint %48 UMin %304 %307
-        %309 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %308 %uint_8
-        %311 = OpLoad %int %309 None
-        %312 = OpINotEqual %bool %311 %126
-               OpSelectionMerge %313 None
-               OpBranchConditional %312 %314 %315
-        %314 = OpLabel
-        %446 = OpLoad %v4float %_94_f None
-  %_skTemp29 = OpExtInst %v4float %48 NClamp %446 %70 %96
+        %307 = OpLoad %uint %shadingSsboIndex None
+        %308 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+        %309 = OpArrayLength %uint %_storage1 0
+        %310 = OpISub %uint %309 %uint_1
+        %311 = OpExtInst %uint %48 UMin %307 %310
+        %312 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %311 %uint_8
+        %314 = OpLoad %int %312 None
+        %315 = OpINotEqual %bool %314 %126
+               OpSelectionMerge %316 None
+               OpBranchConditional %315 %317 %318
+        %317 = OpLabel
+        %449 = OpLoad %v4float %_94_f None
+  %_skTemp29 = OpExtInst %v4float %48 NClamp %449 %70 %96
                OpStore %_94_f %_skTemp29 None
-               OpBranch %313
-        %315 = OpLabel
-        %448 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
-        %449 = OpLoad %float %448 None
-  %_skTemp30 = OpExtInst %float %48 NClamp %449 %float_0 %float_1
+               OpBranch %316
+        %318 = OpLabel
         %451 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
-               OpStore %451 %_skTemp30 None
-               OpBranch %313
-        %313 = OpLabel
-        %316 = OpLoad %v4float %_94_f None
-        %317 = OpVectorShuffle %v3float %316 %316 0 1 2
-        %318 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
-        %319 = OpLoad %float %318 None
-        %320 = OpVectorTimesScalar %v3float %317 %319
+        %452 = OpLoad %float %451 None
+  %_skTemp30 = OpExtInst %float %48 NClamp %452 %float_0 %float_1
+        %454 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+               OpStore %454 %_skTemp30 None
+               OpBranch %316
+        %316 = OpLabel
+        %319 = OpLoad %v4float %_94_f None
+        %320 = OpVectorShuffle %v3float %319 %319 0 1 2
         %321 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
         %322 = OpLoad %float %321 None
-        %323 = OpCompositeConstruct %v4float %320 %322
-               OpStore %_94_f %323 None
+        %323 = OpVectorTimesScalar %v3float %320 %322
+        %324 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+        %325 = OpLoad %float %324 None
+        %326 = OpCompositeConstruct %v4float %323 %325
+               OpStore %_94_f %326 None
                OpBranch %153
         %153 = OpLabel
  %outColor_0 = OpLoad %v4float %_94_f None
@@ -844,21 +850,21 @@
                OpStore %157 %outColor_0 None
                OpReturn
                OpFunctionEnd
- %main_inner = OpFunction %FSOut None %594
+ %main_inner = OpFunction %FSOut None %600
  %_stageIn_0 = OpFunctionParameter %FSIn
-        %595 = OpLabel
-  %_stageOut = OpVariable %_ptr_Function_FSOut Function %597
-        %598 = OpFunctionCall %void %_skslMain %_stageIn_0 %_stageOut
-        %599 = OpLoad %FSOut %_stageOut None
-               OpReturnValue %599
+        %601 = OpLabel
+  %_stageOut = OpVariable %_ptr_Function_FSOut Function %603
+        %604 = OpFunctionCall %void %_skslMain %_stageIn_0 %_stageOut
+        %605 = OpLoad %FSOut %_stageOut None
+               OpReturnValue %605
                OpFunctionEnd
-       %main = OpFunction %void None %601
-        %602 = OpLabel
-        %603 = OpLoad %v2uint %main_loc0_Input None
-        %604 = OpLoad %v2float %main_loc1_Input None
-        %605 = OpCompositeConstruct %FSIn %603 %604
-        %606 = OpFunctionCall %FSOut %main_inner %605
-        %607 = OpCompositeExtract %v4float %606 0
-               OpStore %main_loc0_Output %607 None
+       %main = OpFunction %void None %607
+        %608 = OpLabel
+        %609 = OpLoad %v2uint %main_loc0_Input None
+        %610 = OpLoad %v2float %main_loc1_Input None
+        %611 = OpCompositeConstruct %FSIn %609 %610
+        %612 = OpFunctionCall %FSOut %main_inner %611
+        %613 = OpCompositeExtract %v4float %612 0
+               OpStore %main_loc0_Output %613 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/948.wgsl.expected.glsl b/test/tint/bug/tint/948.wgsl.expected.glsl
index a566e95..1c43333 100644
--- a/test/tint/bug/tint/948.wgsl.expected.glsl
+++ b/test/tint/bug/tint/948.wgsl.expected.glsl
@@ -227,7 +227,8 @@
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
         int x_304 = i;
-        i = (x_304 + 1);
+        uint v_6 = uint(x_304);
+        i = int((v_6 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/bug/tint/948.wgsl.expected.spvasm b/test/tint/bug/tint/948.wgsl.expected.spvasm
index 0d6d1c0..d6b1143 100644
--- a/test/tint/bug/tint/948.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/948.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 418
+; Bound: 421
 ; Schema: 0
                OpCapability Shader
          %69 = OpExtInstImport "GLSL.std.450"
@@ -282,11 +282,11 @@
      %uint_2 = OpConstant %uint 2
 %_ptr_Function_uint = OpTypePointer Function %uint
       %int_1 = OpConstant %int 1
-        %283 = OpConstantComposite %v2float %float_0_5 %float_0_5
+        %286 = OpConstantComposite %v2float %float_0_5 %float_0_5
      %uint_3 = OpConstant %uint 3
     %float_8 = OpConstant %float 8
    %main_out = OpTypeStruct %v4float
-        %403 = OpTypeFunction %main_out %v2float %v2float %v2float %v2float %v3float %v2float
+        %406 = OpTypeFunction %main_out %v2float %v2float %v2float %v2float %v3float %v2float
 %getFrameData_f1_ = OpFunction %mat4v4float None %53
 %frameID_root = OpFunctionParameter %_ptr_Function_float
          %54 = OpLabel
@@ -412,31 +412,31 @@
                OpBranch %205
         %203 = OpLabel
       %x_150 = OpLoad %v2float %tileID None
-        %278 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
-      %x_154 = OpLoad %v2float %278 None
-        %280 = OpLoad %13 %tileMapsTexture1 None
-        %281 = OpLoad %16 %tileMapsSampler None
-        %282 = OpFAdd %v2float %x_150 %283
-        %284 = OpFDiv %v2float %282 %x_154
-        %285 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
-        %286 = OpSampledImage %73 %280 %281
-      %x_156 = OpImageSampleImplicitLod %v4float %286 %284 Bias %285
-        %288 = OpCompositeExtract %float %x_156 0
-               OpStore %frameID_1 %288 None
+        %281 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
+      %x_154 = OpLoad %v2float %281 None
+        %283 = OpLoad %13 %tileMapsTexture1 None
+        %284 = OpLoad %16 %tileMapsSampler None
+        %285 = OpFAdd %v2float %x_150 %286
+        %287 = OpFDiv %v2float %285 %x_154
+        %288 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
+        %289 = OpSampledImage %73 %283 %284
+      %x_156 = OpImageSampleImplicitLod %v4float %289 %287 Bias %288
+        %291 = OpCompositeExtract %float %x_156 0
+               OpStore %frameID_1 %291 None
                OpBranch %205
         %204 = OpLabel
       %x_136 = OpLoad %v2float %tileID None
-        %290 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
-      %x_140 = OpLoad %v2float %290 None
-        %292 = OpLoad %13 %tileMapsTexture0 None
-        %293 = OpLoad %16 %tileMapsSampler None
-        %294 = OpFAdd %v2float %x_136 %283
-        %295 = OpFDiv %v2float %294 %x_140
-        %296 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
-        %297 = OpSampledImage %73 %292 %293
-      %x_142 = OpImageSampleImplicitLod %v4float %297 %295 Bias %296
-        %299 = OpCompositeExtract %float %x_142 0
-               OpStore %frameID_1 %299 None
+        %293 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
+      %x_140 = OpLoad %v2float %293 None
+        %295 = OpLoad %13 %tileMapsTexture0 None
+        %296 = OpLoad %16 %tileMapsSampler None
+        %297 = OpFAdd %v2float %x_136 %286
+        %298 = OpFDiv %v2float %297 %x_140
+        %299 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
+        %300 = OpSampledImage %73 %295 %296
+      %x_142 = OpImageSampleImplicitLod %v4float %300 %298 Bias %299
+        %302 = OpCompositeExtract %float %x_142 0
+               OpStore %frameID_1 %302 None
                OpBranch %205
         %205 = OpLabel
       %x_166 = OpLoad %float %frameID_1 None
@@ -457,73 +457,73 @@
                OpSelectionMerge %220 None
                OpBranchConditional %219 %221 %220
         %221 = OpLabel
-        %300 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_0
-      %x_181 = OpLoad %float %300 None
-        %302 = OpAccessChain %_ptr_Function_float %animationData %uint_2
-      %x_184 = OpLoad %float %302 None
-        %304 = OpFMul %float %x_181 %x_184
-        %305 = OpFRem %float %304 %float_1
-               OpStore %mt %305 None
+        %303 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_0
+      %x_181 = OpLoad %float %303 None
+        %305 = OpAccessChain %_ptr_Function_float %animationData %uint_2
+      %x_184 = OpLoad %float %305 None
+        %307 = OpFMul %float %x_181 %x_184
+        %308 = OpFRem %float %307 %float_1
+               OpStore %mt %308 None
                OpStore %f %float_0 None
-               OpBranch %306
-        %306 = OpLabel
-               OpStore %tint_loop_idx_0 %186
                OpBranch %309
         %309 = OpLabel
-               OpLoopMerge %310 %308 None
-               OpBranch %307
-        %307 = OpLabel
-        %361 = OpLoad %v2uint %tint_loop_idx_0 None
-        %362 = OpIEqual %v2bool %361 %190
-        %363 = OpAll %bool %362
-               OpSelectionMerge %364 None
-               OpBranchConditional %363 %365 %364
-        %365 = OpLabel
+               OpStore %tint_loop_idx_0 %186
+               OpBranch %312
+        %312 = OpLabel
+               OpLoopMerge %313 %311 None
                OpBranch %310
-        %364 = OpLabel
+        %310 = OpLabel
+        %364 = OpLoad %v2uint %tint_loop_idx_0 None
+        %365 = OpIEqual %v2bool %364 %190
+        %366 = OpAll %bool %365
+               OpSelectionMerge %367 None
+               OpBranchConditional %366 %368 %367
+        %368 = OpLabel
+               OpBranch %313
+        %367 = OpLabel
       %x_193 = OpLoad %float %f None
-        %367 = OpFOrdLessThan %bool %x_193 %float_8
-               OpSelectionMerge %369 None
-               OpBranchConditional %367 %369 %370
-        %370 = OpLabel
-               OpBranch %310
-        %369 = OpLabel
-        %371 = OpAccessChain %_ptr_Function_float %animationData %uint_1
-      %x_197 = OpLoad %float %371 None
+        %370 = OpFOrdLessThan %bool %x_193 %float_8
+               OpSelectionMerge %372 None
+               OpBranchConditional %370 %372 %373
+        %373 = OpLabel
+               OpBranch %313
+        %372 = OpLabel
+        %374 = OpAccessChain %_ptr_Function_float %animationData %uint_1
+      %x_197 = OpLoad %float %374 None
       %x_198 = OpLoad %float %mt None
-        %374 = OpFOrdGreaterThan %bool %x_197 %x_198
-               OpSelectionMerge %375 None
-               OpBranchConditional %374 %376 %375
-        %376 = OpLabel
-        %393 = OpAccessChain %_ptr_Function_float %animationData %uint_0
-      %x_203 = OpLoad %float %393 None
+        %377 = OpFOrdGreaterThan %bool %x_197 %x_198
+               OpSelectionMerge %378 None
+               OpBranchConditional %377 %379 %378
+        %379 = OpLabel
+        %396 = OpAccessChain %_ptr_Function_float %animationData %uint_0
+      %x_203 = OpLoad %float %396 None
                OpStore %frameID_1 %x_203 None
-               OpBranch %310
-        %375 = OpLabel
+               OpBranch %313
+        %378 = OpLabel
       %x_208 = OpLoad %float %frameID_1 None
-        %378 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_7
-      %x_211 = OpLoad %float %378 None
+        %381 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_7
+      %x_211 = OpLoad %float %381 None
       %x_214 = OpLoad %float %f None
                OpStore %animationData %x_217 None
-               OpBranch %308
-        %308 = OpLabel
-        %381 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-        %382 = OpLoad %uint %381 None
-%tint_low_inc_1 = OpISub %uint %382 %uint_1
+               OpBranch %311
+        %311 = OpLabel
         %384 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %384 %tint_low_inc_1 None
-        %385 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %385 %uint_1 %uint_0
-        %387 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-        %388 = OpLoad %uint %387 None
-        %389 = OpISub %uint %388 %tint_carry_1
+        %385 = OpLoad %uint %384 None
+%tint_low_inc_1 = OpISub %uint %385 %uint_1
+        %387 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %387 %tint_low_inc_1 None
+        %388 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %388 %uint_1 %uint_0
         %390 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %390 %389 None
+        %391 = OpLoad %uint %390 None
+        %392 = OpISub %uint %391 %tint_carry_1
+        %393 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %393 %392 None
       %x_218 = OpLoad %float %f None
-        %392 = OpFAdd %float %x_218 %float_1
-               OpStore %f %392 None
-               OpBranch %309
-        %310 = OpLabel
+        %395 = OpFAdd %float %x_218 %float_1
+               OpStore %f %395 None
+               OpBranch %312
+        %313 = OpLabel
                OpBranch %220
         %220 = OpLabel
       %x_222 = OpLoad %float %frameID_1 None
@@ -568,10 +568,10 @@
                OpBranchConditional %255 %257 %256
         %257 = OpLabel
       %x_252 = OpLoad %v2float %tileUV None
-        %312 = OpCompositeExtract %float %x_252 1
-        %313 = OpCompositeExtract %float %x_252 0
-        %314 = OpCompositeConstruct %v2float %312 %313
-               OpStore %tileUV %314 None
+        %315 = OpCompositeExtract %float %x_252 1
+        %316 = OpCompositeExtract %float %x_252 0
+        %317 = OpCompositeConstruct %v2float %315 %316
+               OpStore %tileUV %317 None
                OpBranch %256
         %256 = OpLabel
       %x_254 = OpLoad %int %i None
@@ -582,54 +582,54 @@
       %x_263 = OpLoad %v2float %tileUV None
       %x_264 = OpLoad %v2float %frameSize None
       %x_266 = OpLoad %v2float %offset_1 None
-        %318 = OpLoad %13 %spriteSheetTexture None
-        %319 = OpLoad %16 %spriteSheetSampler None
-        %320 = OpFMul %v2float %x_263 %x_264
-        %321 = OpFAdd %v2float %320 %x_266
-        %322 = OpSampledImage %73 %318 %319
-      %x_268 = OpImageSampleImplicitLod %v4float %322 %321 None
+        %321 = OpLoad %13 %spriteSheetTexture None
+        %322 = OpLoad %16 %spriteSheetSampler None
+        %323 = OpFMul %v2float %x_263 %x_264
+        %324 = OpFAdd %v2float %323 %x_266
+        %325 = OpSampledImage %73 %321 %322
+      %x_268 = OpImageSampleImplicitLod %v4float %325 %324 None
                OpStore %color %x_268 None
                OpBranch %260
         %262 = OpLabel
       %x_274 = OpLoad %v2float %tileUV None
       %x_275 = OpLoad %v2float %frameSize None
       %x_277 = OpLoad %v2float %offset_1 None
-        %327 = OpLoad %13 %spriteSheetTexture None
-        %328 = OpLoad %16 %spriteSheetSampler None
-        %329 = OpFMul %v2float %x_274 %x_275
-        %330 = OpFAdd %v2float %329 %x_277
-        %331 = OpSampledImage %73 %327 %328
-      %x_279 = OpImageSampleImplicitLod %v4float %331 %330 None
+        %330 = OpLoad %13 %spriteSheetTexture None
+        %331 = OpLoad %16 %spriteSheetSampler None
+        %332 = OpFMul %v2float %x_274 %x_275
+        %333 = OpFAdd %v2float %332 %x_277
+        %334 = OpSampledImage %73 %330 %331
+      %x_279 = OpImageSampleImplicitLod %v4float %334 %333 None
                OpStore %nc %x_279 None
-        %333 = OpAccessChain %_ptr_Function_float %color %uint_3
-      %x_283 = OpLoad %float %333 None
-        %336 = OpAccessChain %_ptr_Function_float %nc %uint_3
-      %x_285 = OpLoad %float %336 None
-        %338 = OpFAdd %float %x_283 %x_285
-        %339 = OpExtInst %float %69 NMin %338 %float_1
-               OpStore %alpha %339 None
+        %336 = OpAccessChain %_ptr_Function_float %color %uint_3
+      %x_283 = OpLoad %float %336 None
+        %339 = OpAccessChain %_ptr_Function_float %nc %uint_3
+      %x_285 = OpLoad %float %339 None
+        %341 = OpFAdd %float %x_283 %x_285
+        %342 = OpExtInst %float %69 NMin %341 %float_1
+               OpStore %alpha %342 None
       %x_290 = OpLoad %v4float %color None
       %x_292 = OpLoad %v4float %nc None
-        %342 = OpAccessChain %_ptr_Function_float %nc %uint_3
-      %x_295 = OpLoad %float %342 None
-        %344 = OpCompositeExtract %float %x_290 0
-        %345 = OpCompositeExtract %float %x_290 1
-        %346 = OpCompositeExtract %float %x_290 2
-        %347 = OpCompositeConstruct %v3float %344 %345 %346
-        %348 = OpCompositeExtract %float %x_292 0
-        %349 = OpCompositeExtract %float %x_292 1
-        %350 = OpCompositeExtract %float %x_292 2
-        %351 = OpCompositeConstruct %v3float %348 %349 %350
-        %352 = OpCompositeConstruct %v3float %x_295 %x_295 %x_295
-        %353 = OpExtInst %v3float %69 FMix %347 %351 %352
-               OpStore %mixed %353 None
+        %345 = OpAccessChain %_ptr_Function_float %nc %uint_3
+      %x_295 = OpLoad %float %345 None
+        %347 = OpCompositeExtract %float %x_290 0
+        %348 = OpCompositeExtract %float %x_290 1
+        %349 = OpCompositeExtract %float %x_290 2
+        %350 = OpCompositeConstruct %v3float %347 %348 %349
+        %351 = OpCompositeExtract %float %x_292 0
+        %352 = OpCompositeExtract %float %x_292 1
+        %353 = OpCompositeExtract %float %x_292 2
+        %354 = OpCompositeConstruct %v3float %351 %352 %353
+        %355 = OpCompositeConstruct %v3float %x_295 %x_295 %x_295
+        %356 = OpExtInst %v3float %69 FMix %350 %354 %355
+               OpStore %mixed %356 None
       %x_298 = OpLoad %v3float %mixed None
       %x_299 = OpLoad %float %alpha None
-        %356 = OpCompositeExtract %float %x_298 0
-        %357 = OpCompositeExtract %float %x_298 1
-        %358 = OpCompositeExtract %float %x_298 2
-        %359 = OpCompositeConstruct %v4float %356 %357 %358 %x_299
-               OpStore %color %359 None
+        %359 = OpCompositeExtract %float %x_298 0
+        %360 = OpCompositeExtract %float %x_298 1
+        %361 = OpCompositeExtract %float %x_298 2
+        %362 = OpCompositeConstruct %v4float %359 %360 %361 %x_299
+               OpStore %color %362 None
                OpBranch %260
         %260 = OpLabel
                OpBranch %163
@@ -647,8 +647,11 @@
         %273 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %273 %272 None
       %x_304 = OpLoad %int %i None
-        %275 = OpIAdd %int %x_304 %int_1
-               OpStore %i %275 None
+        %275 = OpBitcast %uint %x_304
+        %276 = OpBitcast %uint %int_1
+        %278 = OpIAdd %uint %275 %276
+        %279 = OpBitcast %int %278
+               OpStore %i %279 None
                OpBranch %164
         %165 = OpLabel
         %166 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0 %uint_8
@@ -670,35 +673,35 @@
                OpStore %glFragColor %x_318 None
                OpReturn
                OpFunctionEnd
- %main_inner = OpFunction %main_out None %403
+ %main_inner = OpFunction %main_out None %406
   %tUV_param = OpFunctionParameter %v2float
 %tileID_1_param = OpFunctionParameter %v2float
 %levelUnits_param = OpFunctionParameter %v2float
 %stageUnits_1_param = OpFunctionParameter %v2float
 %vPosition_param = OpFunctionParameter %v3float
   %vUV_param = OpFunctionParameter %v2float
-        %404 = OpLabel
+        %407 = OpLabel
                OpStore %tUV %tUV_param None
                OpStore %tileID_1 %tileID_1_param None
                OpStore %levelUnits %levelUnits_param None
                OpStore %stageUnits_1 %stageUnits_1_param None
                OpStore %vPosition %vPosition_param None
                OpStore %vUV %vUV_param None
-        %405 = OpFunctionCall %void %main_1
-        %406 = OpLoad %v4float %glFragColor None
-        %407 = OpCompositeConstruct %main_out %406
-               OpReturnValue %407
+        %408 = OpFunctionCall %void %main_1
+        %409 = OpLoad %v4float %glFragColor None
+        %410 = OpCompositeConstruct %main_out %409
+               OpReturnValue %410
                OpFunctionEnd
        %main = OpFunction %void None %109
-        %409 = OpLabel
-        %410 = OpLoad %v2float %main_loc2_Input None
-        %411 = OpLoad %v2float %main_loc5_Input None
-        %412 = OpLoad %v2float %main_loc4_Input None
-        %413 = OpLoad %v2float %main_loc3_Input None
-        %414 = OpLoad %v3float %main_loc0_Input None
-        %415 = OpLoad %v2float %main_loc1_Input None
-        %416 = OpFunctionCall %main_out %main_inner %410 %411 %412 %413 %414 %415
-        %417 = OpCompositeExtract %v4float %416 0
-               OpStore %main_loc0_Output %417 None
+        %412 = OpLabel
+        %413 = OpLoad %v2float %main_loc2_Input None
+        %414 = OpLoad %v2float %main_loc5_Input None
+        %415 = OpLoad %v2float %main_loc4_Input None
+        %416 = OpLoad %v2float %main_loc3_Input None
+        %417 = OpLoad %v3float %main_loc0_Input None
+        %418 = OpLoad %v2float %main_loc1_Input None
+        %419 = OpFunctionCall %main_out %main_inner %413 %414 %415 %416 %417 %418
+        %420 = OpCompositeExtract %v4float %419 0
+               OpStore %main_loc0_Output %420 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/949.wgsl.expected.glsl b/test/tint/bug/tint/949.wgsl.expected.glsl
index 13c1434..c6c2792 100644
--- a/test/tint/bug/tint/949.wgsl.expected.glsl
+++ b/test/tint/bug/tint/949.wgsl.expected.glsl
@@ -368,7 +368,8 @@
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
         int x_441 = i;
-        i = (x_441 + 1);
+        uint v_7 = uint(x_441);
+        i = int((v_7 + uint(1)));
       }
       continue;
     }
@@ -443,10 +444,10 @@
   vec3 x_548 = output3;
   glFragColor = vec4(x_548.x, x_548.y, x_548.z, 1.0f);
 }
-main_out main_inner(vec2 vMainuv_param, vec4 v_output1_param, bool v_7, vec2 v_uv_param, vec4 v_output2_param) {
+main_out main_inner(vec2 vMainuv_param, vec4 v_output1_param, bool v_8, vec2 v_uv_param, vec4 v_output2_param) {
   vMainuv = vMainuv_param;
   v_output1 = v_output1_param;
-  v_1 = v_7;
+  v_1 = v_8;
   v_uv = v_uv_param;
   v_output2 = v_output2_param;
   main_1();
diff --git a/test/tint/bug/tint/949.wgsl.expected.spvasm b/test/tint/bug/tint/949.wgsl.expected.spvasm
index e2f7734..31b8a9e 100644
--- a/test/tint/bug/tint/949.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/949.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 645
+; Bound: 648
 ; Schema: 0
                OpCapability Shader
          %83 = OpExtInstImport "GLSL.std.450"
@@ -475,7 +475,7 @@
 %_ptr_Function_uint = OpTypePointer Function %uint
       %int_1 = OpConstant %int 1
    %main_out = OpTypeStruct %v4float
-        %631 = OpTypeFunction %main_out %v2float %v4float %bool %v2float %v4float
+        %634 = OpTypeFunction %main_out %v2float %v4float %bool %v2float %v4float
 %cotangent_frame_vf3_vf3_vf2_vf2_ = OpFunction %mat3v3float None %60
 %normal_1_root = OpFunctionParameter %_ptr_Function_v3float
      %p_root = OpFunctionParameter %_ptr_Function_v3float
@@ -934,43 +934,43 @@
         %577 = OpLabel
       %x_406 = OpLoad %float %currSampledHeight None
       %x_407 = OpLoad %float %currRayHeight None
-        %595 = OpFSub %float %x_406 %x_407
-               OpStore %delta1 %595 None
+        %598 = OpFSub %float %x_406 %x_407
+               OpStore %delta1 %598 None
       %x_410 = OpLoad %float %currRayHeight None
       %x_411 = OpLoad %float %stepSize None
       %x_413 = OpLoad %float %lastSampledHeight None
-        %599 = OpFAdd %float %x_410 %x_411
-        %600 = OpFSub %float %599 %x_413
-               OpStore %delta2 %600 None
+        %602 = OpFAdd %float %x_410 %x_411
+        %603 = OpFSub %float %602 %x_413
+               OpStore %delta2 %603 None
       %x_416 = OpLoad %float %delta1 None
       %x_417 = OpLoad %float %delta1 None
       %x_418 = OpLoad %float %delta2 None
-        %604 = OpFAdd %float %x_417 %x_418
-        %605 = OpFDiv %float %x_416 %604
-               OpStore %ratio %605 None
+        %607 = OpFAdd %float %x_417 %x_418
+        %608 = OpFDiv %float %x_416 %607
+               OpStore %ratio %608 None
       %x_421 = OpLoad %float %ratio None
       %x_422 = OpLoad %v2float %vLastOffset None
       %x_424 = OpLoad %float %ratio None
       %x_426 = OpLoad %v2float %vCurrOffset None
-        %610 = OpVectorTimesScalar %v2float %x_422 %x_421
-        %611 = OpFSub %float %float_1 %x_424
-        %612 = OpVectorTimesScalar %v2float %x_426 %611
-        %613 = OpFAdd %v2float %610 %612
-               OpStore %vCurrOffset %613 None
+        %613 = OpVectorTimesScalar %v2float %x_422 %x_421
+        %614 = OpFSub %float %float_1 %x_424
+        %615 = OpVectorTimesScalar %v2float %x_426 %614
+        %616 = OpFAdd %v2float %613 %615
+               OpStore %vCurrOffset %616 None
                OpBranch %448
         %578 = OpLabel
       %x_431 = OpLoad %float %stepSize None
       %x_432 = OpLoad %float %currRayHeight None
-        %616 = OpFSub %float %x_432 %x_431
-               OpStore %currRayHeight %616 None
+        %619 = OpFSub %float %x_432 %x_431
+               OpStore %currRayHeight %619 None
       %x_434 = OpLoad %v2float %vCurrOffset None
                OpStore %vLastOffset %x_434 None
       %x_435 = OpLoad %float %stepSize None
       %x_436 = OpLoad %v2float %vMaxOffset None
       %x_438 = OpLoad %v2float %vCurrOffset None
-        %621 = OpVectorTimesScalar %v2float %x_436 %x_435
-        %622 = OpFAdd %v2float %x_438 %621
-               OpStore %vCurrOffset %622 None
+        %624 = OpVectorTimesScalar %v2float %x_436 %x_435
+        %625 = OpFAdd %v2float %x_438 %624
+               OpStore %vCurrOffset %625 None
       %x_440 = OpLoad %float %currSampledHeight None
                OpStore %lastSampledHeight %x_440 None
                OpBranch %576
@@ -990,8 +990,11 @@
         %589 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %589 %588 None
       %x_441 = OpLoad %int %i None
-        %591 = OpIAdd %int %x_441 %int_1
-               OpStore %i %591 None
+        %591 = OpBitcast %uint %x_441
+        %592 = OpBitcast %uint %int_1
+        %594 = OpIAdd %uint %591 %592
+        %595 = OpBitcast %int %594
+               OpStore %i %595 None
                OpBranch %447
         %448 = OpLabel
       %x_444 = OpLoad %v2float %vCurrOffset None
@@ -1125,32 +1128,32 @@
                OpStore %glFragColor %549 None
                OpReturn
                OpFunctionEnd
- %main_inner = OpFunction %main_out None %631
+ %main_inner = OpFunction %main_out None %634
 %vMainuv_param = OpFunctionParameter %v2float
 %v_output1_param = OpFunctionParameter %v4float
 %gl_FrontFacing_param = OpFunctionParameter %bool
  %v_uv_param = OpFunctionParameter %v2float
 %v_output2_param = OpFunctionParameter %v4float
-        %632 = OpLabel
+        %635 = OpLabel
                OpStore %vMainuv %vMainuv_param None
                OpStore %v_output1 %v_output1_param None
                OpStore %gl_FrontFacing %gl_FrontFacing_param None
                OpStore %v_uv %v_uv_param None
                OpStore %v_output2 %v_output2_param None
-        %633 = OpFunctionCall %void %main_1
-        %634 = OpLoad %v4float %glFragColor None
-        %635 = OpCompositeConstruct %main_out %634
-               OpReturnValue %635
+        %636 = OpFunctionCall %void %main_1
+        %637 = OpLoad %v4float %glFragColor None
+        %638 = OpCompositeConstruct %main_out %637
+               OpReturnValue %638
                OpFunctionEnd
        %main = OpFunction %void None %280
-        %637 = OpLabel
-        %638 = OpLoad %v2float %main_loc1_Input None
-        %639 = OpLoad %v4float %main_loc0_Input None
-        %640 = OpLoad %bool %main_front_facing_Input None
-        %641 = OpLoad %v2float %main_loc3_Input None
-        %642 = OpLoad %v4float %main_loc2_Input None
-        %643 = OpFunctionCall %main_out %main_inner %638 %639 %640 %641 %642
-        %644 = OpCompositeExtract %v4float %643 0
-               OpStore %main_loc0_Output %644 None
+        %640 = OpLabel
+        %641 = OpLoad %v2float %main_loc1_Input None
+        %642 = OpLoad %v4float %main_loc0_Input None
+        %643 = OpLoad %bool %main_front_facing_Input None
+        %644 = OpLoad %v2float %main_loc3_Input None
+        %645 = OpLoad %v4float %main_loc2_Input None
+        %646 = OpFunctionCall %main_out %main_inner %641 %642 %643 %644 %645
+        %647 = OpCompositeExtract %v4float %646 0
+               OpStore %main_loc0_Output %647 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
index e39d9fe..190adc4 100644
--- a/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
@@ -19,7 +19,7 @@
   SB_RW inner;
 } v_1;
 int atomicSub_051100() {
-  int res = atomicAdd(v_1.inner.arg_0, -(1));
+  int res = atomicAdd(v_1.inner.arg_0, int((~(uint(1)) + 1u)));
   return res;
 }
 void main() {
@@ -44,7 +44,7 @@
   SB_RW inner;
 } v_1;
 int atomicSub_051100() {
-  int res = atomicAdd(v_1.inner.arg_0, -(1));
+  int res = atomicAdd(v_1.inner.arg_0, int((~(uint(1)) + 1u)));
   return res;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.glsl
index 9f4a885..7128896 100644
--- a/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.glsl
@@ -6,7 +6,7 @@
 } v;
 shared int arg_0;
 int atomicSub_77883a() {
-  int res = atomicAdd(arg_0, -(1));
+  int res = atomicAdd(arg_0, int((~(uint(1)) + 1u)));
   return res;
 }
 void compute_main_inner(uint tint_local_index) {
diff --git a/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl
index 49caf03..fce7287 100644
--- a/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl
@@ -20,7 +20,7 @@
 } v_1;
 int atomicSub_051100() {
   int arg_1 = 1;
-  int res = atomicAdd(v_1.inner.arg_0, -(arg_1));
+  int res = atomicAdd(v_1.inner.arg_0, int((~(uint(arg_1)) + 1u)));
   return res;
 }
 void main() {
@@ -46,7 +46,7 @@
 } v_1;
 int atomicSub_051100() {
   int arg_1 = 1;
-  int res = atomicAdd(v_1.inner.arg_0, -(arg_1));
+  int res = atomicAdd(v_1.inner.arg_0, int((~(uint(arg_1)) + 1u)));
   return res;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/builtins/gen/var/atomicSub/77883a.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicSub/77883a.wgsl.expected.glsl
index 65821ba..4aa1ecd 100644
--- a/test/tint/builtins/gen/var/atomicSub/77883a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicSub/77883a.wgsl.expected.glsl
@@ -7,7 +7,7 @@
 shared int arg_0;
 int atomicSub_77883a() {
   int arg_1 = 1;
-  int res = atomicAdd(arg_0, -(arg_1));
+  int res = atomicAdd(arg_0, int((~(uint(arg_1)) + 1u)));
   return res;
 }
 void compute_main_inner(uint tint_local_index) {
diff --git a/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.glsl b/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.glsl
index 6276acf..95899c7 100644
--- a/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.glsl
@@ -10,7 +10,20 @@
   int inner;
 } v;
 int tint_int_dot(ivec4 x, ivec4 y) {
-  return ((((x.x * y.x) + (x.y * y.y)) + (x.z * y.z)) + (x.w * y.w));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  int v_6 = int((v_5 + uint(v_4)));
+  uint v_7 = uint(x.z);
+  int v_8 = int((v_7 * uint(y.z)));
+  uint v_9 = uint(v_6);
+  int v_10 = int((v_9 + uint(v_8)));
+  uint v_11 = uint(x.w);
+  int v_12 = int((v_11 * uint(y.w)));
+  uint v_13 = uint(v_10);
+  return int((v_13 + uint(v_12)));
 }
 int dot_ef6b1d() {
   ivec4 arg_0 = ivec4(1);
@@ -31,7 +44,20 @@
   int inner;
 } v;
 int tint_int_dot(ivec4 x, ivec4 y) {
-  return ((((x.x * y.x) + (x.y * y.y)) + (x.z * y.z)) + (x.w * y.w));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  int v_6 = int((v_5 + uint(v_4)));
+  uint v_7 = uint(x.z);
+  int v_8 = int((v_7 * uint(y.z)));
+  uint v_9 = uint(v_6);
+  int v_10 = int((v_9 + uint(v_8)));
+  uint v_11 = uint(x.w);
+  int v_12 = int((v_11 * uint(y.w)));
+  uint v_13 = uint(v_10);
+  return int((v_13 + uint(v_12)));
 }
 int dot_ef6b1d() {
   ivec4 arg_0 = ivec4(1);
@@ -56,7 +82,20 @@
 
 layout(location = 0) flat out int tint_interstage_location0;
 int tint_int_dot(ivec4 x, ivec4 y) {
-  return ((((x.x * y.x) + (x.y * y.y)) + (x.z * y.z)) + (x.w * y.w));
+  uint v = uint(x.x);
+  int v_1 = int((v * uint(y.x)));
+  uint v_2 = uint(x.y);
+  int v_3 = int((v_2 * uint(y.y)));
+  uint v_4 = uint(v_1);
+  int v_5 = int((v_4 + uint(v_3)));
+  uint v_6 = uint(x.z);
+  int v_7 = int((v_6 * uint(y.z)));
+  uint v_8 = uint(v_5);
+  int v_9 = int((v_8 + uint(v_7)));
+  uint v_10 = uint(x.w);
+  int v_11 = int((v_10 * uint(y.w)));
+  uint v_12 = uint(v_9);
+  return int((v_12 + uint(v_11)));
 }
 int dot_ef6b1d() {
   ivec4 arg_0 = ivec4(1);
@@ -65,14 +104,14 @@
   return res;
 }
 VertexOutput vertex_main_inner() {
-  VertexOutput v = VertexOutput(vec4(0.0f), 0);
-  v.pos = vec4(0.0f);
-  v.prevent_dce = dot_ef6b1d();
-  return v;
+  VertexOutput v_13 = VertexOutput(vec4(0.0f), 0);
+  v_13.pos = vec4(0.0f);
+  v_13.prevent_dce = dot_ef6b1d();
+  return v_13;
 }
 void main() {
-  VertexOutput v_1 = vertex_main_inner();
-  gl_Position = vec4(v_1.pos.x, -(v_1.pos.y), ((2.0f * v_1.pos.z) - v_1.pos.w), v_1.pos.w);
-  tint_interstage_location0 = v_1.prevent_dce;
+  VertexOutput v_14 = vertex_main_inner();
+  gl_Position = vec4(v_14.pos.x, -(v_14.pos.y), ((2.0f * v_14.pos.z) - v_14.pos.w), v_14.pos.w);
+  tint_interstage_location0 = v_14.prevent_dce;
   gl_PointSize = 1.0f;
 }
diff --git a/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.msl b/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.msl
index 6b18834..5f920c7 100644
--- a/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.msl
@@ -9,7 +9,7 @@
 };
 
 int tint_dot(int4 lhs, int4 rhs) {
-  return ((((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z) + (lhs * rhs).w);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).x) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).y)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).z)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).w)));
 }
 
 int dot_ef6b1d() {
@@ -34,7 +34,7 @@
 };
 
 int tint_dot(int4 lhs, int4 rhs) {
-  return ((((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z) + (lhs * rhs).w);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).x) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).y)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).z)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).w)));
 }
 
 int dot_ef6b1d() {
@@ -65,7 +65,7 @@
 };
 
 int tint_dot(int4 lhs, int4 rhs) {
-  return ((((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z) + (lhs * rhs).w);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).x) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).y)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).z)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).w)));
 }
 
 int dot_ef6b1d() {
diff --git a/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.spvasm
index 45f57be..0ca34c7 100644
--- a/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/dot/ef6b1d.wgsl.expected.spvasm
@@ -4,7 +4,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 43
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,11 +31,11 @@
 %_ptr_Function_v4int = OpTypePointer Function %v4int
       %int_1 = OpConstant %int 1
          %11 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
        %void = OpTypeVoid
-         %36 = OpTypeFunction %void
+         %58 = OpTypeFunction %void
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
  %dot_ef6b1d = OpFunction %int None %6
           %7 = OpLabel
@@ -48,28 +48,49 @@
          %15 = OpLoad %v4int %arg_1 None
          %16 = OpCompositeExtract %int %14 0
          %17 = OpCompositeExtract %int %15 0
-         %18 = OpIMul %int %16 %17
-         %19 = OpCompositeExtract %int %14 1
-         %20 = OpCompositeExtract %int %15 1
-         %21 = OpIMul %int %19 %20
-         %22 = OpIAdd %int %18 %21
-         %23 = OpCompositeExtract %int %14 2
-         %24 = OpCompositeExtract %int %15 2
-         %25 = OpIMul %int %23 %24
-         %26 = OpIAdd %int %22 %25
-         %27 = OpCompositeExtract %int %14 3
-         %28 = OpCompositeExtract %int %15 3
-         %29 = OpIMul %int %27 %28
-         %30 = OpIAdd %int %26 %29
-               OpStore %res %30
-         %33 = OpLoad %int %res None
-               OpReturnValue %33
+         %19 = OpBitcast %uint %16
+         %20 = OpBitcast %uint %17
+         %21 = OpIMul %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpCompositeExtract %int %14 1
+         %24 = OpCompositeExtract %int %15 1
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %24
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %22
+         %30 = OpBitcast %uint %28
+         %31 = OpIAdd %uint %29 %30
+         %32 = OpBitcast %int %31
+         %33 = OpCompositeExtract %int %14 2
+         %34 = OpCompositeExtract %int %15 2
+         %35 = OpBitcast %uint %33
+         %36 = OpBitcast %uint %34
+         %37 = OpIMul %uint %35 %36
+         %38 = OpBitcast %int %37
+         %39 = OpBitcast %uint %32
+         %40 = OpBitcast %uint %38
+         %41 = OpIAdd %uint %39 %40
+         %42 = OpBitcast %int %41
+         %43 = OpCompositeExtract %int %14 3
+         %44 = OpCompositeExtract %int %15 3
+         %45 = OpBitcast %uint %43
+         %46 = OpBitcast %uint %44
+         %47 = OpIMul %uint %45 %46
+         %48 = OpBitcast %int %47
+         %49 = OpBitcast %uint %42
+         %50 = OpBitcast %uint %48
+         %51 = OpIAdd %uint %49 %50
+         %52 = OpBitcast %int %51
+               OpStore %res %52
+         %55 = OpLoad %int %res None
+               OpReturnValue %55
                OpFunctionEnd
-%fragment_main = OpFunction %void None %36
-         %37 = OpLabel
-         %38 = OpFunctionCall %int %dot_ef6b1d
-         %39 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %39 %38 None
+%fragment_main = OpFunction %void None %58
+         %59 = OpLabel
+         %60 = OpFunctionCall %int %dot_ef6b1d
+         %61 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %61 %60 None
                OpReturn
                OpFunctionEnd
 ;
@@ -78,7 +99,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 43
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -105,11 +126,11 @@
 %_ptr_Function_v4int = OpTypePointer Function %v4int
       %int_1 = OpConstant %int 1
          %11 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
        %void = OpTypeVoid
-         %36 = OpTypeFunction %void
+         %58 = OpTypeFunction %void
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
  %dot_ef6b1d = OpFunction %int None %6
           %7 = OpLabel
@@ -122,28 +143,49 @@
          %15 = OpLoad %v4int %arg_1 None
          %16 = OpCompositeExtract %int %14 0
          %17 = OpCompositeExtract %int %15 0
-         %18 = OpIMul %int %16 %17
-         %19 = OpCompositeExtract %int %14 1
-         %20 = OpCompositeExtract %int %15 1
-         %21 = OpIMul %int %19 %20
-         %22 = OpIAdd %int %18 %21
-         %23 = OpCompositeExtract %int %14 2
-         %24 = OpCompositeExtract %int %15 2
-         %25 = OpIMul %int %23 %24
-         %26 = OpIAdd %int %22 %25
-         %27 = OpCompositeExtract %int %14 3
-         %28 = OpCompositeExtract %int %15 3
-         %29 = OpIMul %int %27 %28
-         %30 = OpIAdd %int %26 %29
-               OpStore %res %30
-         %33 = OpLoad %int %res None
-               OpReturnValue %33
+         %19 = OpBitcast %uint %16
+         %20 = OpBitcast %uint %17
+         %21 = OpIMul %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpCompositeExtract %int %14 1
+         %24 = OpCompositeExtract %int %15 1
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %24
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %22
+         %30 = OpBitcast %uint %28
+         %31 = OpIAdd %uint %29 %30
+         %32 = OpBitcast %int %31
+         %33 = OpCompositeExtract %int %14 2
+         %34 = OpCompositeExtract %int %15 2
+         %35 = OpBitcast %uint %33
+         %36 = OpBitcast %uint %34
+         %37 = OpIMul %uint %35 %36
+         %38 = OpBitcast %int %37
+         %39 = OpBitcast %uint %32
+         %40 = OpBitcast %uint %38
+         %41 = OpIAdd %uint %39 %40
+         %42 = OpBitcast %int %41
+         %43 = OpCompositeExtract %int %14 3
+         %44 = OpCompositeExtract %int %15 3
+         %45 = OpBitcast %uint %43
+         %46 = OpBitcast %uint %44
+         %47 = OpIMul %uint %45 %46
+         %48 = OpBitcast %int %47
+         %49 = OpBitcast %uint %42
+         %50 = OpBitcast %uint %48
+         %51 = OpIAdd %uint %49 %50
+         %52 = OpBitcast %int %51
+               OpStore %res %52
+         %55 = OpLoad %int %res None
+               OpReturnValue %55
                OpFunctionEnd
-%compute_main = OpFunction %void None %36
-         %37 = OpLabel
-         %38 = OpFunctionCall %int %dot_ef6b1d
-         %39 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %39 %38 None
+%compute_main = OpFunction %void None %58
+         %59 = OpLabel
+         %60 = OpFunctionCall %int %dot_ef6b1d
+         %61 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %61 %60 None
                OpReturn
                OpFunctionEnd
 ;
@@ -152,7 +194,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 63
+; Bound: 84
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -188,18 +230,18 @@
 %_ptr_Function_v4int = OpTypePointer Function %v4int
       %int_1 = OpConstant %int 1
          %16 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
 %VertexOutput = OpTypeStruct %v4float %int
-         %41 = OpTypeFunction %VertexOutput
+         %63 = OpTypeFunction %VertexOutput
 %_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
-         %45 = OpConstantNull %VertexOutput
+         %67 = OpConstantNull %VertexOutput
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
-         %50 = OpConstantNull %v4float
+         %71 = OpConstantNull %v4float
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-         %57 = OpTypeFunction %void
+         %78 = OpTypeFunction %void
     %float_1 = OpConstant %float 1
  %dot_ef6b1d = OpFunction %int None %11
          %12 = OpLabel
@@ -212,41 +254,62 @@
          %20 = OpLoad %v4int %arg_1 None
          %21 = OpCompositeExtract %int %19 0
          %22 = OpCompositeExtract %int %20 0
-         %23 = OpIMul %int %21 %22
-         %24 = OpCompositeExtract %int %19 1
-         %25 = OpCompositeExtract %int %20 1
-         %26 = OpIMul %int %24 %25
-         %27 = OpIAdd %int %23 %26
-         %28 = OpCompositeExtract %int %19 2
-         %29 = OpCompositeExtract %int %20 2
-         %30 = OpIMul %int %28 %29
-         %31 = OpIAdd %int %27 %30
-         %32 = OpCompositeExtract %int %19 3
-         %33 = OpCompositeExtract %int %20 3
-         %34 = OpIMul %int %32 %33
-         %35 = OpIAdd %int %31 %34
-               OpStore %res %35
-         %38 = OpLoad %int %res None
-               OpReturnValue %38
+         %24 = OpBitcast %uint %21
+         %25 = OpBitcast %uint %22
+         %26 = OpIMul %uint %24 %25
+         %27 = OpBitcast %int %26
+         %28 = OpCompositeExtract %int %19 1
+         %29 = OpCompositeExtract %int %20 1
+         %30 = OpBitcast %uint %28
+         %31 = OpBitcast %uint %29
+         %32 = OpIMul %uint %30 %31
+         %33 = OpBitcast %int %32
+         %34 = OpBitcast %uint %27
+         %35 = OpBitcast %uint %33
+         %36 = OpIAdd %uint %34 %35
+         %37 = OpBitcast %int %36
+         %38 = OpCompositeExtract %int %19 2
+         %39 = OpCompositeExtract %int %20 2
+         %40 = OpBitcast %uint %38
+         %41 = OpBitcast %uint %39
+         %42 = OpIMul %uint %40 %41
+         %43 = OpBitcast %int %42
+         %44 = OpBitcast %uint %37
+         %45 = OpBitcast %uint %43
+         %46 = OpIAdd %uint %44 %45
+         %47 = OpBitcast %int %46
+         %48 = OpCompositeExtract %int %19 3
+         %49 = OpCompositeExtract %int %20 3
+         %50 = OpBitcast %uint %48
+         %51 = OpBitcast %uint %49
+         %52 = OpIMul %uint %50 %51
+         %53 = OpBitcast %int %52
+         %54 = OpBitcast %uint %47
+         %55 = OpBitcast %uint %53
+         %56 = OpIAdd %uint %54 %55
+         %57 = OpBitcast %int %56
+               OpStore %res %57
+         %60 = OpLoad %int %res None
+               OpReturnValue %60
                OpFunctionEnd
-%vertex_main_inner = OpFunction %VertexOutput None %41
-         %42 = OpLabel
-        %out = OpVariable %_ptr_Function_VertexOutput Function %45
-         %46 = OpAccessChain %_ptr_Function_v4float %out %uint_0
-               OpStore %46 %50 None
-         %51 = OpAccessChain %_ptr_Function_int %out %uint_1
-         %53 = OpFunctionCall %int %dot_ef6b1d
-               OpStore %51 %53 None
-         %54 = OpLoad %VertexOutput %out None
-               OpReturnValue %54
+%vertex_main_inner = OpFunction %VertexOutput None %63
+         %64 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %67
+         %68 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %68 %71 None
+         %72 = OpAccessChain %_ptr_Function_int %out %uint_1
+         %74 = OpFunctionCall %int %dot_ef6b1d
+               OpStore %72 %74 None
+         %75 = OpLoad %VertexOutput %out None
+               OpReturnValue %75
                OpFunctionEnd
-%vertex_main = OpFunction %void None %57
-         %58 = OpLabel
-         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
-         %60 = OpCompositeExtract %v4float %59 0
-               OpStore %vertex_main_position_Output %60 None
-         %61 = OpCompositeExtract %int %59 1
-               OpStore %vertex_main_loc0_Output %61 None
+%vertex_main = OpFunction %void None %78
+         %79 = OpLabel
+         %80 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %81 = OpCompositeExtract %v4float %80 0
+               OpStore %vertex_main_position_Output %81 None
+         %82 = OpCompositeExtract %int %80 1
+               OpStore %vertex_main_loc0_Output %82 None
                OpStore %vertex_main___point_size_Output %float_1 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.glsl b/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.glsl
index b3ef3a2..ee99c9f 100644
--- a/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.glsl
@@ -10,7 +10,16 @@
   int inner;
 } v;
 int tint_int_dot(ivec3 x, ivec3 y) {
-  return (((x.x * y.x) + (x.y * y.y)) + (x.z * y.z));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  int v_6 = int((v_5 + uint(v_4)));
+  uint v_7 = uint(x.z);
+  int v_8 = int((v_7 * uint(y.z)));
+  uint v_9 = uint(v_6);
+  return int((v_9 + uint(v_8)));
 }
 int dot_f1312c() {
   ivec3 arg_0 = ivec3(1);
@@ -31,7 +40,16 @@
   int inner;
 } v;
 int tint_int_dot(ivec3 x, ivec3 y) {
-  return (((x.x * y.x) + (x.y * y.y)) + (x.z * y.z));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  int v_6 = int((v_5 + uint(v_4)));
+  uint v_7 = uint(x.z);
+  int v_8 = int((v_7 * uint(y.z)));
+  uint v_9 = uint(v_6);
+  return int((v_9 + uint(v_8)));
 }
 int dot_f1312c() {
   ivec3 arg_0 = ivec3(1);
@@ -56,7 +74,16 @@
 
 layout(location = 0) flat out int tint_interstage_location0;
 int tint_int_dot(ivec3 x, ivec3 y) {
-  return (((x.x * y.x) + (x.y * y.y)) + (x.z * y.z));
+  uint v = uint(x.x);
+  int v_1 = int((v * uint(y.x)));
+  uint v_2 = uint(x.y);
+  int v_3 = int((v_2 * uint(y.y)));
+  uint v_4 = uint(v_1);
+  int v_5 = int((v_4 + uint(v_3)));
+  uint v_6 = uint(x.z);
+  int v_7 = int((v_6 * uint(y.z)));
+  uint v_8 = uint(v_5);
+  return int((v_8 + uint(v_7)));
 }
 int dot_f1312c() {
   ivec3 arg_0 = ivec3(1);
@@ -65,14 +92,14 @@
   return res;
 }
 VertexOutput vertex_main_inner() {
-  VertexOutput v = VertexOutput(vec4(0.0f), 0);
-  v.pos = vec4(0.0f);
-  v.prevent_dce = dot_f1312c();
-  return v;
+  VertexOutput v_9 = VertexOutput(vec4(0.0f), 0);
+  v_9.pos = vec4(0.0f);
+  v_9.prevent_dce = dot_f1312c();
+  return v_9;
 }
 void main() {
-  VertexOutput v_1 = vertex_main_inner();
-  gl_Position = vec4(v_1.pos.x, -(v_1.pos.y), ((2.0f * v_1.pos.z) - v_1.pos.w), v_1.pos.w);
-  tint_interstage_location0 = v_1.prevent_dce;
+  VertexOutput v_10 = vertex_main_inner();
+  gl_Position = vec4(v_10.pos.x, -(v_10.pos.y), ((2.0f * v_10.pos.z) - v_10.pos.w), v_10.pos.w);
+  tint_interstage_location0 = v_10.prevent_dce;
   gl_PointSize = 1.0f;
 }
diff --git a/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.msl b/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.msl
index 0b8e291..6fd104d 100644
--- a/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.msl
@@ -9,7 +9,7 @@
 };
 
 int tint_dot(int3 lhs, int3 rhs) {
-  return (((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).x) + as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).y)))) + as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).z)));
 }
 
 int dot_f1312c() {
@@ -34,7 +34,7 @@
 };
 
 int tint_dot(int3 lhs, int3 rhs) {
-  return (((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).x) + as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).y)))) + as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).z)));
 }
 
 int dot_f1312c() {
@@ -65,7 +65,7 @@
 };
 
 int tint_dot(int3 lhs, int3 rhs) {
-  return (((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).x) + as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).y)))) + as_type<uint>(as_type<int3>((as_type<uint3>(lhs) * as_type<uint3>(rhs))).z)));
 }
 
 int dot_f1312c() {
diff --git a/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.spvasm
index 9d4e4f3..84b0059 100644
--- a/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/dot/f1312c.wgsl.expected.spvasm
@@ -4,7 +4,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 39
+; Bound: 54
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,11 +31,11 @@
 %_ptr_Function_v3int = OpTypePointer Function %v3int
       %int_1 = OpConstant %int 1
          %11 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
        %void = OpTypeVoid
-         %32 = OpTypeFunction %void
+         %48 = OpTypeFunction %void
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
  %dot_f1312c = OpFunction %int None %6
           %7 = OpLabel
@@ -48,24 +48,39 @@
          %15 = OpLoad %v3int %arg_1 None
          %16 = OpCompositeExtract %int %14 0
          %17 = OpCompositeExtract %int %15 0
-         %18 = OpIMul %int %16 %17
-         %19 = OpCompositeExtract %int %14 1
-         %20 = OpCompositeExtract %int %15 1
-         %21 = OpIMul %int %19 %20
-         %22 = OpIAdd %int %18 %21
-         %23 = OpCompositeExtract %int %14 2
-         %24 = OpCompositeExtract %int %15 2
-         %25 = OpIMul %int %23 %24
-         %26 = OpIAdd %int %22 %25
-               OpStore %res %26
-         %29 = OpLoad %int %res None
-               OpReturnValue %29
+         %19 = OpBitcast %uint %16
+         %20 = OpBitcast %uint %17
+         %21 = OpIMul %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpCompositeExtract %int %14 1
+         %24 = OpCompositeExtract %int %15 1
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %24
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %22
+         %30 = OpBitcast %uint %28
+         %31 = OpIAdd %uint %29 %30
+         %32 = OpBitcast %int %31
+         %33 = OpCompositeExtract %int %14 2
+         %34 = OpCompositeExtract %int %15 2
+         %35 = OpBitcast %uint %33
+         %36 = OpBitcast %uint %34
+         %37 = OpIMul %uint %35 %36
+         %38 = OpBitcast %int %37
+         %39 = OpBitcast %uint %32
+         %40 = OpBitcast %uint %38
+         %41 = OpIAdd %uint %39 %40
+         %42 = OpBitcast %int %41
+               OpStore %res %42
+         %45 = OpLoad %int %res None
+               OpReturnValue %45
                OpFunctionEnd
-%fragment_main = OpFunction %void None %32
-         %33 = OpLabel
-         %34 = OpFunctionCall %int %dot_f1312c
-         %35 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %35 %34 None
+%fragment_main = OpFunction %void None %48
+         %49 = OpLabel
+         %50 = OpFunctionCall %int %dot_f1312c
+         %51 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %51 %50 None
                OpReturn
                OpFunctionEnd
 ;
@@ -74,7 +89,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 39
+; Bound: 54
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -101,11 +116,11 @@
 %_ptr_Function_v3int = OpTypePointer Function %v3int
       %int_1 = OpConstant %int 1
          %11 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
        %void = OpTypeVoid
-         %32 = OpTypeFunction %void
+         %48 = OpTypeFunction %void
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
  %dot_f1312c = OpFunction %int None %6
           %7 = OpLabel
@@ -118,24 +133,39 @@
          %15 = OpLoad %v3int %arg_1 None
          %16 = OpCompositeExtract %int %14 0
          %17 = OpCompositeExtract %int %15 0
-         %18 = OpIMul %int %16 %17
-         %19 = OpCompositeExtract %int %14 1
-         %20 = OpCompositeExtract %int %15 1
-         %21 = OpIMul %int %19 %20
-         %22 = OpIAdd %int %18 %21
-         %23 = OpCompositeExtract %int %14 2
-         %24 = OpCompositeExtract %int %15 2
-         %25 = OpIMul %int %23 %24
-         %26 = OpIAdd %int %22 %25
-               OpStore %res %26
-         %29 = OpLoad %int %res None
-               OpReturnValue %29
+         %19 = OpBitcast %uint %16
+         %20 = OpBitcast %uint %17
+         %21 = OpIMul %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpCompositeExtract %int %14 1
+         %24 = OpCompositeExtract %int %15 1
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %24
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %22
+         %30 = OpBitcast %uint %28
+         %31 = OpIAdd %uint %29 %30
+         %32 = OpBitcast %int %31
+         %33 = OpCompositeExtract %int %14 2
+         %34 = OpCompositeExtract %int %15 2
+         %35 = OpBitcast %uint %33
+         %36 = OpBitcast %uint %34
+         %37 = OpIMul %uint %35 %36
+         %38 = OpBitcast %int %37
+         %39 = OpBitcast %uint %32
+         %40 = OpBitcast %uint %38
+         %41 = OpIAdd %uint %39 %40
+         %42 = OpBitcast %int %41
+               OpStore %res %42
+         %45 = OpLoad %int %res None
+               OpReturnValue %45
                OpFunctionEnd
-%compute_main = OpFunction %void None %32
-         %33 = OpLabel
-         %34 = OpFunctionCall %int %dot_f1312c
-         %35 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %35 %34 None
+%compute_main = OpFunction %void None %48
+         %49 = OpLabel
+         %50 = OpFunctionCall %int %dot_f1312c
+         %51 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %51 %50 None
                OpReturn
                OpFunctionEnd
 ;
@@ -144,7 +174,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 59
+; Bound: 74
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -180,18 +210,18 @@
 %_ptr_Function_v3int = OpTypePointer Function %v3int
       %int_1 = OpConstant %int 1
          %16 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
 %VertexOutput = OpTypeStruct %v4float %int
-         %37 = OpTypeFunction %VertexOutput
+         %53 = OpTypeFunction %VertexOutput
 %_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
-         %41 = OpConstantNull %VertexOutput
+         %57 = OpConstantNull %VertexOutput
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
-         %46 = OpConstantNull %v4float
+         %61 = OpConstantNull %v4float
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-         %53 = OpTypeFunction %void
+         %68 = OpTypeFunction %void
     %float_1 = OpConstant %float 1
  %dot_f1312c = OpFunction %int None %11
          %12 = OpLabel
@@ -204,37 +234,52 @@
          %20 = OpLoad %v3int %arg_1 None
          %21 = OpCompositeExtract %int %19 0
          %22 = OpCompositeExtract %int %20 0
-         %23 = OpIMul %int %21 %22
-         %24 = OpCompositeExtract %int %19 1
-         %25 = OpCompositeExtract %int %20 1
-         %26 = OpIMul %int %24 %25
-         %27 = OpIAdd %int %23 %26
-         %28 = OpCompositeExtract %int %19 2
-         %29 = OpCompositeExtract %int %20 2
-         %30 = OpIMul %int %28 %29
-         %31 = OpIAdd %int %27 %30
-               OpStore %res %31
-         %34 = OpLoad %int %res None
-               OpReturnValue %34
-               OpFunctionEnd
-%vertex_main_inner = OpFunction %VertexOutput None %37
-         %38 = OpLabel
-        %out = OpVariable %_ptr_Function_VertexOutput Function %41
-         %42 = OpAccessChain %_ptr_Function_v4float %out %uint_0
-               OpStore %42 %46 None
-         %47 = OpAccessChain %_ptr_Function_int %out %uint_1
-         %49 = OpFunctionCall %int %dot_f1312c
-               OpStore %47 %49 None
-         %50 = OpLoad %VertexOutput %out None
+         %24 = OpBitcast %uint %21
+         %25 = OpBitcast %uint %22
+         %26 = OpIMul %uint %24 %25
+         %27 = OpBitcast %int %26
+         %28 = OpCompositeExtract %int %19 1
+         %29 = OpCompositeExtract %int %20 1
+         %30 = OpBitcast %uint %28
+         %31 = OpBitcast %uint %29
+         %32 = OpIMul %uint %30 %31
+         %33 = OpBitcast %int %32
+         %34 = OpBitcast %uint %27
+         %35 = OpBitcast %uint %33
+         %36 = OpIAdd %uint %34 %35
+         %37 = OpBitcast %int %36
+         %38 = OpCompositeExtract %int %19 2
+         %39 = OpCompositeExtract %int %20 2
+         %40 = OpBitcast %uint %38
+         %41 = OpBitcast %uint %39
+         %42 = OpIMul %uint %40 %41
+         %43 = OpBitcast %int %42
+         %44 = OpBitcast %uint %37
+         %45 = OpBitcast %uint %43
+         %46 = OpIAdd %uint %44 %45
+         %47 = OpBitcast %int %46
+               OpStore %res %47
+         %50 = OpLoad %int %res None
                OpReturnValue %50
                OpFunctionEnd
-%vertex_main = OpFunction %void None %53
+%vertex_main_inner = OpFunction %VertexOutput None %53
          %54 = OpLabel
-         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
-         %56 = OpCompositeExtract %v4float %55 0
-               OpStore %vertex_main_position_Output %56 None
-         %57 = OpCompositeExtract %int %55 1
-               OpStore %vertex_main_loc0_Output %57 None
+        %out = OpVariable %_ptr_Function_VertexOutput Function %57
+         %58 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %58 %61 None
+         %62 = OpAccessChain %_ptr_Function_int %out %uint_1
+         %64 = OpFunctionCall %int %dot_f1312c
+               OpStore %62 %64 None
+         %65 = OpLoad %VertexOutput %out None
+               OpReturnValue %65
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %68
+         %69 = OpLabel
+         %70 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %71 = OpCompositeExtract %v4float %70 0
+               OpStore %vertex_main_position_Output %71 None
+         %72 = OpCompositeExtract %int %70 1
+               OpStore %vertex_main_loc0_Output %72 None
                OpStore %vertex_main___point_size_Output %float_1 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.glsl b/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.glsl
index 56f91e2..f0e4027 100644
--- a/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.glsl
@@ -10,7 +10,12 @@
   int inner;
 } v;
 int tint_int_dot(ivec2 x, ivec2 y) {
-  return ((x.x * y.x) + (x.y * y.y));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  return int((v_5 + uint(v_4)));
 }
 int dot_fc5f7c() {
   ivec2 arg_0 = ivec2(1);
@@ -31,7 +36,12 @@
   int inner;
 } v;
 int tint_int_dot(ivec2 x, ivec2 y) {
-  return ((x.x * y.x) + (x.y * y.y));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  return int((v_5 + uint(v_4)));
 }
 int dot_fc5f7c() {
   ivec2 arg_0 = ivec2(1);
@@ -56,7 +66,12 @@
 
 layout(location = 0) flat out int tint_interstage_location0;
 int tint_int_dot(ivec2 x, ivec2 y) {
-  return ((x.x * y.x) + (x.y * y.y));
+  uint v = uint(x.x);
+  int v_1 = int((v * uint(y.x)));
+  uint v_2 = uint(x.y);
+  int v_3 = int((v_2 * uint(y.y)));
+  uint v_4 = uint(v_1);
+  return int((v_4 + uint(v_3)));
 }
 int dot_fc5f7c() {
   ivec2 arg_0 = ivec2(1);
@@ -65,14 +80,14 @@
   return res;
 }
 VertexOutput vertex_main_inner() {
-  VertexOutput v = VertexOutput(vec4(0.0f), 0);
-  v.pos = vec4(0.0f);
-  v.prevent_dce = dot_fc5f7c();
-  return v;
+  VertexOutput v_5 = VertexOutput(vec4(0.0f), 0);
+  v_5.pos = vec4(0.0f);
+  v_5.prevent_dce = dot_fc5f7c();
+  return v_5;
 }
 void main() {
-  VertexOutput v_1 = vertex_main_inner();
-  gl_Position = vec4(v_1.pos.x, -(v_1.pos.y), ((2.0f * v_1.pos.z) - v_1.pos.w), v_1.pos.w);
-  tint_interstage_location0 = v_1.prevent_dce;
+  VertexOutput v_6 = vertex_main_inner();
+  gl_Position = vec4(v_6.pos.x, -(v_6.pos.y), ((2.0f * v_6.pos.z) - v_6.pos.w), v_6.pos.w);
+  tint_interstage_location0 = v_6.prevent_dce;
   gl_PointSize = 1.0f;
 }
diff --git a/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.msl b/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.msl
index e8ae730..5a2f8c9 100644
--- a/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.msl
@@ -9,7 +9,7 @@
 };
 
 int tint_dot(int2 lhs, int2 rhs) {
-  return ((lhs * rhs).x + (lhs * rhs).y);
+  return as_type<int>((as_type<uint>(as_type<int2>((as_type<uint2>(lhs) * as_type<uint2>(rhs))).x) + as_type<uint>(as_type<int2>((as_type<uint2>(lhs) * as_type<uint2>(rhs))).y)));
 }
 
 int dot_fc5f7c() {
@@ -34,7 +34,7 @@
 };
 
 int tint_dot(int2 lhs, int2 rhs) {
-  return ((lhs * rhs).x + (lhs * rhs).y);
+  return as_type<int>((as_type<uint>(as_type<int2>((as_type<uint2>(lhs) * as_type<uint2>(rhs))).x) + as_type<uint>(as_type<int2>((as_type<uint2>(lhs) * as_type<uint2>(rhs))).y)));
 }
 
 int dot_fc5f7c() {
@@ -65,7 +65,7 @@
 };
 
 int tint_dot(int2 lhs, int2 rhs) {
-  return ((lhs * rhs).x + (lhs * rhs).y);
+  return as_type<int>((as_type<uint>(as_type<int2>((as_type<uint2>(lhs) * as_type<uint2>(rhs))).x) + as_type<uint>(as_type<int2>((as_type<uint2>(lhs) * as_type<uint2>(rhs))).y)));
 }
 
 int dot_fc5f7c() {
diff --git a/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.spvasm
index cec9f24..f8a63e2a 100644
--- a/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/dot/fc5f7c.wgsl.expected.spvasm
@@ -4,7 +4,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,11 +31,11 @@
 %_ptr_Function_v2int = OpTypePointer Function %v2int
       %int_1 = OpConstant %int 1
          %11 = OpConstantComposite %v2int %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
        %void = OpTypeVoid
-         %28 = OpTypeFunction %void
+         %38 = OpTypeFunction %void
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
  %dot_fc5f7c = OpFunction %int None %6
           %7 = OpLabel
@@ -48,20 +48,29 @@
          %15 = OpLoad %v2int %arg_1 None
          %16 = OpCompositeExtract %int %14 0
          %17 = OpCompositeExtract %int %15 0
-         %18 = OpIMul %int %16 %17
-         %19 = OpCompositeExtract %int %14 1
-         %20 = OpCompositeExtract %int %15 1
-         %21 = OpIMul %int %19 %20
-         %22 = OpIAdd %int %18 %21
-               OpStore %res %22
-         %25 = OpLoad %int %res None
-               OpReturnValue %25
+         %19 = OpBitcast %uint %16
+         %20 = OpBitcast %uint %17
+         %21 = OpIMul %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpCompositeExtract %int %14 1
+         %24 = OpCompositeExtract %int %15 1
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %24
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %22
+         %30 = OpBitcast %uint %28
+         %31 = OpIAdd %uint %29 %30
+         %32 = OpBitcast %int %31
+               OpStore %res %32
+         %35 = OpLoad %int %res None
+               OpReturnValue %35
                OpFunctionEnd
-%fragment_main = OpFunction %void None %28
-         %29 = OpLabel
-         %30 = OpFunctionCall %int %dot_fc5f7c
-         %31 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %31 %30 None
+%fragment_main = OpFunction %void None %38
+         %39 = OpLabel
+         %40 = OpFunctionCall %int %dot_fc5f7c
+         %41 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %41 %40 None
                OpReturn
                OpFunctionEnd
 ;
@@ -70,7 +79,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -97,11 +106,11 @@
 %_ptr_Function_v2int = OpTypePointer Function %v2int
       %int_1 = OpConstant %int 1
          %11 = OpConstantComposite %v2int %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
        %void = OpTypeVoid
-         %28 = OpTypeFunction %void
+         %38 = OpTypeFunction %void
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
  %dot_fc5f7c = OpFunction %int None %6
           %7 = OpLabel
@@ -114,20 +123,29 @@
          %15 = OpLoad %v2int %arg_1 None
          %16 = OpCompositeExtract %int %14 0
          %17 = OpCompositeExtract %int %15 0
-         %18 = OpIMul %int %16 %17
-         %19 = OpCompositeExtract %int %14 1
-         %20 = OpCompositeExtract %int %15 1
-         %21 = OpIMul %int %19 %20
-         %22 = OpIAdd %int %18 %21
-               OpStore %res %22
-         %25 = OpLoad %int %res None
-               OpReturnValue %25
+         %19 = OpBitcast %uint %16
+         %20 = OpBitcast %uint %17
+         %21 = OpIMul %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpCompositeExtract %int %14 1
+         %24 = OpCompositeExtract %int %15 1
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %24
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %22
+         %30 = OpBitcast %uint %28
+         %31 = OpIAdd %uint %29 %30
+         %32 = OpBitcast %int %31
+               OpStore %res %32
+         %35 = OpLoad %int %res None
+               OpReturnValue %35
                OpFunctionEnd
-%compute_main = OpFunction %void None %28
-         %29 = OpLabel
-         %30 = OpFunctionCall %int %dot_fc5f7c
-         %31 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %31 %30 None
+%compute_main = OpFunction %void None %38
+         %39 = OpLabel
+         %40 = OpFunctionCall %int %dot_fc5f7c
+         %41 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %41 %40 None
                OpReturn
                OpFunctionEnd
 ;
@@ -136,7 +154,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 55
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -172,18 +190,18 @@
 %_ptr_Function_v2int = OpTypePointer Function %v2int
       %int_1 = OpConstant %int 1
          %16 = OpConstantComposite %v2int %int_1 %int_1
+       %uint = OpTypeInt 32 0
 %_ptr_Function_int = OpTypePointer Function %int
 %VertexOutput = OpTypeStruct %v4float %int
-         %33 = OpTypeFunction %VertexOutput
+         %43 = OpTypeFunction %VertexOutput
 %_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
-         %37 = OpConstantNull %VertexOutput
+         %47 = OpConstantNull %VertexOutput
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-       %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
-         %42 = OpConstantNull %v4float
+         %51 = OpConstantNull %v4float
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-         %49 = OpTypeFunction %void
+         %58 = OpTypeFunction %void
     %float_1 = OpConstant %float 1
  %dot_fc5f7c = OpFunction %int None %11
          %12 = OpLabel
@@ -196,33 +214,42 @@
          %20 = OpLoad %v2int %arg_1 None
          %21 = OpCompositeExtract %int %19 0
          %22 = OpCompositeExtract %int %20 0
-         %23 = OpIMul %int %21 %22
-         %24 = OpCompositeExtract %int %19 1
-         %25 = OpCompositeExtract %int %20 1
-         %26 = OpIMul %int %24 %25
-         %27 = OpIAdd %int %23 %26
-               OpStore %res %27
-         %30 = OpLoad %int %res None
-               OpReturnValue %30
+         %24 = OpBitcast %uint %21
+         %25 = OpBitcast %uint %22
+         %26 = OpIMul %uint %24 %25
+         %27 = OpBitcast %int %26
+         %28 = OpCompositeExtract %int %19 1
+         %29 = OpCompositeExtract %int %20 1
+         %30 = OpBitcast %uint %28
+         %31 = OpBitcast %uint %29
+         %32 = OpIMul %uint %30 %31
+         %33 = OpBitcast %int %32
+         %34 = OpBitcast %uint %27
+         %35 = OpBitcast %uint %33
+         %36 = OpIAdd %uint %34 %35
+         %37 = OpBitcast %int %36
+               OpStore %res %37
+         %40 = OpLoad %int %res None
+               OpReturnValue %40
                OpFunctionEnd
-%vertex_main_inner = OpFunction %VertexOutput None %33
-         %34 = OpLabel
-        %out = OpVariable %_ptr_Function_VertexOutput Function %37
-         %38 = OpAccessChain %_ptr_Function_v4float %out %uint_0
-               OpStore %38 %42 None
-         %43 = OpAccessChain %_ptr_Function_int %out %uint_1
-         %45 = OpFunctionCall %int %dot_fc5f7c
-               OpStore %43 %45 None
-         %46 = OpLoad %VertexOutput %out None
-               OpReturnValue %46
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %51 None
+         %52 = OpAccessChain %_ptr_Function_int %out %uint_1
+         %54 = OpFunctionCall %int %dot_fc5f7c
+               OpStore %52 %54 None
+         %55 = OpLoad %VertexOutput %out None
+               OpReturnValue %55
                OpFunctionEnd
-%vertex_main = OpFunction %void None %49
-         %50 = OpLabel
-         %51 = OpFunctionCall %VertexOutput %vertex_main_inner
-         %52 = OpCompositeExtract %v4float %51 0
-               OpStore %vertex_main_position_Output %52 None
-         %53 = OpCompositeExtract %int %51 1
-               OpStore %vertex_main_loc0_Output %53 None
+%vertex_main = OpFunction %void None %58
+         %59 = OpLabel
+         %60 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %61 = OpCompositeExtract %v4float %60 0
+               OpStore %vertex_main_position_Output %61 None
+         %62 = OpCompositeExtract %int %60 1
+               OpStore %vertex_main_loc0_Output %62 None
                OpStore %vertex_main___point_size_Output %float_1 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.glsl b/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.glsl
index 6ed2904..b97ac29 100644
--- a/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.glsl
@@ -10,19 +10,32 @@
   int inner;
 } v;
 int tint_int_dot(ivec4 x, ivec4 y) {
-  return ((((x.x * y.x) + (x.y * y.y)) + (x.z * y.z)) + (x.w * y.w));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  int v_6 = int((v_5 + uint(v_4)));
+  uint v_7 = uint(x.z);
+  int v_8 = int((v_7 * uint(y.z)));
+  uint v_9 = uint(v_6);
+  int v_10 = int((v_9 + uint(v_8)));
+  uint v_11 = uint(x.w);
+  int v_12 = int((v_11 * uint(y.w)));
+  uint v_13 = uint(v_10);
+  return int((v_13 + uint(v_12)));
 }
 int dot4I8Packed_881e62() {
   uint arg_0 = 1u;
   uint arg_1 = 1u;
-  uint v_1 = arg_0;
-  uint v_2 = arg_1;
-  uvec4 v_3 = uvec4(24u, 16u, 8u, 0u);
-  ivec4 v_4 = ivec4((uvec4(v_1) << v_3));
-  ivec4 v_5 = (v_4 >> uvec4(24u));
-  uvec4 v_6 = uvec4(24u, 16u, 8u, 0u);
-  ivec4 v_7 = ivec4((uvec4(v_2) << v_6));
-  int res = tint_int_dot(v_5, (v_7 >> uvec4(24u)));
+  uint v_14 = arg_0;
+  uint v_15 = arg_1;
+  uvec4 v_16 = uvec4(24u, 16u, 8u, 0u);
+  ivec4 v_17 = ivec4((uvec4(v_14) << v_16));
+  ivec4 v_18 = (v_17 >> uvec4(24u));
+  uvec4 v_19 = uvec4(24u, 16u, 8u, 0u);
+  ivec4 v_20 = ivec4((uvec4(v_15) << v_19));
+  int res = tint_int_dot(v_18, (v_20 >> uvec4(24u)));
   return res;
 }
 void main() {
@@ -38,19 +51,32 @@
   int inner;
 } v;
 int tint_int_dot(ivec4 x, ivec4 y) {
-  return ((((x.x * y.x) + (x.y * y.y)) + (x.z * y.z)) + (x.w * y.w));
+  uint v_1 = uint(x.x);
+  int v_2 = int((v_1 * uint(y.x)));
+  uint v_3 = uint(x.y);
+  int v_4 = int((v_3 * uint(y.y)));
+  uint v_5 = uint(v_2);
+  int v_6 = int((v_5 + uint(v_4)));
+  uint v_7 = uint(x.z);
+  int v_8 = int((v_7 * uint(y.z)));
+  uint v_9 = uint(v_6);
+  int v_10 = int((v_9 + uint(v_8)));
+  uint v_11 = uint(x.w);
+  int v_12 = int((v_11 * uint(y.w)));
+  uint v_13 = uint(v_10);
+  return int((v_13 + uint(v_12)));
 }
 int dot4I8Packed_881e62() {
   uint arg_0 = 1u;
   uint arg_1 = 1u;
-  uint v_1 = arg_0;
-  uint v_2 = arg_1;
-  uvec4 v_3 = uvec4(24u, 16u, 8u, 0u);
-  ivec4 v_4 = ivec4((uvec4(v_1) << v_3));
-  ivec4 v_5 = (v_4 >> uvec4(24u));
-  uvec4 v_6 = uvec4(24u, 16u, 8u, 0u);
-  ivec4 v_7 = ivec4((uvec4(v_2) << v_6));
-  int res = tint_int_dot(v_5, (v_7 >> uvec4(24u)));
+  uint v_14 = arg_0;
+  uint v_15 = arg_1;
+  uvec4 v_16 = uvec4(24u, 16u, 8u, 0u);
+  ivec4 v_17 = ivec4((uvec4(v_14) << v_16));
+  ivec4 v_18 = (v_17 >> uvec4(24u));
+  uvec4 v_19 = uvec4(24u, 16u, 8u, 0u);
+  ivec4 v_20 = ivec4((uvec4(v_15) << v_19));
+  int res = tint_int_dot(v_18, (v_20 >> uvec4(24u)));
   return res;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -70,30 +96,43 @@
 
 layout(location = 0) flat out int tint_interstage_location0;
 int tint_int_dot(ivec4 x, ivec4 y) {
-  return ((((x.x * y.x) + (x.y * y.y)) + (x.z * y.z)) + (x.w * y.w));
+  uint v = uint(x.x);
+  int v_1 = int((v * uint(y.x)));
+  uint v_2 = uint(x.y);
+  int v_3 = int((v_2 * uint(y.y)));
+  uint v_4 = uint(v_1);
+  int v_5 = int((v_4 + uint(v_3)));
+  uint v_6 = uint(x.z);
+  int v_7 = int((v_6 * uint(y.z)));
+  uint v_8 = uint(v_5);
+  int v_9 = int((v_8 + uint(v_7)));
+  uint v_10 = uint(x.w);
+  int v_11 = int((v_10 * uint(y.w)));
+  uint v_12 = uint(v_9);
+  return int((v_12 + uint(v_11)));
 }
 int dot4I8Packed_881e62() {
   uint arg_0 = 1u;
   uint arg_1 = 1u;
-  uint v = arg_0;
-  uint v_1 = arg_1;
-  uvec4 v_2 = uvec4(24u, 16u, 8u, 0u);
-  ivec4 v_3 = ivec4((uvec4(v) << v_2));
-  ivec4 v_4 = (v_3 >> uvec4(24u));
-  uvec4 v_5 = uvec4(24u, 16u, 8u, 0u);
-  ivec4 v_6 = ivec4((uvec4(v_1) << v_5));
-  int res = tint_int_dot(v_4, (v_6 >> uvec4(24u)));
+  uint v_13 = arg_0;
+  uint v_14 = arg_1;
+  uvec4 v_15 = uvec4(24u, 16u, 8u, 0u);
+  ivec4 v_16 = ivec4((uvec4(v_13) << v_15));
+  ivec4 v_17 = (v_16 >> uvec4(24u));
+  uvec4 v_18 = uvec4(24u, 16u, 8u, 0u);
+  ivec4 v_19 = ivec4((uvec4(v_14) << v_18));
+  int res = tint_int_dot(v_17, (v_19 >> uvec4(24u)));
   return res;
 }
 VertexOutput vertex_main_inner() {
-  VertexOutput v_7 = VertexOutput(vec4(0.0f), 0);
-  v_7.pos = vec4(0.0f);
-  v_7.prevent_dce = dot4I8Packed_881e62();
-  return v_7;
+  VertexOutput v_20 = VertexOutput(vec4(0.0f), 0);
+  v_20.pos = vec4(0.0f);
+  v_20.prevent_dce = dot4I8Packed_881e62();
+  return v_20;
 }
 void main() {
-  VertexOutput v_8 = vertex_main_inner();
-  gl_Position = vec4(v_8.pos.x, -(v_8.pos.y), ((2.0f * v_8.pos.z) - v_8.pos.w), v_8.pos.w);
-  tint_interstage_location0 = v_8.prevent_dce;
+  VertexOutput v_21 = vertex_main_inner();
+  gl_Position = vec4(v_21.pos.x, -(v_21.pos.y), ((2.0f * v_21.pos.z) - v_21.pos.w), v_21.pos.w);
+  tint_interstage_location0 = v_21.prevent_dce;
   gl_PointSize = 1.0f;
 }
diff --git a/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.msl b/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.msl
index a62c622..e5af3a5 100644
--- a/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.msl
@@ -9,7 +9,7 @@
 };
 
 int tint_dot(int4 lhs, int4 rhs) {
-  return ((((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z) + (lhs * rhs).w);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).x) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).y)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).z)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).w)));
 }
 
 int dot4I8Packed_881e62() {
@@ -41,7 +41,7 @@
 };
 
 int tint_dot(int4 lhs, int4 rhs) {
-  return ((((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z) + (lhs * rhs).w);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).x) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).y)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).z)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).w)));
 }
 
 int dot4I8Packed_881e62() {
@@ -79,7 +79,7 @@
 };
 
 int tint_dot(int4 lhs, int4 rhs) {
-  return ((((lhs * rhs).x + (lhs * rhs).y) + (lhs * rhs).z) + (lhs * rhs).w);
+  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).x) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).y)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).z)))) + as_type<uint>(as_type<int4>((as_type<uint4>(lhs) * as_type<uint4>(rhs))).w)));
 }
 
 int dot4I8Packed_881e62() {
diff --git a/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.glsl b/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.glsl
index 9768621..3b1aecc 100644
--- a/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.glsl
+++ b/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.glsl
@@ -26,7 +26,8 @@
         barrier();
         int v_2 = b;
         barrier();
-        i = (i + v_2);
+        uint v_3 = uint(i);
+        i = int((v_3 + uint(v_2)));
       }
       continue;
     }
diff --git a/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm b/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm
index 4cb0020..51145ac 100644
--- a/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm
+++ b/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 60
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -85,13 +85,16 @@
          %54 = OpLoad %int %b None
                OpControlBarrier %uint_2 %uint_2 %uint_264
          %56 = OpLoad %int %i None
-         %57 = OpIAdd %int %56 %54
-               OpStore %i %57 None
+         %57 = OpBitcast %uint %56
+         %58 = OpBitcast %uint %54
+         %59 = OpIAdd %uint %57 %58
+         %60 = OpBitcast %int %59
+               OpStore %i %60 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %7
-         %59 = OpLabel
+         %62 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.glsl
index 5e3a0d2..4c2e5a7 100644
--- a/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   int a = 1;
   int b = 2;
-  int r = (a + b);
+  uint v = uint(a);
+  int r = int((v + uint(b)));
 }
diff --git a/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.spvasm
index 821ab06..d2570cf 100644
--- a/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/add/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 9
+; Bound: 13
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,8 +16,12 @@
         %int = OpTypeInt 32 1
           %a = OpConstant %int 1
           %b = OpConstant %int 2
+       %uint = OpTypeInt 32 0
           %f = OpFunction %void None %3
           %4 = OpLabel
-          %r = OpIAdd %int %a %b
+          %9 = OpBitcast %uint %a
+         %10 = OpBitcast %uint %b
+         %11 = OpIAdd %uint %9 %10
+          %r = OpBitcast %int %11
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.glsl
index 50e268c..771c019 100644
--- a/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   int a = 4;
   ivec3 b = ivec3(1, 2, 3);
-  ivec3 r = (a + b);
+  uint v = uint(a);
+  ivec3 r = ivec3((v + uvec3(b)));
 }
diff --git a/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.spvasm
index 8e29b0f..9df6313 100644
--- a/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/add/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 19
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,9 +20,14 @@
       %int_2 = OpConstant %int 2
       %int_3 = OpConstant %int 3
           %b = OpConstantComposite %v3int %int_1 %int_2 %int_3
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %a %a %a
-          %r = OpIAdd %v3int %12 %b
+         %15 = OpBitcast %v3uint %12
+         %16 = OpBitcast %v3uint %b
+         %17 = OpIAdd %v3uint %15 %16
+          %r = OpBitcast %v3int %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.glsl
index 594226f..7b9314f 100644
--- a/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   int b = 4;
-  ivec3 r = (a + b);
+  uvec3 v = uvec3(a);
+  ivec3 r = ivec3((v + uint(b)));
 }
diff --git a/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.spvasm
index d527eba..31246a4 100644
--- a/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/add/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 19
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,9 +20,14 @@
       %int_3 = OpConstant %int 3
           %a = OpConstantComposite %v3int %int_1 %int_2 %int_3
           %b = OpConstant %int 4
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %b %b %b
-          %r = OpIAdd %v3int %a %12
+         %15 = OpBitcast %v3uint %a
+         %16 = OpBitcast %v3uint %12
+         %17 = OpIAdd %v3uint %15 %16
+          %r = OpBitcast %v3int %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.glsl
index f6c5bc2..78a6c92 100644
--- a/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   ivec3 b = ivec3(4, 5, 6);
-  ivec3 r = (a + b);
+  uvec3 v = uvec3(a);
+  ivec3 r = ivec3((v + uvec3(b)));
 }
diff --git a/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.spvasm
index afe2c6a..91771ab 100644
--- a/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/add/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 16
+; Bound: 21
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -23,8 +23,13 @@
       %int_5 = OpConstant %int 5
       %int_6 = OpConstant %int 6
           %b = OpConstantComposite %v3int %int_4 %int_5 %int_6
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
-          %r = OpIAdd %v3int %a %b
+         %17 = OpBitcast %v3uint %a
+         %18 = OpBitcast %v3uint %b
+         %19 = OpIAdd %v3uint %17 %18
+          %r = OpBitcast %v3int %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl
index f6dfde1..6572c96 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl
@@ -10,5 +10,8 @@
 void main() {
   int a = 1;
   int b = 0;
-  int r = tint_div_i32(a, (b + b));
+  int v_3 = a;
+  int v_4 = b;
+  uint v_5 = uint(b);
+  int r = tint_div_i32(v_3, int((v_5 + uint(v_4))));
 }
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm
index 89db611..c15cdd0 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 31
+; Bound: 35
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,7 +20,8 @@
 %_ptr_Function_int = OpTypePointer Function %int
       %int_1 = OpConstant %int 1
       %int_0 = OpConstant %int 0
-         %19 = OpTypeFunction %int %int %int
+       %uint = OpTypeInt 32 0
+         %23 = OpTypeFunction %int %int %int
        %bool = OpTypeBool
 %int_n2147483648 = OpConstant %int -2147483648
      %int_n1 = OpConstant %int -1
@@ -33,20 +34,23 @@
          %11 = OpLoad %int %a None
          %12 = OpLoad %int %b None
          %13 = OpLoad %int %b None
-         %14 = OpIAdd %int %12 %13
-          %r = OpFunctionCall %int %tint_div_i32 %11 %14
+         %15 = OpBitcast %uint %12
+         %16 = OpBitcast %uint %13
+         %17 = OpIAdd %uint %15 %16
+         %18 = OpBitcast %int %17
+          %r = OpFunctionCall %int %tint_div_i32 %11 %18
                OpReturn
                OpFunctionEnd
-%tint_div_i32 = OpFunction %int None %19
+%tint_div_i32 = OpFunction %int None %23
         %lhs = OpFunctionParameter %int
         %rhs = OpFunctionParameter %int
-         %20 = OpLabel
-         %21 = OpIEqual %bool %rhs %int_0
-         %23 = OpIEqual %bool %lhs %int_n2147483648
-         %25 = OpIEqual %bool %rhs %int_n1
-         %27 = OpLogicalAnd %bool %23 %25
-         %28 = OpLogicalOr %bool %21 %27
-         %29 = OpSelect %int %28 %int_1 %rhs
-         %30 = OpSDiv %int %lhs %29
-               OpReturnValue %30
+         %24 = OpLabel
+         %25 = OpIEqual %bool %rhs %int_0
+         %27 = OpIEqual %bool %lhs %int_n2147483648
+         %29 = OpIEqual %bool %rhs %int_n1
+         %31 = OpLogicalAnd %bool %27 %29
+         %32 = OpLogicalOr %bool %25 %31
+         %33 = OpSelect %int %32 %int_1 %rhs
+         %34 = OpSDiv %int %lhs %33
+               OpReturnValue %34
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl
index 545b393..c73572b 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl
@@ -10,6 +10,9 @@
 void main() {
   int a = 4;
   ivec3 b = ivec3(0, 2, 0);
-  ivec3 v_3 = (b + b);
-  ivec3 r = tint_div_v3i32(ivec3(a), v_3);
+  int v_3 = a;
+  ivec3 v_4 = b;
+  uvec3 v_5 = uvec3(b);
+  ivec3 v_6 = ivec3((v_5 + uvec3(v_4)));
+  ivec3 r = tint_div_v3i32(ivec3(v_3), v_6);
 }
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm
index 864f584..15619f1 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 47
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -24,16 +24,18 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
          %12 = OpConstantComposite %v3int %int_0 %int_2 %int_0
-         %24 = OpTypeFunction %v3int %v3int %v3int
-         %27 = OpConstantNull %v3int
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+         %29 = OpTypeFunction %v3int %v3int %v3int
+         %32 = OpConstantNull %v3int
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %int_n2147483648 = OpConstant %int -2147483648
-         %31 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
+         %36 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
      %int_n1 = OpConstant %int -1
-         %34 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
+         %39 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
       %int_1 = OpConstant %int 1
-         %39 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+         %44 = OpConstantComposite %v3int %int_1 %int_1 %int_1
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
@@ -43,21 +45,24 @@
          %15 = OpLoad %int %a None
          %16 = OpLoad %v3int %b None
          %17 = OpLoad %v3int %b None
-         %18 = OpIAdd %v3int %16 %17
-         %19 = OpCompositeConstruct %v3int %15 %15 %15
-          %r = OpFunctionCall %v3int %tint_div_v3i32 %19 %18
+         %20 = OpBitcast %v3uint %16
+         %21 = OpBitcast %v3uint %17
+         %22 = OpIAdd %v3uint %20 %21
+         %23 = OpBitcast %v3int %22
+         %24 = OpCompositeConstruct %v3int %15 %15 %15
+          %r = OpFunctionCall %v3int %tint_div_v3i32 %24 %23
                OpReturn
                OpFunctionEnd
-%tint_div_v3i32 = OpFunction %v3int None %24
+%tint_div_v3i32 = OpFunction %v3int None %29
         %lhs = OpFunctionParameter %v3int
         %rhs = OpFunctionParameter %v3int
-         %25 = OpLabel
-         %26 = OpIEqual %v3bool %rhs %27
-         %30 = OpIEqual %v3bool %lhs %31
-         %33 = OpIEqual %v3bool %rhs %34
-         %36 = OpLogicalAnd %v3bool %30 %33
-         %37 = OpLogicalOr %v3bool %26 %36
-         %38 = OpSelect %v3int %37 %39 %rhs
-         %41 = OpSDiv %v3int %lhs %38
-               OpReturnValue %41
+         %30 = OpLabel
+         %31 = OpIEqual %v3bool %rhs %32
+         %35 = OpIEqual %v3bool %lhs %36
+         %38 = OpIEqual %v3bool %rhs %39
+         %41 = OpLogicalAnd %v3bool %35 %38
+         %42 = OpLogicalOr %v3bool %31 %41
+         %43 = OpSelect %v3int %42 %44 %rhs
+         %46 = OpSDiv %v3int %lhs %43
+               OpReturnValue %46
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl
index 4bb5cc0..ad05090 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl
@@ -11,5 +11,7 @@
   ivec3 a = ivec3(1, 2, 3);
   int b = 0;
   ivec3 v_3 = a;
-  ivec3 r = tint_div_v3i32(v_3, ivec3((b + b)));
+  int v_4 = b;
+  uint v_5 = uint(b);
+  ivec3 r = tint_div_v3i32(v_3, ivec3(int((v_5 + uint(v_4)))));
 }
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm
index a8f86a9..773753d 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 46
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -25,15 +25,16 @@
           %9 = OpConstantComposite %v3int %int_1 %int_2 %int_3
 %_ptr_Function_int = OpTypePointer Function %int
       %int_0 = OpConstant %int 0
-         %25 = OpTypeFunction %v3int %v3int %v3int
-         %28 = OpConstantNull %v3int
+       %uint = OpTypeInt 32 0
+         %29 = OpTypeFunction %v3int %v3int %v3int
+         %32 = OpConstantNull %v3int
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %int_n2147483648 = OpConstant %int -2147483648
-         %32 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
+         %36 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
      %int_n1 = OpConstant %int -1
-         %35 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
-         %40 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+         %39 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
+         %44 = OpConstantComposite %v3int %int_1 %int_1 %int_1
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_v3int Function
@@ -43,21 +44,24 @@
          %16 = OpLoad %v3int %a None
          %17 = OpLoad %int %b None
          %18 = OpLoad %int %b None
-         %19 = OpIAdd %int %17 %18
-         %20 = OpCompositeConstruct %v3int %19 %19 %19
-          %r = OpFunctionCall %v3int %tint_div_v3i32 %16 %20
+         %20 = OpBitcast %uint %17
+         %21 = OpBitcast %uint %18
+         %22 = OpIAdd %uint %20 %21
+         %23 = OpBitcast %int %22
+         %24 = OpCompositeConstruct %v3int %23 %23 %23
+          %r = OpFunctionCall %v3int %tint_div_v3i32 %16 %24
                OpReturn
                OpFunctionEnd
-%tint_div_v3i32 = OpFunction %v3int None %25
+%tint_div_v3i32 = OpFunction %v3int None %29
         %lhs = OpFunctionParameter %v3int
         %rhs = OpFunctionParameter %v3int
-         %26 = OpLabel
-         %27 = OpIEqual %v3bool %rhs %28
-         %31 = OpIEqual %v3bool %lhs %32
-         %34 = OpIEqual %v3bool %rhs %35
-         %37 = OpLogicalAnd %v3bool %31 %34
-         %38 = OpLogicalOr %v3bool %27 %37
-         %39 = OpSelect %v3int %38 %40 %rhs
-         %41 = OpSDiv %v3int %lhs %39
-               OpReturnValue %41
+         %30 = OpLabel
+         %31 = OpIEqual %v3bool %rhs %32
+         %35 = OpIEqual %v3bool %lhs %36
+         %38 = OpIEqual %v3bool %rhs %39
+         %41 = OpLogicalAnd %v3bool %35 %38
+         %42 = OpLogicalOr %v3bool %31 %41
+         %43 = OpSelect %v3int %42 %44 %rhs
+         %45 = OpSDiv %v3int %lhs %43
+               OpReturnValue %45
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl
index 50c8c1d..355e798 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl
@@ -10,5 +10,8 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   ivec3 b = ivec3(0, 5, 0);
-  ivec3 r = tint_div_v3i32(a, (b + b));
+  ivec3 v_3 = a;
+  ivec3 v_4 = b;
+  uvec3 v_5 = uvec3(b);
+  ivec3 r = tint_div_v3i32(v_3, ivec3((v_5 + uvec3(v_4))));
 }
diff --git a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm
index 234faca..0bc0bf3 100644
--- a/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 47
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -26,15 +26,17 @@
       %int_0 = OpConstant %int 0
       %int_5 = OpConstant %int 5
          %14 = OpConstantComposite %v3int %int_0 %int_5 %int_0
-         %25 = OpTypeFunction %v3int %v3int %v3int
-         %28 = OpConstantNull %v3int
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+         %30 = OpTypeFunction %v3int %v3int %v3int
+         %33 = OpConstantNull %v3int
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %int_n2147483648 = OpConstant %int -2147483648
-         %32 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
+         %37 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
      %int_n1 = OpConstant %int -1
-         %35 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
-         %40 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+         %40 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
+         %45 = OpConstantComposite %v3int %int_1 %int_1 %int_1
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_v3int Function
@@ -44,20 +46,23 @@
          %17 = OpLoad %v3int %a None
          %18 = OpLoad %v3int %b None
          %19 = OpLoad %v3int %b None
-         %20 = OpIAdd %v3int %18 %19
-          %r = OpFunctionCall %v3int %tint_div_v3i32 %17 %20
+         %22 = OpBitcast %v3uint %18
+         %23 = OpBitcast %v3uint %19
+         %24 = OpIAdd %v3uint %22 %23
+         %25 = OpBitcast %v3int %24
+          %r = OpFunctionCall %v3int %tint_div_v3i32 %17 %25
                OpReturn
                OpFunctionEnd
-%tint_div_v3i32 = OpFunction %v3int None %25
+%tint_div_v3i32 = OpFunction %v3int None %30
         %lhs = OpFunctionParameter %v3int
         %rhs = OpFunctionParameter %v3int
-         %26 = OpLabel
-         %27 = OpIEqual %v3bool %rhs %28
-         %31 = OpIEqual %v3bool %lhs %32
-         %34 = OpIEqual %v3bool %rhs %35
-         %37 = OpLogicalAnd %v3bool %31 %34
-         %38 = OpLogicalOr %v3bool %27 %37
-         %39 = OpSelect %v3int %38 %40 %rhs
-         %41 = OpSDiv %v3int %lhs %39
-               OpReturnValue %41
+         %31 = OpLabel
+         %32 = OpIEqual %v3bool %rhs %33
+         %36 = OpIEqual %v3bool %lhs %37
+         %39 = OpIEqual %v3bool %rhs %40
+         %42 = OpLogicalAnd %v3bool %36 %39
+         %43 = OpLogicalOr %v3bool %32 %42
+         %44 = OpSelect %v3int %43 %45 %rhs
+         %46 = OpSDiv %v3int %lhs %44
+               OpReturnValue %46
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.glsl
index 02827a8..55d5d6e 100644
--- a/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.glsl
@@ -4,5 +4,5 @@
 void main() {
   int a = 1;
   uint b = 2u;
-  int r = (a << (b & 31u));
+  int r = int((uint(a) << (b & 31u)));
 }
diff --git a/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.spvasm
index a7ae97d..703fe9e 100644
--- a/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 12
+; Bound: 14
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -21,6 +21,8 @@
           %f = OpFunction %void None %3
           %4 = OpLabel
           %9 = OpBitwiseAnd %uint %b %uint_31
-          %r = OpShiftLeftLogical %int %a %9
+         %11 = OpBitcast %uint %a
+         %12 = OpShiftLeftLogical %uint %11 %9
+          %r = OpBitcast %int %12
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.glsl b/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.glsl
index 2458667..499466e 100644
--- a/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.glsl
@@ -4,5 +4,5 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   uvec3 b = uvec3(4u, 5u, 6u);
-  ivec3 r = (a << (b & uvec3(31u)));
+  ivec3 r = ivec3((uvec3(a) << (b & uvec3(31u))));
 }
diff --git a/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.spvasm
index 957d1f4..4783052 100644
--- a/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 23
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -30,6 +30,8 @@
           %f = OpFunction %void None %3
           %4 = OpLabel
          %17 = OpBitwiseAnd %v3uint %b %18
-          %r = OpShiftLeftLogical %v3int %a %17
+         %20 = OpBitcast %v3uint %a
+         %21 = OpShiftLeftLogical %v3uint %20 %17
+          %r = OpBitcast %v3int %21
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.glsl
index c70ad4a..652723d 100644
--- a/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bool v_1 = bool((v & uint((rhs == -1))));
   uint v_2 = uint((rhs == 0));
   int v_3 = mix(rhs, 1, bool((v_2 | uint(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uint v_4 = uint((lhs / v_3));
+  int v_5 = int((v_4 * uint(v_3)));
+  uint v_6 = uint(lhs);
+  return int((v_6 - uint(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.spvasm
index ab4f89f..75f73b5 100644
--- a/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 27
+; Bound: 34
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -24,6 +24,7 @@
        %bool = OpTypeBool
 %int_n2147483648 = OpConstant %int -2147483648
      %int_n1 = OpConstant %int -1
+       %uint = OpTypeInt 32 0
           %f = OpFunction %void None %3
           %4 = OpLabel
           %r = OpFunctionCall %int %tint_mod_i32 %a %b
@@ -40,7 +41,13 @@
          %22 = OpLogicalOr %bool %14 %21
          %23 = OpSelect %int %22 %a %rhs
          %24 = OpSDiv %int %lhs %23
-         %25 = OpIMul %int %24 %23
-         %26 = OpISub %int %lhs %25
-               OpReturnValue %26
+         %26 = OpBitcast %uint %24
+         %27 = OpBitcast %uint %23
+         %28 = OpIMul %uint %26 %27
+         %29 = OpBitcast %int %28
+         %30 = OpBitcast %uint %lhs
+         %31 = OpBitcast %uint %29
+         %32 = OpISub %uint %30 %31
+         %33 = OpBitcast %int %32
+               OpReturnValue %33
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.glsl
index 719ca0b..c0881fa 100644
--- a/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.spvasm
index 980ecac..50f87e8 100644
--- a/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 36
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -32,6 +32,8 @@
      %int_n1 = OpConstant %int -1
          %27 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
          %32 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %a %a %a
@@ -49,7 +51,13 @@
          %30 = OpLogicalOr %v3bool %19 %29
          %31 = OpSelect %v3int %30 %32 %rhs
          %33 = OpSDiv %v3int %lhs %31
-         %34 = OpIMul %v3int %33 %31
-         %35 = OpISub %v3int %lhs %34
-               OpReturnValue %35
+         %36 = OpBitcast %v3uint %33
+         %37 = OpBitcast %v3uint %31
+         %38 = OpIMul %v3uint %36 %37
+         %39 = OpBitcast %v3int %38
+         %40 = OpBitcast %v3uint %lhs
+         %41 = OpBitcast %v3uint %39
+         %42 = OpISub %v3uint %40 %41
+         %43 = OpBitcast %v3int %42
+               OpReturnValue %43
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.glsl
index 58899e5..0e9a8ee 100644
--- a/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.spvasm
index cf04abe..b02fc26 100644
--- a/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 36
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -32,6 +32,8 @@
      %int_n1 = OpConstant %int -1
          %27 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
          %32 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %b %b %b
@@ -49,7 +51,13 @@
          %30 = OpLogicalOr %v3bool %19 %29
          %31 = OpSelect %v3int %30 %32 %rhs
          %33 = OpSDiv %v3int %lhs %31
-         %34 = OpIMul %v3int %33 %31
-         %35 = OpISub %v3int %lhs %34
-               OpReturnValue %35
+         %36 = OpBitcast %v3uint %33
+         %37 = OpBitcast %v3uint %31
+         %38 = OpIMul %v3uint %36 %37
+         %39 = OpBitcast %v3int %38
+         %40 = OpBitcast %v3uint %lhs
+         %41 = OpBitcast %v3uint %39
+         %42 = OpISub %v3uint %40 %41
+         %43 = OpBitcast %v3int %42
+               OpReturnValue %43
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.glsl
index df1cb0e..324ff55 100644
--- a/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.spvasm
index a789b2a..2b35ab6 100644
--- a/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 38
+; Bound: 46
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -35,6 +35,8 @@
      %int_n1 = OpConstant %int -1
          %29 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
          %34 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
           %r = OpFunctionCall %v3int %tint_mod_v3i32 %a %b
@@ -51,7 +53,13 @@
          %32 = OpLogicalOr %v3bool %21 %31
          %33 = OpSelect %v3int %32 %34 %rhs
          %35 = OpSDiv %v3int %lhs %33
-         %36 = OpIMul %v3int %35 %33
-         %37 = OpISub %v3int %lhs %36
-               OpReturnValue %37
+         %38 = OpBitcast %v3uint %35
+         %39 = OpBitcast %v3uint %33
+         %40 = OpIMul %v3uint %38 %39
+         %41 = OpBitcast %v3int %40
+         %42 = OpBitcast %v3uint %lhs
+         %43 = OpBitcast %v3uint %41
+         %44 = OpISub %v3uint %42 %43
+         %45 = OpBitcast %v3int %44
+               OpReturnValue %45
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.glsl
index 0277f57..1ac8c32 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bool v_1 = bool((v & uint((rhs == -1))));
   uint v_2 = uint((rhs == 0));
   int v_3 = mix(rhs, 1, bool((v_2 | uint(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uint v_4 = uint((lhs / v_3));
+  int v_5 = int((v_4 * uint(v_3)));
+  uint v_6 = uint(lhs);
+  return int((v_6 - uint(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.spvasm
index f445481..5820300 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 33
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -23,6 +23,7 @@
        %bool = OpTypeBool
 %int_n2147483648 = OpConstant %int -2147483648
      %int_n1 = OpConstant %int -1
+       %uint = OpTypeInt 32 0
           %f = OpFunction %void None %3
           %4 = OpLabel
           %r = OpFunctionCall %int %tint_mod_i32 %a %b
@@ -39,7 +40,13 @@
          %21 = OpLogicalOr %bool %14 %20
          %22 = OpSelect %int %21 %a %rhs
          %23 = OpSDiv %int %lhs %22
-         %24 = OpIMul %int %23 %22
-         %25 = OpISub %int %lhs %24
-               OpReturnValue %25
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %22
+         %27 = OpIMul %uint %25 %26
+         %28 = OpBitcast %int %27
+         %29 = OpBitcast %uint %lhs
+         %30 = OpBitcast %uint %28
+         %31 = OpISub %uint %29 %30
+         %32 = OpBitcast %int %31
+               OpReturnValue %32
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.glsl
index d05c957..3a650c7 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.spvasm
index f5822f8..c0ccbda 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 36
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -32,6 +32,8 @@
          %26 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
       %int_1 = OpConstant %int 1
          %31 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %11 = OpCompositeConstruct %v3int %a %a %a
@@ -49,7 +51,13 @@
          %29 = OpLogicalOr %v3bool %18 %28
          %30 = OpSelect %v3int %29 %31 %rhs
          %33 = OpSDiv %v3int %lhs %30
-         %34 = OpIMul %v3int %33 %30
-         %35 = OpISub %v3int %lhs %34
-               OpReturnValue %35
+         %36 = OpBitcast %v3uint %33
+         %37 = OpBitcast %v3uint %30
+         %38 = OpIMul %v3uint %36 %37
+         %39 = OpBitcast %v3int %38
+         %40 = OpBitcast %v3uint %lhs
+         %41 = OpBitcast %v3uint %39
+         %42 = OpISub %v3uint %40 %41
+         %43 = OpBitcast %v3int %42
+               OpReturnValue %43
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.glsl
index 64f94d7..1e5176c 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.spvasm
index 2b24142..b89d82a 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 36
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -32,6 +32,8 @@
      %int_n1 = OpConstant %int -1
          %27 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
          %32 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %b %b %b
@@ -49,7 +51,13 @@
          %30 = OpLogicalOr %v3bool %19 %29
          %31 = OpSelect %v3int %30 %32 %rhs
          %33 = OpSDiv %v3int %lhs %31
-         %34 = OpIMul %v3int %33 %31
-         %35 = OpISub %v3int %lhs %34
-               OpReturnValue %35
+         %36 = OpBitcast %v3uint %33
+         %37 = OpBitcast %v3uint %31
+         %38 = OpIMul %v3uint %36 %37
+         %39 = OpBitcast %v3int %38
+         %40 = OpBitcast %v3uint %lhs
+         %41 = OpBitcast %v3uint %39
+         %42 = OpISub %v3uint %40 %41
+         %43 = OpBitcast %v3int %42
+               OpReturnValue %43
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.glsl
index 2691a87..171bcaa 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.spvasm
index 295c6f7..18868e5 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 37
+; Bound: 45
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -34,6 +34,8 @@
      %int_n1 = OpConstant %int -1
          %28 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
          %33 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
           %r = OpFunctionCall %v3int %tint_mod_v3i32 %a %b
@@ -50,7 +52,13 @@
          %31 = OpLogicalOr %v3bool %20 %30
          %32 = OpSelect %v3int %31 %33 %rhs
          %34 = OpSDiv %v3int %lhs %32
-         %35 = OpIMul %v3int %34 %32
-         %36 = OpISub %v3int %lhs %35
-               OpReturnValue %36
+         %37 = OpBitcast %v3uint %34
+         %38 = OpBitcast %v3uint %32
+         %39 = OpIMul %v3uint %37 %38
+         %40 = OpBitcast %v3int %39
+         %41 = OpBitcast %v3uint %lhs
+         %42 = OpBitcast %v3uint %40
+         %43 = OpISub %v3uint %41 %42
+         %44 = OpBitcast %v3int %43
+               OpReturnValue %44
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl
index fb8206e..c2876bf 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.glsl
@@ -5,11 +5,17 @@
   bool v_1 = bool((v & uint((rhs == -1))));
   uint v_2 = uint((rhs == 0));
   int v_3 = mix(rhs, 1, bool((v_2 | uint(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uint v_4 = uint((lhs / v_3));
+  int v_5 = int((v_4 * uint(v_3)));
+  uint v_6 = uint(lhs);
+  return int((v_6 - uint(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   int a = 1;
   int b = 0;
-  int r = tint_mod_i32(a, (b + b));
+  int v_7 = a;
+  int v_8 = b;
+  uint v_9 = uint(b);
+  int r = tint_mod_i32(v_7, int((v_9 + uint(v_8))));
 }
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm
index a1b93d0..1b111cc 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 33
+; Bound: 43
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,7 +20,8 @@
 %_ptr_Function_int = OpTypePointer Function %int
       %int_1 = OpConstant %int 1
       %int_0 = OpConstant %int 0
-         %19 = OpTypeFunction %int %int %int
+       %uint = OpTypeInt 32 0
+         %23 = OpTypeFunction %int %int %int
        %bool = OpTypeBool
 %int_n2147483648 = OpConstant %int -2147483648
      %int_n1 = OpConstant %int -1
@@ -33,22 +34,31 @@
          %11 = OpLoad %int %a None
          %12 = OpLoad %int %b None
          %13 = OpLoad %int %b None
-         %14 = OpIAdd %int %12 %13
-          %r = OpFunctionCall %int %tint_mod_i32 %11 %14
+         %15 = OpBitcast %uint %12
+         %16 = OpBitcast %uint %13
+         %17 = OpIAdd %uint %15 %16
+         %18 = OpBitcast %int %17
+          %r = OpFunctionCall %int %tint_mod_i32 %11 %18
                OpReturn
                OpFunctionEnd
-%tint_mod_i32 = OpFunction %int None %19
+%tint_mod_i32 = OpFunction %int None %23
         %lhs = OpFunctionParameter %int
         %rhs = OpFunctionParameter %int
-         %20 = OpLabel
-         %21 = OpIEqual %bool %rhs %int_0
-         %23 = OpIEqual %bool %lhs %int_n2147483648
-         %25 = OpIEqual %bool %rhs %int_n1
-         %27 = OpLogicalAnd %bool %23 %25
-         %28 = OpLogicalOr %bool %21 %27
-         %29 = OpSelect %int %28 %int_1 %rhs
-         %30 = OpSDiv %int %lhs %29
-         %31 = OpIMul %int %30 %29
-         %32 = OpISub %int %lhs %31
-               OpReturnValue %32
+         %24 = OpLabel
+         %25 = OpIEqual %bool %rhs %int_0
+         %27 = OpIEqual %bool %lhs %int_n2147483648
+         %29 = OpIEqual %bool %rhs %int_n1
+         %31 = OpLogicalAnd %bool %27 %29
+         %32 = OpLogicalOr %bool %25 %31
+         %33 = OpSelect %int %32 %int_1 %rhs
+         %34 = OpSDiv %int %lhs %33
+         %35 = OpBitcast %uint %34
+         %36 = OpBitcast %uint %33
+         %37 = OpIMul %uint %35 %36
+         %38 = OpBitcast %int %37
+         %39 = OpBitcast %uint %lhs
+         %40 = OpBitcast %uint %38
+         %41 = OpISub %uint %39 %40
+         %42 = OpBitcast %int %41
+               OpReturnValue %42
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl
index d77248a..a165a7b 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.glsl
@@ -5,12 +5,18 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   int a = 4;
   ivec3 b = ivec3(0, 2, 0);
-  ivec3 v_4 = (b + b);
-  ivec3 r = tint_mod_v3i32(ivec3(a), v_4);
+  int v_7 = a;
+  ivec3 v_8 = b;
+  uvec3 v_9 = uvec3(b);
+  ivec3 v_10 = ivec3((v_9 + uvec3(v_8)));
+  ivec3 r = tint_mod_v3i32(ivec3(v_7), v_10);
 }
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm
index e8bb769..4e5a459 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 55
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -24,16 +24,18 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
          %12 = OpConstantComposite %v3int %int_0 %int_2 %int_0
-         %24 = OpTypeFunction %v3int %v3int %v3int
-         %27 = OpConstantNull %v3int
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+         %29 = OpTypeFunction %v3int %v3int %v3int
+         %32 = OpConstantNull %v3int
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %int_n2147483648 = OpConstant %int -2147483648
-         %31 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
+         %36 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
      %int_n1 = OpConstant %int -1
-         %34 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
+         %39 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
       %int_1 = OpConstant %int 1
-         %39 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+         %44 = OpConstantComposite %v3int %int_1 %int_1 %int_1
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
@@ -43,23 +45,32 @@
          %15 = OpLoad %int %a None
          %16 = OpLoad %v3int %b None
          %17 = OpLoad %v3int %b None
-         %18 = OpIAdd %v3int %16 %17
-         %19 = OpCompositeConstruct %v3int %15 %15 %15
-          %r = OpFunctionCall %v3int %tint_mod_v3i32 %19 %18
+         %20 = OpBitcast %v3uint %16
+         %21 = OpBitcast %v3uint %17
+         %22 = OpIAdd %v3uint %20 %21
+         %23 = OpBitcast %v3int %22
+         %24 = OpCompositeConstruct %v3int %15 %15 %15
+          %r = OpFunctionCall %v3int %tint_mod_v3i32 %24 %23
                OpReturn
                OpFunctionEnd
-%tint_mod_v3i32 = OpFunction %v3int None %24
+%tint_mod_v3i32 = OpFunction %v3int None %29
         %lhs = OpFunctionParameter %v3int
         %rhs = OpFunctionParameter %v3int
-         %25 = OpLabel
-         %26 = OpIEqual %v3bool %rhs %27
-         %30 = OpIEqual %v3bool %lhs %31
-         %33 = OpIEqual %v3bool %rhs %34
-         %36 = OpLogicalAnd %v3bool %30 %33
-         %37 = OpLogicalOr %v3bool %26 %36
-         %38 = OpSelect %v3int %37 %39 %rhs
-         %41 = OpSDiv %v3int %lhs %38
-         %42 = OpIMul %v3int %41 %38
-         %43 = OpISub %v3int %lhs %42
-               OpReturnValue %43
+         %30 = OpLabel
+         %31 = OpIEqual %v3bool %rhs %32
+         %35 = OpIEqual %v3bool %lhs %36
+         %38 = OpIEqual %v3bool %rhs %39
+         %41 = OpLogicalAnd %v3bool %35 %38
+         %42 = OpLogicalOr %v3bool %31 %41
+         %43 = OpSelect %v3int %42 %44 %rhs
+         %46 = OpSDiv %v3int %lhs %43
+         %47 = OpBitcast %v3uint %46
+         %48 = OpBitcast %v3uint %43
+         %49 = OpIMul %v3uint %47 %48
+         %50 = OpBitcast %v3int %49
+         %51 = OpBitcast %v3uint %lhs
+         %52 = OpBitcast %v3uint %50
+         %53 = OpISub %v3uint %51 %52
+         %54 = OpBitcast %v3int %53
+               OpReturnValue %54
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl
index eaadd55..d809b83 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.glsl
@@ -5,12 +5,17 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   int b = 0;
-  ivec3 v_4 = a;
-  ivec3 r = tint_mod_v3i32(v_4, ivec3((b + b)));
+  ivec3 v_7 = a;
+  int v_8 = b;
+  uint v_9 = uint(b);
+  ivec3 r = tint_mod_v3i32(v_7, ivec3(int((v_9 + uint(v_8)))));
 }
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm
index f6f111c..150fb51 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 55
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -25,15 +25,17 @@
           %9 = OpConstantComposite %v3int %int_1 %int_2 %int_3
 %_ptr_Function_int = OpTypePointer Function %int
       %int_0 = OpConstant %int 0
-         %25 = OpTypeFunction %v3int %v3int %v3int
-         %28 = OpConstantNull %v3int
+       %uint = OpTypeInt 32 0
+         %29 = OpTypeFunction %v3int %v3int %v3int
+         %32 = OpConstantNull %v3int
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %int_n2147483648 = OpConstant %int -2147483648
-         %32 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
+         %36 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
      %int_n1 = OpConstant %int -1
-         %35 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
-         %40 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+         %39 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
+         %44 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_v3int Function
@@ -43,23 +45,32 @@
          %16 = OpLoad %v3int %a None
          %17 = OpLoad %int %b None
          %18 = OpLoad %int %b None
-         %19 = OpIAdd %int %17 %18
-         %20 = OpCompositeConstruct %v3int %19 %19 %19
-          %r = OpFunctionCall %v3int %tint_mod_v3i32 %16 %20
+         %20 = OpBitcast %uint %17
+         %21 = OpBitcast %uint %18
+         %22 = OpIAdd %uint %20 %21
+         %23 = OpBitcast %int %22
+         %24 = OpCompositeConstruct %v3int %23 %23 %23
+          %r = OpFunctionCall %v3int %tint_mod_v3i32 %16 %24
                OpReturn
                OpFunctionEnd
-%tint_mod_v3i32 = OpFunction %v3int None %25
+%tint_mod_v3i32 = OpFunction %v3int None %29
         %lhs = OpFunctionParameter %v3int
         %rhs = OpFunctionParameter %v3int
-         %26 = OpLabel
-         %27 = OpIEqual %v3bool %rhs %28
-         %31 = OpIEqual %v3bool %lhs %32
-         %34 = OpIEqual %v3bool %rhs %35
-         %37 = OpLogicalAnd %v3bool %31 %34
-         %38 = OpLogicalOr %v3bool %27 %37
-         %39 = OpSelect %v3int %38 %40 %rhs
-         %41 = OpSDiv %v3int %lhs %39
-         %42 = OpIMul %v3int %41 %39
-         %43 = OpISub %v3int %lhs %42
-               OpReturnValue %43
+         %30 = OpLabel
+         %31 = OpIEqual %v3bool %rhs %32
+         %35 = OpIEqual %v3bool %lhs %36
+         %38 = OpIEqual %v3bool %rhs %39
+         %41 = OpLogicalAnd %v3bool %35 %38
+         %42 = OpLogicalOr %v3bool %31 %41
+         %43 = OpSelect %v3int %42 %44 %rhs
+         %45 = OpSDiv %v3int %lhs %43
+         %47 = OpBitcast %v3uint %45
+         %48 = OpBitcast %v3uint %43
+         %49 = OpIMul %v3uint %47 %48
+         %50 = OpBitcast %v3int %49
+         %51 = OpBitcast %v3uint %lhs
+         %52 = OpBitcast %v3uint %50
+         %53 = OpISub %v3uint %51 %52
+         %54 = OpBitcast %v3int %53
+               OpReturnValue %54
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl
index 6610ea0..b8725f9 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.glsl
@@ -5,11 +5,17 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   ivec3 b = ivec3(0, 5, 0);
-  ivec3 r = tint_mod_v3i32(a, (b + b));
+  ivec3 v_7 = a;
+  ivec3 v_8 = b;
+  uvec3 v_9 = uvec3(b);
+  ivec3 r = tint_mod_v3i32(v_7, ivec3((v_9 + uvec3(v_8))));
 }
diff --git a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm
index f1c584f..16d11d1 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 55
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -26,15 +26,17 @@
       %int_0 = OpConstant %int 0
       %int_5 = OpConstant %int 5
          %14 = OpConstantComposite %v3int %int_0 %int_5 %int_0
-         %25 = OpTypeFunction %v3int %v3int %v3int
-         %28 = OpConstantNull %v3int
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+         %30 = OpTypeFunction %v3int %v3int %v3int
+         %33 = OpConstantNull %v3int
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %int_n2147483648 = OpConstant %int -2147483648
-         %32 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
+         %37 = OpConstantComposite %v3int %int_n2147483648 %int_n2147483648 %int_n2147483648
      %int_n1 = OpConstant %int -1
-         %35 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
-         %40 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+         %40 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
+         %45 = OpConstantComposite %v3int %int_1 %int_1 %int_1
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_v3int Function
@@ -44,22 +46,31 @@
          %17 = OpLoad %v3int %a None
          %18 = OpLoad %v3int %b None
          %19 = OpLoad %v3int %b None
-         %20 = OpIAdd %v3int %18 %19
-          %r = OpFunctionCall %v3int %tint_mod_v3i32 %17 %20
+         %22 = OpBitcast %v3uint %18
+         %23 = OpBitcast %v3uint %19
+         %24 = OpIAdd %v3uint %22 %23
+         %25 = OpBitcast %v3int %24
+          %r = OpFunctionCall %v3int %tint_mod_v3i32 %17 %25
                OpReturn
                OpFunctionEnd
-%tint_mod_v3i32 = OpFunction %v3int None %25
+%tint_mod_v3i32 = OpFunction %v3int None %30
         %lhs = OpFunctionParameter %v3int
         %rhs = OpFunctionParameter %v3int
-         %26 = OpLabel
-         %27 = OpIEqual %v3bool %rhs %28
-         %31 = OpIEqual %v3bool %lhs %32
-         %34 = OpIEqual %v3bool %rhs %35
-         %37 = OpLogicalAnd %v3bool %31 %34
-         %38 = OpLogicalOr %v3bool %27 %37
-         %39 = OpSelect %v3int %38 %40 %rhs
-         %41 = OpSDiv %v3int %lhs %39
-         %42 = OpIMul %v3int %41 %39
-         %43 = OpISub %v3int %lhs %42
-               OpReturnValue %43
+         %31 = OpLabel
+         %32 = OpIEqual %v3bool %rhs %33
+         %36 = OpIEqual %v3bool %lhs %37
+         %39 = OpIEqual %v3bool %rhs %40
+         %42 = OpLogicalAnd %v3bool %36 %39
+         %43 = OpLogicalOr %v3bool %32 %42
+         %44 = OpSelect %v3int %43 %45 %rhs
+         %46 = OpSDiv %v3int %lhs %44
+         %47 = OpBitcast %v3uint %46
+         %48 = OpBitcast %v3uint %44
+         %49 = OpIMul %v3uint %47 %48
+         %50 = OpBitcast %v3int %49
+         %51 = OpBitcast %v3uint %lhs
+         %52 = OpBitcast %v3uint %50
+         %53 = OpISub %v3uint %51 %52
+         %54 = OpBitcast %v3int %53
+               OpReturnValue %54
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.glsl
index 0277f57..1ac8c32 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bool v_1 = bool((v & uint((rhs == -1))));
   uint v_2 = uint((rhs == 0));
   int v_3 = mix(rhs, 1, bool((v_2 | uint(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uint v_4 = uint((lhs / v_3));
+  int v_5 = int((v_4 * uint(v_3)));
+  uint v_6 = uint(lhs);
+  return int((v_6 - uint(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.spvasm
index 2d3c7ea..bcaceac 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 31
+; Bound: 38
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -24,6 +24,7 @@
        %bool = OpTypeBool
 %int_n2147483648 = OpConstant %int -2147483648
      %int_n1 = OpConstant %int -1
+       %uint = OpTypeInt 32 0
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
@@ -46,7 +47,13 @@
          %26 = OpLogicalOr %bool %19 %25
          %27 = OpSelect %int %26 %int_1 %rhs
          %28 = OpSDiv %int %lhs %27
-         %29 = OpIMul %int %28 %27
-         %30 = OpISub %int %lhs %29
-               OpReturnValue %30
+         %30 = OpBitcast %uint %28
+         %31 = OpBitcast %uint %27
+         %32 = OpIMul %uint %30 %31
+         %33 = OpBitcast %int %32
+         %34 = OpBitcast %uint %lhs
+         %35 = OpBitcast %uint %33
+         %36 = OpISub %uint %34 %35
+         %37 = OpBitcast %int %36
+               OpReturnValue %37
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.glsl
index b96a4d2..717e97a 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.glsl
@@ -5,12 +5,15 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   int a = 4;
   ivec3 b = ivec3(0, 2, 0);
-  ivec3 v_4 = b;
-  ivec3 r = tint_mod_v3i32(ivec3(a), v_4);
+  ivec3 v_7 = b;
+  ivec3 r = tint_mod_v3i32(ivec3(a), v_7);
 }
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.spvasm
index c686cad..2276d48 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 50
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -34,6 +34,8 @@
          %32 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
       %int_1 = OpConstant %int 1
          %37 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
@@ -57,7 +59,13 @@
          %35 = OpLogicalOr %v3bool %24 %34
          %36 = OpSelect %v3int %35 %37 %rhs
          %39 = OpSDiv %v3int %lhs %36
-         %40 = OpIMul %v3int %39 %36
-         %41 = OpISub %v3int %lhs %40
-               OpReturnValue %41
+         %42 = OpBitcast %v3uint %39
+         %43 = OpBitcast %v3uint %36
+         %44 = OpIMul %v3uint %42 %43
+         %45 = OpBitcast %v3int %44
+         %46 = OpBitcast %v3uint %lhs
+         %47 = OpBitcast %v3uint %45
+         %48 = OpISub %v3uint %46 %47
+         %49 = OpBitcast %v3int %48
+               OpReturnValue %49
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.glsl
index dc5b400..660a2e5 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.glsl
@@ -5,12 +5,15 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   int b = 0;
-  ivec3 v_4 = a;
-  ivec3 r = tint_mod_v3i32(v_4, ivec3(b));
+  ivec3 v_7 = a;
+  ivec3 r = tint_mod_v3i32(v_7, ivec3(b));
 }
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.spvasm
index 20b2582..91e76ca 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 50
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -34,6 +34,8 @@
      %int_n1 = OpConstant %int -1
          %33 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
          %38 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_v3int Function
@@ -57,7 +59,13 @@
          %36 = OpLogicalOr %v3bool %25 %35
          %37 = OpSelect %v3int %36 %38 %rhs
          %39 = OpSDiv %v3int %lhs %37
-         %40 = OpIMul %v3int %39 %37
-         %41 = OpISub %v3int %lhs %40
-               OpReturnValue %41
+         %42 = OpBitcast %v3uint %39
+         %43 = OpBitcast %v3uint %37
+         %44 = OpIMul %v3uint %42 %43
+         %45 = OpBitcast %v3int %44
+         %46 = OpBitcast %v3uint %lhs
+         %47 = OpBitcast %v3uint %45
+         %48 = OpISub %v3uint %46 %47
+         %49 = OpBitcast %v3int %48
+               OpReturnValue %49
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.glsl
index 2691a87..171bcaa 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.glsl
@@ -5,7 +5,10 @@
   bvec3 v_1 = bvec3((v & uvec3(equal(rhs, ivec3(-1)))));
   uvec3 v_2 = uvec3(equal(rhs, ivec3(0)));
   ivec3 v_3 = mix(rhs, ivec3(1), bvec3((v_2 | uvec3(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uvec3 v_4 = uvec3((lhs / v_3));
+  ivec3 v_5 = ivec3((v_4 * uvec3(v_3)));
+  uvec3 v_6 = uvec3(lhs);
+  return ivec3((v_6 - uvec3(v_5)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.spvasm
index 213281f..163655c 100644
--- a/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 50
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -35,6 +35,8 @@
      %int_n1 = OpConstant %int -1
          %33 = OpConstantComposite %v3int %int_n1 %int_n1 %int_n1
          %38 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_v3int Function
@@ -57,7 +59,13 @@
          %36 = OpLogicalOr %v3bool %25 %35
          %37 = OpSelect %v3int %36 %38 %rhs
          %39 = OpSDiv %v3int %lhs %37
-         %40 = OpIMul %v3int %39 %37
-         %41 = OpISub %v3int %lhs %40
-               OpReturnValue %41
+         %42 = OpBitcast %v3uint %39
+         %43 = OpBitcast %v3uint %37
+         %44 = OpIMul %v3uint %42 %43
+         %45 = OpBitcast %v3int %44
+         %46 = OpBitcast %v3uint %lhs
+         %47 = OpBitcast %v3uint %45
+         %48 = OpISub %v3uint %46 %47
+         %49 = OpBitcast %v3int %48
+               OpReturnValue %49
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.glsl
index d84a345..befefb7 100644
--- a/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   int a = 1;
   int b = 2;
-  int r = (a * b);
+  uint v = uint(a);
+  int r = int((v * uint(b)));
 }
diff --git a/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.spvasm
index daff6c9..9eb88ac 100644
--- a/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 9
+; Bound: 13
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,8 +16,12 @@
         %int = OpTypeInt 32 1
           %a = OpConstant %int 1
           %b = OpConstant %int 2
+       %uint = OpTypeInt 32 0
           %f = OpFunction %void None %3
           %4 = OpLabel
-          %r = OpIMul %int %a %b
+          %9 = OpBitcast %uint %a
+         %10 = OpBitcast %uint %b
+         %11 = OpIMul %uint %9 %10
+          %r = OpBitcast %int %11
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.glsl
index e561784..27e40fb 100644
--- a/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   int a = 4;
   ivec3 b = ivec3(1, 2, 3);
-  ivec3 r = (a * b);
+  uint v = uint(a);
+  ivec3 r = ivec3((v * uvec3(b)));
 }
diff --git a/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.spvasm
index 89b5324..6ac084f 100644
--- a/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 19
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,9 +20,14 @@
       %int_2 = OpConstant %int 2
       %int_3 = OpConstant %int 3
           %b = OpConstantComposite %v3int %int_1 %int_2 %int_3
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %a %a %a
-          %r = OpIMul %v3int %12 %b
+         %15 = OpBitcast %v3uint %12
+         %16 = OpBitcast %v3uint %b
+         %17 = OpIMul %v3uint %15 %16
+          %r = OpBitcast %v3int %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.glsl
index 403e496..48d1790 100644
--- a/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   int b = 4;
-  ivec3 r = (a * b);
+  uvec3 v = uvec3(a);
+  ivec3 r = ivec3((v * uint(b)));
 }
diff --git a/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.spvasm
index c0d5afe..8f34a50 100644
--- a/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 19
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,9 +20,14 @@
       %int_3 = OpConstant %int 3
           %a = OpConstantComposite %v3int %int_1 %int_2 %int_3
           %b = OpConstant %int 4
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %b %b %b
-          %r = OpIMul %v3int %a %12
+         %15 = OpBitcast %v3uint %a
+         %16 = OpBitcast %v3uint %12
+         %17 = OpIMul %v3uint %15 %16
+          %r = OpBitcast %v3int %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.glsl
index f65b0c2..629b7d6 100644
--- a/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   ivec3 b = ivec3(4, 5, 6);
-  ivec3 r = (a * b);
+  uvec3 v = uvec3(a);
+  ivec3 r = ivec3((v * uvec3(b)));
 }
diff --git a/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.spvasm
index 4426d5d..780b80b 100644
--- a/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 16
+; Bound: 21
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -23,8 +23,13 @@
       %int_5 = OpConstant %int 5
       %int_6 = OpConstant %int 6
           %b = OpConstantComposite %v3int %int_4 %int_5 %int_6
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
-          %r = OpIMul %v3int %a %b
+         %17 = OpBitcast %v3uint %a
+         %18 = OpBitcast %v3uint %b
+         %19 = OpIMul %v3uint %17 %18
+          %r = OpBitcast %v3int %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.glsl
index 4c5edfa..717c494 100644
--- a/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   int a = 1;
   int b = 2;
-  int r = (a - b);
+  uint v = uint(a);
+  int r = int((v - uint(b)));
 }
diff --git a/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.spvasm
index d7188cd..e25fbb2 100644
--- a/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 9
+; Bound: 13
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,8 +16,12 @@
         %int = OpTypeInt 32 1
           %a = OpConstant %int 1
           %b = OpConstant %int 2
+       %uint = OpTypeInt 32 0
           %f = OpFunction %void None %3
           %4 = OpLabel
-          %r = OpISub %int %a %b
+          %9 = OpBitcast %uint %a
+         %10 = OpBitcast %uint %b
+         %11 = OpISub %uint %9 %10
+          %r = OpBitcast %int %11
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.glsl
index 0f9b198..ccadf15 100644
--- a/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   int a = 4;
   ivec3 b = ivec3(1, 2, 3);
-  ivec3 r = (a - b);
+  uint v = uint(a);
+  ivec3 r = ivec3((v - uvec3(b)));
 }
diff --git a/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.spvasm
index b8aa4da..52bb6c8 100644
--- a/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 19
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,9 +20,14 @@
       %int_2 = OpConstant %int 2
       %int_3 = OpConstant %int 3
           %b = OpConstantComposite %v3int %int_1 %int_2 %int_3
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %a %a %a
-          %r = OpISub %v3int %12 %b
+         %15 = OpBitcast %v3uint %12
+         %16 = OpBitcast %v3uint %b
+         %17 = OpISub %v3uint %15 %16
+          %r = OpBitcast %v3int %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.glsl b/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.glsl
index 278fe3f..a4a6394 100644
--- a/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   int b = 4;
-  ivec3 r = (a - b);
+  uvec3 v = uvec3(a);
+  ivec3 r = ivec3((v - uint(b)));
 }
diff --git a/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.spvasm
index d7c5d19..5f8eb90 100644
--- a/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 19
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -20,9 +20,14 @@
       %int_3 = OpConstant %int 3
           %a = OpConstantComposite %v3int %int_1 %int_2 %int_3
           %b = OpConstant %int 4
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
          %12 = OpCompositeConstruct %v3int %b %b %b
-          %r = OpISub %v3int %a %12
+         %15 = OpBitcast %v3uint %a
+         %16 = OpBitcast %v3uint %12
+         %17 = OpISub %v3uint %15 %16
+          %r = OpBitcast %v3int %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.glsl b/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.glsl
index 06c418a..fbe4e35 100644
--- a/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 void main() {
   ivec3 a = ivec3(1, 2, 3);
   ivec3 b = ivec3(4, 5, 6);
-  ivec3 r = (a - b);
+  uvec3 v = uvec3(a);
+  ivec3 r = ivec3((v - uvec3(b)));
 }
diff --git a/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.spvasm b/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.spvasm
index 68c571d..ab1217b 100644
--- a/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.spvasm
+++ b/test/tint/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 16
+; Bound: 21
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -23,8 +23,13 @@
       %int_5 = OpConstant %int 5
       %int_6 = OpConstant %int 6
           %b = OpConstantComposite %v3int %int_4 %int_5 %int_6
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
           %f = OpFunction %void None %3
           %4 = OpLabel
-          %r = OpISub %v3int %a %b
+         %17 = OpBitcast %v3uint %a
+         %18 = OpBitcast %v3uint %b
+         %19 = OpISub %v3uint %17 %18
+          %r = OpBitcast %v3int %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/literals/intmin.wgsl.expected.glsl b/test/tint/expressions/literals/intmin.wgsl.expected.glsl
index f1999ac..eec3272 100644
--- a/test/tint/expressions/literals/intmin.wgsl.expected.glsl
+++ b/test/tint/expressions/literals/intmin.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 int add_int_min_explicit() {
   int a = (-2147483647 - 1);
-  int b = (a + 1);
+  uint v = uint(a);
+  int b = int((v + uint(1)));
   int c = -2147483647;
   return c;
 }
diff --git a/test/tint/expressions/literals/intmin.wgsl.expected.spvasm b/test/tint/expressions/literals/intmin.wgsl.expected.spvasm
index c2161cf..c37d758 100644
--- a/test/tint/expressions/literals/intmin.wgsl.expected.spvasm
+++ b/test/tint/expressions/literals/intmin.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 19
+; Bound: 23
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,10 +16,11 @@
           %3 = OpTypeFunction %int
 %_ptr_Function_int = OpTypePointer Function %int
 %int_n2147483648 = OpConstant %int -2147483648
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
 %int_n2147483647 = OpConstant %int -2147483647
        %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %21 = OpTypeFunction %void
 %add_int_min_explicit = OpFunction %int None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
@@ -27,13 +28,16 @@
           %c = OpVariable %_ptr_Function_int Function
                OpStore %a %int_n2147483648
           %8 = OpLoad %int %a None
-          %9 = OpIAdd %int %8 %int_1
-               OpStore %b %9
+         %10 = OpBitcast %uint %8
+         %11 = OpBitcast %uint %int_1
+         %13 = OpIAdd %uint %10 %11
+         %14 = OpBitcast %int %13
+               OpStore %b %14
                OpStore %c %int_n2147483647
-         %14 = OpLoad %int %c None
-               OpReturnValue %14
+         %18 = OpLoad %int %c None
+               OpReturnValue %18
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %17
-         %18 = OpLabel
+%unused_entry_point = OpFunction %void None %21
+         %22 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/unary/negate/negate.wgsl.expected.glsl b/test/tint/expressions/unary/negate/negate.wgsl.expected.glsl
index 1048469..c3cf709 100644
--- a/test/tint/expressions/unary/negate/negate.wgsl.expected.glsl
+++ b/test/tint/expressions/unary/negate/negate.wgsl.expected.glsl
@@ -1,10 +1,10 @@
 #version 310 es
 
 int i(int x) {
-  return -(x);
+  return int((~(uint(x)) + 1u));
 }
 ivec4 vi(ivec4 x) {
-  return -(x);
+  return ivec4((~(uvec4(x)) + uvec4(1u)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/unary/negate/negate.wgsl.expected.spvasm b/test/tint/expressions/unary/negate/negate.wgsl.expected.spvasm
index 8d982b5..ba54b0d 100644
--- a/test/tint/expressions/unary/negate/negate.wgsl.expected.spvasm
+++ b/test/tint/expressions/unary/negate/negate.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 17
+; Bound: 27
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -14,23 +14,33 @@
                OpName %unused_entry_point "unused_entry_point"
         %int = OpTypeInt 32 1
           %4 = OpTypeFunction %int %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
       %v4int = OpTypeVector %int 4
-         %10 = OpTypeFunction %v4int %v4int
+         %15 = OpTypeFunction %v4int %v4int
+     %v4uint = OpTypeVector %uint 4
+         %21 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
        %void = OpTypeVoid
-         %15 = OpTypeFunction %void
+         %25 = OpTypeFunction %void
           %i = OpFunction %int None %4
           %x = OpFunctionParameter %int
           %5 = OpLabel
-          %6 = OpSNegate %int %x
-               OpReturnValue %6
+          %7 = OpBitcast %uint %x
+          %8 = OpNot %uint %7
+          %9 = OpIAdd %uint %8 %uint_1
+         %11 = OpBitcast %int %9
+               OpReturnValue %11
                OpFunctionEnd
-         %vi = OpFunction %v4int None %10
+         %vi = OpFunction %v4int None %15
         %x_0 = OpFunctionParameter %v4int
-         %11 = OpLabel
-         %12 = OpSNegate %v4int %x_0
-               OpReturnValue %12
-               OpFunctionEnd
-%unused_entry_point = OpFunction %void None %15
          %16 = OpLabel
+         %18 = OpBitcast %v4uint %x_0
+         %19 = OpNot %v4uint %18
+         %20 = OpIAdd %v4uint %19 %21
+         %22 = OpBitcast %v4int %20
+               OpReturnValue %22
+               OpFunctionEnd
+%unused_entry_point = OpFunction %void None %25
+         %26 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.glsl b/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.glsl
index f147152..bf144e9 100644
--- a/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.glsl
+++ b/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.glsl
@@ -1,8 +1,12 @@
 #version 310 es
 
 void c(int x, int y, int z) {
-  int a = (((1 + x) + y) + z);
-  a = (a + 2);
+  uint v = uint(1);
+  uint v_1 = uint(int((v + uint(x))));
+  uint v_2 = uint(int((v_1 + uint(y))));
+  int a = int((v_2 + uint(z)));
+  uint v_3 = uint(a);
+  a = int((v_3 + uint(2)));
 }
 void b() {
   c(1, 2, 3);
diff --git a/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.spvasm b/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.spvasm
index 258b418..a785188 100644
--- a/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.spvasm
+++ b/test/tint/expressions/user_call/multi_param_no_return.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 29
+; Bound: 42
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,10 +17,11 @@
        %void = OpTypeVoid
         %int = OpTypeInt 32 1
           %7 = OpTypeFunction %void %int %int %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_2 = OpConstant %int 2
-         %19 = OpTypeFunction %void
+         %32 = OpTypeFunction %void
       %int_3 = OpConstant %int 3
       %int_4 = OpConstant %int 4
       %int_5 = OpConstant %int 5
@@ -31,22 +32,34 @@
           %z = OpFunctionParameter %int
           %8 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
-          %9 = OpIAdd %int %int_1 %x
-         %11 = OpIAdd %int %9 %y
-         %12 = OpIAdd %int %11 %z
-               OpStore %a %12
-         %15 = OpLoad %int %a None
-         %16 = OpIAdd %int %15 %int_2
-               OpStore %a %16 None
+         %10 = OpBitcast %uint %int_1
+         %12 = OpBitcast %uint %x
+         %13 = OpIAdd %uint %10 %12
+         %14 = OpBitcast %int %13
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %y
+         %17 = OpIAdd %uint %15 %16
+         %18 = OpBitcast %int %17
+         %19 = OpBitcast %uint %18
+         %20 = OpBitcast %uint %z
+         %21 = OpIAdd %uint %19 %20
+         %22 = OpBitcast %int %21
+               OpStore %a %22
+         %25 = OpLoad %int %a None
+         %26 = OpBitcast %uint %25
+         %27 = OpBitcast %uint %int_2
+         %29 = OpIAdd %uint %26 %27
+         %30 = OpBitcast %int %29
+               OpStore %a %30 None
                OpReturn
                OpFunctionEnd
-          %b = OpFunction %void None %19
-         %20 = OpLabel
-         %21 = OpFunctionCall %void %c %int_1 %int_2 %int_3
-         %23 = OpFunctionCall %void %c %int_4 %int_5 %int_6
+          %b = OpFunction %void None %32
+         %33 = OpLabel
+         %34 = OpFunctionCall %void %c %int_1 %int_2 %int_3
+         %36 = OpFunctionCall %void %c %int_4 %int_5 %int_6
                OpReturn
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %19
-         %28 = OpLabel
+%unused_entry_point = OpFunction %void None %32
+         %41 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/user_call/multi_param_return.wgsl.expected.glsl b/test/tint/expressions/user_call/multi_param_return.wgsl.expected.glsl
index 3fd11b0..cc0ab06 100644
--- a/test/tint/expressions/user_call/multi_param_return.wgsl.expected.glsl
+++ b/test/tint/expressions/user_call/multi_param_return.wgsl.expected.glsl
@@ -1,14 +1,19 @@
 #version 310 es
 
 int c(int x, int y, int z) {
-  int a = (((1 + x) + y) + z);
-  a = (a + 2);
+  uint v = uint(1);
+  uint v_1 = uint(int((v + uint(x))));
+  uint v_2 = uint(int((v_1 + uint(y))));
+  int a = int((v_2 + uint(z)));
+  uint v_3 = uint(a);
+  a = int((v_3 + uint(2)));
   return a;
 }
 void b() {
   int b_1 = c(2, 3, 4);
-  int v = c(3, 4, 5);
-  b_1 = (b_1 + v);
+  int v_4 = c(3, 4, 5);
+  uint v_5 = uint(b_1);
+  b_1 = int((v_5 + uint(v_4)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/user_call/multi_param_return.wgsl.expected.spvasm b/test/tint/expressions/user_call/multi_param_return.wgsl.expected.spvasm
index 3fb41db..926fec5 100644
--- a/test/tint/expressions/user_call/multi_param_return.wgsl.expected.spvasm
+++ b/test/tint/expressions/user_call/multi_param_return.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 32
+; Bound: 48
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,11 +17,12 @@
                OpName %unused_entry_point "unused_entry_point"
         %int = OpTypeInt 32 1
           %6 = OpTypeFunction %int %int %int %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %20 = OpTypeFunction %void
+         %33 = OpTypeFunction %void
       %int_3 = OpConstant %int 3
       %int_4 = OpConstant %int 4
       %int_5 = OpConstant %int 5
@@ -31,28 +32,43 @@
           %z = OpFunctionParameter %int
           %7 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
-          %8 = OpIAdd %int %int_1 %x
-         %10 = OpIAdd %int %8 %y
-         %11 = OpIAdd %int %10 %z
-               OpStore %a %11
-         %14 = OpLoad %int %a None
-         %15 = OpIAdd %int %14 %int_2
-               OpStore %a %15 None
-         %17 = OpLoad %int %a None
-               OpReturnValue %17
+          %9 = OpBitcast %uint %int_1
+         %11 = OpBitcast %uint %x
+         %12 = OpIAdd %uint %9 %11
+         %13 = OpBitcast %int %12
+         %14 = OpBitcast %uint %13
+         %15 = OpBitcast %uint %y
+         %16 = OpIAdd %uint %14 %15
+         %17 = OpBitcast %int %16
+         %18 = OpBitcast %uint %17
+         %19 = OpBitcast %uint %z
+         %20 = OpIAdd %uint %18 %19
+         %21 = OpBitcast %int %20
+               OpStore %a %21
+         %24 = OpLoad %int %a None
+         %25 = OpBitcast %uint %24
+         %26 = OpBitcast %uint %int_2
+         %28 = OpIAdd %uint %25 %26
+         %29 = OpBitcast %int %28
+               OpStore %a %29 None
+         %30 = OpLoad %int %a None
+               OpReturnValue %30
                OpFunctionEnd
-          %b = OpFunction %void None %20
-         %21 = OpLabel
+          %b = OpFunction %void None %33
+         %34 = OpLabel
         %b_0 = OpVariable %_ptr_Function_int Function
-         %22 = OpFunctionCall %int %c %int_2 %int_3 %int_4
-               OpStore %b_0 %22
-         %26 = OpFunctionCall %int %c %int_3 %int_4 %int_5
-         %28 = OpLoad %int %b_0 None
-         %29 = OpIAdd %int %28 %26
-               OpStore %b_0 %29 None
+         %35 = OpFunctionCall %int %c %int_2 %int_3 %int_4
+               OpStore %b_0 %35
+         %39 = OpFunctionCall %int %c %int_3 %int_4 %int_5
+         %41 = OpLoad %int %b_0 None
+         %42 = OpBitcast %uint %41
+         %43 = OpBitcast %uint %39
+         %44 = OpIAdd %uint %42 %43
+         %45 = OpBitcast %int %44
+               OpStore %b_0 %45 None
                OpReturn
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %20
-         %31 = OpLabel
+%unused_entry_point = OpFunction %void None %33
+         %47 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.glsl b/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.glsl
index 3a063cf..ca45d0a 100644
--- a/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.glsl
+++ b/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 void c() {
   int a = 1;
-  a = (a + 2);
+  uint v = uint(a);
+  a = int((v + uint(2)));
 }
 void b() {
   c();
diff --git a/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.spvasm b/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.spvasm
index e83e83a..fa7500e 100644
--- a/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.spvasm
+++ b/test/tint/expressions/user_call/no_params_no_return.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 22
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,23 +16,27 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
       %int_2 = OpConstant %int 2
           %c = OpFunction %void None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
                OpStore %a %int_1
           %9 = OpLoad %int %a None
-         %10 = OpIAdd %int %9 %int_2
-               OpStore %a %10 None
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_2
+         %14 = OpIAdd %uint %11 %12
+         %15 = OpBitcast %int %14
+               OpStore %a %15 None
                OpReturn
                OpFunctionEnd
           %b = OpFunction %void None %3
-         %13 = OpLabel
-         %14 = OpFunctionCall %void %c
-         %15 = OpFunctionCall %void %c
+         %17 = OpLabel
+         %18 = OpFunctionCall %void %c
+         %19 = OpFunctionCall %void %c
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %17 = OpLabel
+         %21 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/user_call/no_params_return.wgsl.expected.glsl b/test/tint/expressions/user_call/no_params_return.wgsl.expected.glsl
index f6c9676..5e5235a 100644
--- a/test/tint/expressions/user_call/no_params_return.wgsl.expected.glsl
+++ b/test/tint/expressions/user_call/no_params_return.wgsl.expected.glsl
@@ -2,13 +2,15 @@
 
 int c() {
   int a = 1;
-  a = (a + 2);
+  uint v = uint(a);
+  a = int((v + uint(2)));
   return a;
 }
 void b() {
   int b_1 = c();
-  int v = c();
-  b_1 = (b_1 + v);
+  int v_1 = c();
+  uint v_2 = uint(b_1);
+  b_1 = int((v_2 + uint(v_1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/user_call/no_params_return.wgsl.expected.spvasm b/test/tint/expressions/user_call/no_params_return.wgsl.expected.spvasm
index d2a2583..2139b85 100644
--- a/test/tint/expressions/user_call/no_params_return.wgsl.expected.spvasm
+++ b/test/tint/expressions/user_call/no_params_return.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 23
+; Bound: 30
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,31 +16,38 @@
           %3 = OpTypeFunction %int
 %_ptr_Function_int = OpTypePointer Function %int
       %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %14 = OpTypeFunction %void
+         %18 = OpTypeFunction %void
           %c = OpFunction %int None %3
           %4 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
                OpStore %a %int_1
           %8 = OpLoad %int %a None
-          %9 = OpIAdd %int %8 %int_2
-               OpStore %a %9 None
-         %11 = OpLoad %int %a None
-               OpReturnValue %11
+         %10 = OpBitcast %uint %8
+         %11 = OpBitcast %uint %int_2
+         %13 = OpIAdd %uint %10 %11
+         %14 = OpBitcast %int %13
+               OpStore %a %14 None
+         %15 = OpLoad %int %a None
+               OpReturnValue %15
                OpFunctionEnd
-          %b = OpFunction %void None %14
-         %15 = OpLabel
+          %b = OpFunction %void None %18
+         %19 = OpLabel
         %b_0 = OpVariable %_ptr_Function_int Function
-         %16 = OpFunctionCall %int %c
-               OpStore %b_0 %16
-         %18 = OpFunctionCall %int %c
-         %19 = OpLoad %int %b_0 None
-         %20 = OpIAdd %int %19 %18
-               OpStore %b_0 %20 None
+         %20 = OpFunctionCall %int %c
+               OpStore %b_0 %20
+         %22 = OpFunctionCall %int %c
+         %23 = OpLoad %int %b_0 None
+         %24 = OpBitcast %uint %23
+         %25 = OpBitcast %uint %22
+         %26 = OpIAdd %uint %24 %25
+         %27 = OpBitcast %int %26
+               OpStore %b_0 %27 None
                OpReturn
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %14
-         %22 = OpLabel
+%unused_entry_point = OpFunction %void None %18
+         %29 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.glsl b/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.glsl
index a8618b6..e4538b1 100644
--- a/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.glsl
+++ b/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.glsl
@@ -1,8 +1,10 @@
 #version 310 es
 
 void c(int z) {
-  int a = (1 + z);
-  a = (a + 2);
+  uint v = uint(1);
+  int a = int((v + uint(z)));
+  uint v_1 = uint(a);
+  a = int((v_1 + uint(2)));
 }
 void b() {
   c(2);
diff --git a/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.spvasm b/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.spvasm
index 0d8c53a..fdf9ead 100644
--- a/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.spvasm
+++ b/test/tint/expressions/user_call/one_param_no_return.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 22
+; Bound: 29
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,29 +15,36 @@
        %void = OpTypeVoid
         %int = OpTypeInt 32 1
           %5 = OpTypeFunction %void %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_2 = OpConstant %int 2
-         %15 = OpTypeFunction %void
+         %22 = OpTypeFunction %void
       %int_3 = OpConstant %int 3
           %c = OpFunction %void None %5
           %z = OpFunctionParameter %int
           %6 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
-          %7 = OpIAdd %int %int_1 %z
-               OpStore %a %7
-         %11 = OpLoad %int %a None
-         %12 = OpIAdd %int %11 %int_2
-               OpStore %a %12 None
+          %8 = OpBitcast %uint %int_1
+         %10 = OpBitcast %uint %z
+         %11 = OpIAdd %uint %8 %10
+         %12 = OpBitcast %int %11
+               OpStore %a %12
+         %15 = OpLoad %int %a None
+         %16 = OpBitcast %uint %15
+         %17 = OpBitcast %uint %int_2
+         %19 = OpIAdd %uint %16 %17
+         %20 = OpBitcast %int %19
+               OpStore %a %20 None
                OpReturn
                OpFunctionEnd
-          %b = OpFunction %void None %15
-         %16 = OpLabel
-         %17 = OpFunctionCall %void %c %int_2
-         %18 = OpFunctionCall %void %c %int_3
+          %b = OpFunction %void None %22
+         %23 = OpLabel
+         %24 = OpFunctionCall %void %c %int_2
+         %25 = OpFunctionCall %void %c %int_3
                OpReturn
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %15
-         %21 = OpLabel
+%unused_entry_point = OpFunction %void None %22
+         %28 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/user_call/one_param_return.wgsl.expected.glsl b/test/tint/expressions/user_call/one_param_return.wgsl.expected.glsl
index 98d339a..b423ed3 100644
--- a/test/tint/expressions/user_call/one_param_return.wgsl.expected.glsl
+++ b/test/tint/expressions/user_call/one_param_return.wgsl.expected.glsl
@@ -1,14 +1,17 @@
 #version 310 es
 
 int c(int z) {
-  int a = (1 + z);
-  a = (a + 2);
+  uint v = uint(1);
+  int a = int((v + uint(z)));
+  uint v_1 = uint(a);
+  a = int((v_1 + uint(2)));
   return a;
 }
 void b() {
   int b_1 = c(2);
-  int v = c(3);
-  b_1 = (b_1 + v);
+  int v_2 = c(3);
+  uint v_3 = uint(b_1);
+  b_1 = int((v_3 + uint(v_2)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/expressions/user_call/one_param_return.wgsl.expected.spvasm b/test/tint/expressions/user_call/one_param_return.wgsl.expected.spvasm
index 82f2227..3b4a9df 100644
--- a/test/tint/expressions/user_call/one_param_return.wgsl.expected.spvasm
+++ b/test/tint/expressions/user_call/one_param_return.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 36
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,36 +15,46 @@
                OpName %unused_entry_point "unused_entry_point"
         %int = OpTypeInt 32 1
           %4 = OpTypeFunction %int %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %23 = OpTypeFunction %void
       %int_3 = OpConstant %int 3
           %c = OpFunction %int None %4
           %z = OpFunctionParameter %int
           %5 = OpLabel
           %a = OpVariable %_ptr_Function_int Function
-          %6 = OpIAdd %int %int_1 %z
-               OpStore %a %6
-         %10 = OpLoad %int %a None
-         %11 = OpIAdd %int %10 %int_2
-               OpStore %a %11 None
-         %13 = OpLoad %int %a None
-               OpReturnValue %13
+          %7 = OpBitcast %uint %int_1
+          %9 = OpBitcast %uint %z
+         %10 = OpIAdd %uint %7 %9
+         %11 = OpBitcast %int %10
+               OpStore %a %11
+         %14 = OpLoad %int %a None
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_2
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %a %19 None
+         %20 = OpLoad %int %a None
+               OpReturnValue %20
                OpFunctionEnd
-          %b = OpFunction %void None %16
-         %17 = OpLabel
+          %b = OpFunction %void None %23
+         %24 = OpLabel
         %b_0 = OpVariable %_ptr_Function_int Function
-         %18 = OpFunctionCall %int %c %int_2
-               OpStore %b_0 %18
-         %20 = OpFunctionCall %int %c %int_3
-         %22 = OpLoad %int %b_0 None
-         %23 = OpIAdd %int %22 %20
-               OpStore %b_0 %23 None
+         %25 = OpFunctionCall %int %c %int_2
+               OpStore %b_0 %25
+         %27 = OpFunctionCall %int %c %int_3
+         %29 = OpLoad %int %b_0 None
+         %30 = OpBitcast %uint %29
+         %31 = OpBitcast %uint %27
+         %32 = OpIAdd %uint %30 %31
+         %33 = OpBitcast %int %32
+               OpStore %b_0 %33 None
                OpReturn
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %16
-         %25 = OpLabel
+%unused_entry_point = OpFunction %void None %23
+         %35 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/double/alias.wgsl.expected.glsl b/test/tint/identifiers/underscore/double/alias.wgsl.expected.glsl
index 67c38dc..5dd46a1 100644
--- a/test/tint/identifiers/underscore/double/alias.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/double/alias.wgsl.expected.glsl
@@ -8,5 +8,7 @@
 void main() {
   int c = 0;
   int d = 0;
-  v.inner = (c + d);
+  int v_1 = d;
+  uint v_2 = uint(c);
+  v.inner = int((v_2 + uint(v_1)));
 }
diff --git a/test/tint/identifiers/underscore/double/alias.wgsl.expected.spvasm b/test/tint/identifiers/underscore/double/alias.wgsl.expected.spvasm
index f5d464f..7730e3a 100644
--- a/test/tint/identifiers/underscore/double/alias.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/double/alias.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 20
+; Bound: 23
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -25,8 +25,8 @@
           %7 = OpTypeFunction %void
 %_ptr_Function_int = OpTypePointer Function %int
          %11 = OpConstantNull %int
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
@@ -34,8 +34,11 @@
           %d = OpVariable %_ptr_Function_int Function %11
          %13 = OpLoad %int %c None
          %14 = OpLoad %int %d None
-         %15 = OpIAdd %int %13 %14
-         %16 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %16 %15 None
+         %16 = OpBitcast %uint %13
+         %17 = OpBitcast %uint %14
+         %18 = OpIAdd %uint %16 %17
+         %19 = OpBitcast %int %18
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/double/let.wgsl.expected.glsl b/test/tint/identifiers/underscore/double/let.wgsl.expected.glsl
index eea1104..a1bbbfd 100644
--- a/test/tint/identifiers/underscore/double/let.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/double/let.wgsl.expected.glsl
@@ -10,5 +10,8 @@
   int v_1 = a;
   int b = a;
   int v_2 = v_1;
-  v.inner = (((a + v_1) + b) + v_2);
+  uint v_3 = uint(a);
+  uint v_4 = uint(int((v_3 + uint(v_1))));
+  uint v_5 = uint(int((v_4 + uint(b))));
+  v.inner = int((v_5 + uint(v_2)));
 }
diff --git a/test/tint/identifiers/underscore/double/let.wgsl.expected.spvasm b/test/tint/identifiers/underscore/double/let.wgsl.expected.spvasm
index 4899b7a..e693c67 100644
--- a/test/tint/identifiers/underscore/double/let.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/double/let.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 17
+; Bound: 26
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -26,15 +26,24 @@
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
           %a = OpConstant %int 1
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
-         %10 = OpIAdd %int %a %a
-         %11 = OpIAdd %int %10 %a
-         %12 = OpIAdd %int %11 %a
-         %13 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %13 %12 None
+         %11 = OpBitcast %uint %a
+         %12 = OpBitcast %uint %a
+         %13 = OpIAdd %uint %11 %12
+         %14 = OpBitcast %int %13
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %a
+         %17 = OpIAdd %uint %15 %16
+         %18 = OpBitcast %int %17
+         %19 = OpBitcast %uint %18
+         %20 = OpBitcast %uint %a
+         %21 = OpIAdd %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %23 %22 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/double/struct.wgsl.expected.glsl b/test/tint/identifiers/underscore/double/struct.wgsl.expected.glsl
index f3c5029..512feef 100644
--- a/test/tint/identifiers/underscore/double/struct.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/double/struct.wgsl.expected.glsl
@@ -13,5 +13,6 @@
 void main() {
   tint_struct c = tint_struct(0);
   int d = c.member_0;
-  v.inner = (c.member_0 + d);
+  uint v_1 = uint(c.member_0);
+  v.inner = int((v_1 + uint(d)));
 }
diff --git a/test/tint/identifiers/underscore/double/struct.wgsl.expected.spvasm b/test/tint/identifiers/underscore/double/struct.wgsl.expected.spvasm
index 088b54b..540444a 100644
--- a/test/tint/identifiers/underscore/double/struct.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/double/struct.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 21
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -27,15 +27,18 @@
           %7 = OpTypeFunction %void
         %a__ = OpTypeStruct %int
           %c = OpConstantNull %a__
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
           %d = OpCompositeExtract %int %c 0
          %12 = OpCompositeExtract %int %c 0
-         %13 = OpIAdd %int %12 %d
-         %14 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %14 %13 None
+         %14 = OpBitcast %uint %12
+         %15 = OpBitcast %uint %d
+         %16 = OpIAdd %uint %14 %15
+         %17 = OpBitcast %int %16
+         %18 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %18 %17 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/double/var.wgsl.expected.glsl b/test/tint/identifiers/underscore/double/var.wgsl.expected.glsl
index 56b0f56..02c8e11 100644
--- a/test/tint/identifiers/underscore/double/var.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/double/var.wgsl.expected.glsl
@@ -10,5 +10,7 @@
 void main() {
   int b = a;
   int v_2 = v_1;
-  v.inner = (b + v_2);
+  int v_3 = v_2;
+  uint v_4 = uint(b);
+  v.inner = int((v_4 + uint(v_3)));
 }
diff --git a/test/tint/identifiers/underscore/double/var.wgsl.expected.spvasm b/test/tint/identifiers/underscore/double/var.wgsl.expected.spvasm
index 8962887..75a1961 100644
--- a/test/tint/identifiers/underscore/double/var.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/double/var.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 29
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,8 +31,8 @@
        %void = OpTypeVoid
          %12 = OpTypeFunction %void
 %_ptr_Function_int = OpTypePointer Function %int
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %12
          %13 = OpLabel
@@ -44,8 +44,11 @@
                OpStore %b__ %17
          %19 = OpLoad %int %b None
          %20 = OpLoad %int %b__ None
-         %21 = OpIAdd %int %19 %20
-         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %22 %21 None
+         %22 = OpBitcast %uint %19
+         %23 = OpBitcast %uint %20
+         %24 = OpIAdd %uint %22 %23
+         %25 = OpBitcast %int %24
+         %26 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %26 %25 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.glsl
index 67c38dc..5dd46a1 100644
--- a/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.glsl
@@ -8,5 +8,7 @@
 void main() {
   int c = 0;
   int d = 0;
-  v.inner = (c + d);
+  int v_1 = d;
+  uint v_2 = uint(c);
+  v.inner = int((v_2 + uint(v_1)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.spvasm
index f5d464f..7730e3a 100644
--- a/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/lower/alias.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 20
+; Bound: 23
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -25,8 +25,8 @@
           %7 = OpTypeFunction %void
 %_ptr_Function_int = OpTypePointer Function %int
          %11 = OpConstantNull %int
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
@@ -34,8 +34,11 @@
           %d = OpVariable %_ptr_Function_int Function %11
          %13 = OpLoad %int %c None
          %14 = OpLoad %int %d None
-         %15 = OpIAdd %int %13 %14
-         %16 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %16 %15 None
+         %16 = OpBitcast %uint %13
+         %17 = OpBitcast %uint %14
+         %18 = OpIAdd %uint %16 %17
+         %19 = OpBitcast %int %18
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.glsl
index 3cbfec9..12d0f64 100644
--- a/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.glsl
@@ -10,5 +10,8 @@
   int _a = a;
   int b = a;
   int _b = _a;
-  v.inner = (((a + _a) + b) + _b);
+  uint v_1 = uint(a);
+  uint v_2 = uint(int((v_1 + uint(_a))));
+  uint v_3 = uint(int((v_2 + uint(b))));
+  v.inner = int((v_3 + uint(_b)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.spvasm
index 57b60e3..11f2739 100644
--- a/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/lower/let.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 17
+; Bound: 26
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -26,15 +26,24 @@
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
           %a = OpConstant %int 1
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
-         %10 = OpIAdd %int %a %a
-         %11 = OpIAdd %int %10 %a
-         %12 = OpIAdd %int %11 %a
-         %13 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %13 %12 None
+         %11 = OpBitcast %uint %a
+         %12 = OpBitcast %uint %a
+         %13 = OpIAdd %uint %11 %12
+         %14 = OpBitcast %int %13
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %a
+         %17 = OpIAdd %uint %15 %16
+         %18 = OpBitcast %int %17
+         %19 = OpBitcast %uint %18
+         %20 = OpBitcast %uint %a
+         %21 = OpIAdd %uint %19 %20
+         %22 = OpBitcast %int %21
+         %23 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %23 %22 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.glsl
index f6624e5..82f2211 100644
--- a/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.glsl
@@ -13,5 +13,6 @@
 void main() {
   _a c = _a(0);
   int d = c._b;
-  v.inner = (c._b + d);
+  uint v_1 = uint(c._b);
+  v.inner = int((v_1 + uint(d)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.spvasm
index eaf63b5..f441f70 100644
--- a/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/lower/struct.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 21
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -27,15 +27,18 @@
           %7 = OpTypeFunction %void
          %_a = OpTypeStruct %int
           %c = OpConstantNull %_a
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
           %d = OpCompositeExtract %int %c 0
          %12 = OpCompositeExtract %int %c 0
-         %13 = OpIAdd %int %12 %d
-         %14 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %14 %13 None
+         %14 = OpBitcast %uint %12
+         %15 = OpBitcast %uint %d
+         %16 = OpIAdd %uint %14 %15
+         %17 = OpBitcast %int %16
+         %18 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %18 %17 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.glsl
index e4a7eaf..14189c5 100644
--- a/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.glsl
@@ -10,5 +10,7 @@
 void main() {
   int b = a;
   int _b = _a;
-  v.inner = (b + _b);
+  int v_1 = _b;
+  uint v_2 = uint(b);
+  v.inner = int((v_2 + uint(v_1)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.spvasm
index 493a14b..68ee95d 100644
--- a/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 29
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,8 +31,8 @@
        %void = OpTypeVoid
          %12 = OpTypeFunction %void
 %_ptr_Function_int = OpTypePointer Function %int
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %12
          %13 = OpLabel
@@ -44,8 +44,11 @@
                OpStore %_b %17
          %19 = OpLoad %int %b None
          %20 = OpLoad %int %_b None
-         %21 = OpIAdd %int %19 %20
-         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %22 %21 None
+         %22 = OpBitcast %uint %19
+         %23 = OpBitcast %uint %20
+         %24 = OpIAdd %uint %22 %23
+         %25 = OpBitcast %int %24
+         %26 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %26 %25 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.glsl
index 67c38dc..5dd46a1 100644
--- a/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.glsl
@@ -8,5 +8,7 @@
 void main() {
   int c = 0;
   int d = 0;
-  v.inner = (c + d);
+  int v_1 = d;
+  uint v_2 = uint(c);
+  v.inner = int((v_2 + uint(v_1)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.spvasm
index f5d464f..7730e3a 100644
--- a/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/upper/alias.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 20
+; Bound: 23
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -25,8 +25,8 @@
           %7 = OpTypeFunction %void
 %_ptr_Function_int = OpTypePointer Function %int
          %11 = OpConstantNull %int
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
@@ -34,8 +34,11 @@
           %d = OpVariable %_ptr_Function_int Function %11
          %13 = OpLoad %int %c None
          %14 = OpLoad %int %d None
-         %15 = OpIAdd %int %13 %14
-         %16 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %16 %15 None
+         %16 = OpBitcast %uint %13
+         %17 = OpBitcast %uint %14
+         %18 = OpIAdd %uint %16 %17
+         %19 = OpBitcast %int %18
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.glsl
index a643f8a..6f53d70 100644
--- a/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.glsl
@@ -10,5 +10,8 @@
   int _A = 2;
   int B = A;
   int _B = _A;
-  v.inner = (((A + _A) + B) + _B);
+  uint v_1 = uint(A);
+  uint v_2 = uint(int((v_1 + uint(_A))));
+  uint v_3 = uint(int((v_2 + uint(B))));
+  v.inner = int((v_3 + uint(_B)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.spvasm
index f8e3ef1..8171bcd 100644
--- a/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/upper/let.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 27
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -27,15 +27,24 @@
           %7 = OpTypeFunction %void
           %A = OpConstant %int 1
          %_A = OpConstant %int 2
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
-         %11 = OpIAdd %int %A %_A
-         %12 = OpIAdd %int %11 %A
-         %13 = OpIAdd %int %12 %_A
-         %14 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %14 %13 None
+         %12 = OpBitcast %uint %A
+         %13 = OpBitcast %uint %_A
+         %14 = OpIAdd %uint %12 %13
+         %15 = OpBitcast %int %14
+         %16 = OpBitcast %uint %15
+         %17 = OpBitcast %uint %A
+         %18 = OpIAdd %uint %16 %17
+         %19 = OpBitcast %int %18
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %_A
+         %22 = OpIAdd %uint %20 %21
+         %23 = OpBitcast %int %22
+         %24 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %24 %23 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.glsl
index 013ea7c..272c6e6 100644
--- a/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.glsl
@@ -13,5 +13,6 @@
 void main() {
   _A c = _A(0);
   int d = c._B;
-  v.inner = (c._B + d);
+  uint v_1 = uint(c._B);
+  v.inner = int((v_1 + uint(d)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.spvasm
index e3776b6..4b31726 100644
--- a/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/upper/struct.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 21
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -27,15 +27,18 @@
           %7 = OpTypeFunction %void
          %_A = OpTypeStruct %int
           %c = OpConstantNull %_A
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %7
           %8 = OpLabel
           %d = OpCompositeExtract %int %c 0
          %12 = OpCompositeExtract %int %c 0
-         %13 = OpIAdd %int %12 %d
-         %14 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %14 %13 None
+         %14 = OpBitcast %uint %12
+         %15 = OpBitcast %uint %d
+         %16 = OpIAdd %uint %14 %15
+         %17 = OpBitcast %int %16
+         %18 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %18 %17 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.glsl b/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.glsl
index 6f062ec..1d33b1f 100644
--- a/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.glsl
+++ b/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.glsl
@@ -10,5 +10,7 @@
 void main() {
   int B = A;
   int _B = _A;
-  v.inner = (B + _B);
+  int v_1 = _B;
+  uint v_2 = uint(B);
+  v.inner = int((v_2 + uint(v_1)));
 }
diff --git a/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.spvasm b/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.spvasm
index 82f92b0..2e10df8 100644
--- a/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.spvasm
+++ b/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 29
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,8 +31,8 @@
        %void = OpTypeVoid
          %12 = OpTypeFunction %void
 %_ptr_Function_int = OpTypePointer Function %int
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
        %uint = OpTypeInt 32 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
      %uint_0 = OpConstant %uint 0
           %f = OpFunction %void None %12
          %13 = OpLabel
@@ -44,8 +44,11 @@
                OpStore %_B %17
          %19 = OpLoad %int %B None
          %20 = OpLoad %int %_B None
-         %21 = OpIAdd %int %19 %20
-         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
-               OpStore %22 %21 None
+         %22 = OpBitcast %uint %19
+         %23 = OpBitcast %uint %20
+         %24 = OpIAdd %uint %22 %23
+         %25 = OpBitcast %int %24
+         %26 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %26 %25 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/continue_in_switch.wgsl.expected.glsl b/test/tint/loops/continue_in_switch.wgsl.expected.glsl
index 27f7439..4a8900d 100644
--- a/test/tint/loops/continue_in_switch.wgsl.expected.glsl
+++ b/test/tint/loops/continue_in_switch.wgsl.expected.glsl
@@ -23,12 +23,14 @@
       }
       if (tint_continue) {
         {
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
         }
         continue;
       }
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/continue_in_switch.wgsl.expected.spvasm b/test/tint/loops/continue_in_switch.wgsl.expected.spvasm
index c129631..a125480 100644
--- a/test/tint/loops/continue_in_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/continue_in_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 27
+; Bound: 31
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,6 +16,7 @@
       %int_0 = OpConstant %int 0
       %int_4 = OpConstant %int 4
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
           %f = OpFunction %void None %3
           %4 = OpLabel
@@ -46,8 +47,11 @@
                OpBranch %7
           %7 = OpLabel
          %24 = OpLoad %int %i None
-         %25 = OpIAdd %int %24 %int_1
-               OpStore %i %25 None
+         %26 = OpBitcast %uint %24
+         %27 = OpBitcast %uint %int_1
+         %29 = OpIAdd %uint %26 %27
+         %30 = OpBitcast %int %29
+               OpStore %i %30 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/continue_in_switch_robustness.wgsl.expected.glsl b/test/tint/loops/continue_in_switch_robustness.wgsl.expected.glsl
index 27f7439..4a8900d 100644
--- a/test/tint/loops/continue_in_switch_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/continue_in_switch_robustness.wgsl.expected.glsl
@@ -23,12 +23,14 @@
       }
       if (tint_continue) {
         {
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
         }
         continue;
       }
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/continue_in_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/continue_in_switch_robustness.wgsl.expected.spvasm
index c129631..a125480 100644
--- a/test/tint/loops/continue_in_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/continue_in_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 27
+; Bound: 31
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,6 +16,7 @@
       %int_0 = OpConstant %int 0
       %int_4 = OpConstant %int 4
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
           %f = OpFunction %void None %3
           %4 = OpLabel
@@ -46,8 +47,11 @@
                OpBranch %7
           %7 = OpLabel
          %24 = OpLoad %int %i None
-         %25 = OpIAdd %int %24 %int_1
-               OpStore %i %25 None
+         %26 = OpBitcast %uint %24
+         %27 = OpBitcast %uint %int_1
+         %29 = OpIAdd %uint %26 %27
+         %30 = OpBitcast %int %29
+               OpStore %i %30 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.glsl b/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.glsl
index f2b05e9..8cf0ccd 100644
--- a/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.glsl
+++ b/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.glsl
@@ -27,7 +27,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
           if ((i >= 4)) { break; }
         }
         continue;
@@ -37,7 +38,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
         if ((i >= 4)) { break; }
       }
       continue;
diff --git a/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm b/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm
index 4d678b1a..885403f 100644
--- a/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm
+++ b/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 51
+; Bound: 54
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -74,11 +74,14 @@
          %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %44 %43 None
          %45 = OpLoad %int %i None
-         %46 = OpIAdd %int %45 %int_1
-               OpStore %i %46 None
-         %48 = OpLoad %int %i None
-         %49 = OpSGreaterThanEqual %bool %48 %int_4
-               OpBranchConditional %49 %13 %12
+         %46 = OpBitcast %uint %45
+         %47 = OpBitcast %uint %int_1
+         %49 = OpIAdd %uint %46 %47
+         %50 = OpBitcast %int %49
+               OpStore %i %50 None
+         %51 = OpLoad %int %i None
+         %52 = OpSGreaterThanEqual %bool %51 %int_4
+               OpBranchConditional %52 %13 %12
          %13 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.glsl b/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.glsl
index f2b05e9..8cf0ccd 100644
--- a/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.glsl
@@ -27,7 +27,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
           if ((i >= 4)) { break; }
         }
         continue;
@@ -37,7 +38,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
         if ((i >= 4)) { break; }
       }
       continue;
diff --git a/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm b/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm
index 4d678b1a..885403f 100644
--- a/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 51
+; Bound: 54
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -74,11 +74,14 @@
          %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %44 %43 None
          %45 = OpLoad %int %i None
-         %46 = OpIAdd %int %45 %int_1
-               OpStore %i %46 None
-         %48 = OpLoad %int %i None
-         %49 = OpSGreaterThanEqual %bool %48 %int_4
-               OpBranchConditional %49 %13 %12
+         %46 = OpBitcast %uint %45
+         %47 = OpBitcast %uint %int_1
+         %49 = OpIAdd %uint %46 %47
+         %50 = OpBitcast %int %49
+               OpStore %i %50 None
+         %51 = OpLoad %int %i None
+         %52 = OpSGreaterThanEqual %bool %51 %int_4
+               OpBranchConditional %52 %13 %12
          %13 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/loop.wgsl.expected.glsl b/test/tint/loops/loop.wgsl.expected.glsl
index 4e736ff..cdaf9db 100644
--- a/test/tint/loops/loop.wgsl.expected.glsl
+++ b/test/tint/loops/loop.wgsl.expected.glsl
@@ -8,7 +8,8 @@
       if (all(equal(tint_loop_idx, uvec2(0u)))) {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       if ((i > 4)) {
         return i;
       }
diff --git a/test/tint/loops/loop.wgsl.expected.spvasm b/test/tint/loops/loop.wgsl.expected.spvasm
index f14b31a..b6b0e5b 100644
--- a/test/tint/loops/loop.wgsl.expected.spvasm
+++ b/test/tint/loops/loop.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 63
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,7 +36,7 @@
      %uint_1 = OpConstant %uint 1
       %false = OpConstantFalse %bool
        %void = OpTypeVoid
-         %61 = OpTypeFunction %void
+         %64 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -61,45 +61,48 @@
                OpBranch %17
          %30 = OpLabel
          %32 = OpLoad %int %i None
-         %33 = OpIAdd %int %32 %int_1
-               OpStore %i %33 None
-         %35 = OpLoad %int %i None
-         %36 = OpSGreaterThan %bool %35 %int_4
-               OpSelectionMerge %38 None
-               OpBranchConditional %36 %39 %38
-         %39 = OpLabel
-         %57 = OpLoad %int %i None
-               OpStore %continue_execution %false None
-               OpStore %return_value %57 None
-               OpBranch %38
-         %38 = OpLabel
-         %40 = OpLoad %bool %continue_execution None
-         %41 = OpLogicalNot %bool %40
-               OpSelectionMerge %42 None
-               OpBranchConditional %41 %43 %42
-         %43 = OpLabel
-               OpBranch %17
+         %33 = OpBitcast %uint %32
+         %34 = OpBitcast %uint %int_1
+         %36 = OpIAdd %uint %33 %34
+         %37 = OpBitcast %int %36
+               OpStore %i %37 None
+         %38 = OpLoad %int %i None
+         %39 = OpSGreaterThan %bool %38 %int_4
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
          %42 = OpLabel
+         %60 = OpLoad %int %i None
+               OpStore %continue_execution %false None
+               OpStore %return_value %60 None
+               OpBranch %41
+         %41 = OpLabel
+         %43 = OpLoad %bool %continue_execution None
+         %44 = OpLogicalNot %bool %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpBranch %17
+         %45 = OpLabel
                OpBranch %15
          %15 = OpLabel
-         %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %47 = OpLoad %uint %44 None
-%tint_low_inc = OpISub %uint %47 %uint_1
-         %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %50 %tint_low_inc None
-         %51 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %51 %uint_1 %uint_0
-         %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %54 = OpLoad %uint %53 None
-         %55 = OpISub %uint %54 %tint_carry
+         %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %50 = OpLoad %uint %47 None
+%tint_low_inc = OpISub %uint %50 %uint_1
+         %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %53 %tint_low_inc None
+         %54 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %54 %uint_1 %uint_0
          %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %56 %55 None
+         %57 = OpLoad %uint %56 None
+         %58 = OpISub %uint %57 %tint_carry
+         %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %59 %58 None
                OpBranch %16
          %17 = OpLabel
          %18 = OpLoad %int %return_value None
                OpReturnValue %18
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %61
-         %62 = OpLabel
+%unused_entry_point = OpFunction %void None %64
+         %65 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/loop_robustness.wgsl.expected.glsl b/test/tint/loops/loop_robustness.wgsl.expected.glsl
index 4e736ff..cdaf9db 100644
--- a/test/tint/loops/loop_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/loop_robustness.wgsl.expected.glsl
@@ -8,7 +8,8 @@
       if (all(equal(tint_loop_idx, uvec2(0u)))) {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       if ((i > 4)) {
         return i;
       }
diff --git a/test/tint/loops/loop_robustness.wgsl.expected.spvasm b/test/tint/loops/loop_robustness.wgsl.expected.spvasm
index f14b31a..b6b0e5b 100644
--- a/test/tint/loops/loop_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 63
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,7 +36,7 @@
      %uint_1 = OpConstant %uint 1
       %false = OpConstantFalse %bool
        %void = OpTypeVoid
-         %61 = OpTypeFunction %void
+         %64 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -61,45 +61,48 @@
                OpBranch %17
          %30 = OpLabel
          %32 = OpLoad %int %i None
-         %33 = OpIAdd %int %32 %int_1
-               OpStore %i %33 None
-         %35 = OpLoad %int %i None
-         %36 = OpSGreaterThan %bool %35 %int_4
-               OpSelectionMerge %38 None
-               OpBranchConditional %36 %39 %38
-         %39 = OpLabel
-         %57 = OpLoad %int %i None
-               OpStore %continue_execution %false None
-               OpStore %return_value %57 None
-               OpBranch %38
-         %38 = OpLabel
-         %40 = OpLoad %bool %continue_execution None
-         %41 = OpLogicalNot %bool %40
-               OpSelectionMerge %42 None
-               OpBranchConditional %41 %43 %42
-         %43 = OpLabel
-               OpBranch %17
+         %33 = OpBitcast %uint %32
+         %34 = OpBitcast %uint %int_1
+         %36 = OpIAdd %uint %33 %34
+         %37 = OpBitcast %int %36
+               OpStore %i %37 None
+         %38 = OpLoad %int %i None
+         %39 = OpSGreaterThan %bool %38 %int_4
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
          %42 = OpLabel
+         %60 = OpLoad %int %i None
+               OpStore %continue_execution %false None
+               OpStore %return_value %60 None
+               OpBranch %41
+         %41 = OpLabel
+         %43 = OpLoad %bool %continue_execution None
+         %44 = OpLogicalNot %bool %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpBranch %17
+         %45 = OpLabel
                OpBranch %15
          %15 = OpLabel
-         %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %47 = OpLoad %uint %44 None
-%tint_low_inc = OpISub %uint %47 %uint_1
-         %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %50 %tint_low_inc None
-         %51 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %51 %uint_1 %uint_0
-         %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %54 = OpLoad %uint %53 None
-         %55 = OpISub %uint %54 %tint_carry
+         %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %50 = OpLoad %uint %47 None
+%tint_low_inc = OpISub %uint %50 %uint_1
+         %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %53 %tint_low_inc None
+         %54 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %54 %uint_1 %uint_0
          %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %56 %55 None
+         %57 = OpLoad %uint %56 None
+         %58 = OpISub %uint %57 %tint_carry
+         %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %59 %58 None
                OpBranch %16
          %17 = OpLabel
          %18 = OpLoad %int %return_value None
                OpReturnValue %18
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %61
-         %62 = OpLabel
+%unused_entry_point = OpFunction %void None %64
+         %65 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/loop_with_break_if.wgsl.expected.glsl b/test/tint/loops/loop_with_break_if.wgsl.expected.glsl
index 1600fa7..e6c0927 100644
--- a/test/tint/loops/loop_with_break_if.wgsl.expected.glsl
+++ b/test/tint/loops/loop_with_break_if.wgsl.expected.glsl
@@ -16,7 +16,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
         if ((i == 4)) { break; }
       }
       continue;
diff --git a/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm b/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm
index 9003ecf..c7fb7b6 100644
--- a/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 69
+; Bound: 72
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,7 +36,7 @@
       %int_1 = OpConstant %int 1
       %false = OpConstantFalse %bool
        %void = OpTypeVoid
-         %67 = OpTypeFunction %void
+         %70 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -65,9 +65,9 @@
                OpSelectionMerge %38 None
                OpBranchConditional %36 %39 %38
          %39 = OpLabel
-         %63 = OpLoad %int %i None
+         %66 = OpLoad %int %i None
                OpStore %continue_execution %false None
-               OpStore %return_value %63 None
+               OpStore %return_value %66 None
                OpBranch %38
          %38 = OpLabel
          %40 = OpLoad %bool %continue_execution None
@@ -92,24 +92,27 @@
          %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %56 %55 None
          %57 = OpLoad %int %i None
-         %58 = OpIAdd %int %57 %int_1
-               OpStore %i %58 None
-         %60 = OpLoad %int %i None
-         %61 = OpIEqual %bool %60 %int_4
-               OpBranchConditional %61 %17 %16
+         %58 = OpBitcast %uint %57
+         %59 = OpBitcast %uint %int_1
+         %61 = OpIAdd %uint %58 %59
+         %62 = OpBitcast %int %61
+               OpStore %i %62 None
+         %63 = OpLoad %int %i None
+         %64 = OpIEqual %bool %63 %int_4
+               OpBranchConditional %64 %17 %16
          %17 = OpLabel
          %18 = OpLoad %bool %continue_execution None
                OpSelectionMerge %19 None
                OpBranchConditional %18 %20 %19
          %20 = OpLabel
-         %62 = OpLoad %int %i None
-               OpStore %return_value %62 None
+         %65 = OpLoad %int %i None
+               OpStore %return_value %65 None
                OpBranch %19
          %19 = OpLabel
          %21 = OpLoad %int %return_value None
                OpReturnValue %21
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %67
-         %68 = OpLabel
+%unused_entry_point = OpFunction %void None %70
+         %71 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.glsl b/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.glsl
index 1600fa7..e6c0927 100644
--- a/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.glsl
@@ -16,7 +16,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
         if ((i == 4)) { break; }
       }
       continue;
diff --git a/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm b/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm
index 9003ecf..c7fb7b6 100644
--- a/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 69
+; Bound: 72
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,7 +36,7 @@
       %int_1 = OpConstant %int 1
       %false = OpConstantFalse %bool
        %void = OpTypeVoid
-         %67 = OpTypeFunction %void
+         %70 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -65,9 +65,9 @@
                OpSelectionMerge %38 None
                OpBranchConditional %36 %39 %38
          %39 = OpLabel
-         %63 = OpLoad %int %i None
+         %66 = OpLoad %int %i None
                OpStore %continue_execution %false None
-               OpStore %return_value %63 None
+               OpStore %return_value %66 None
                OpBranch %38
          %38 = OpLabel
          %40 = OpLoad %bool %continue_execution None
@@ -92,24 +92,27 @@
          %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %56 %55 None
          %57 = OpLoad %int %i None
-         %58 = OpIAdd %int %57 %int_1
-               OpStore %i %58 None
-         %60 = OpLoad %int %i None
-         %61 = OpIEqual %bool %60 %int_4
-               OpBranchConditional %61 %17 %16
+         %58 = OpBitcast %uint %57
+         %59 = OpBitcast %uint %int_1
+         %61 = OpIAdd %uint %58 %59
+         %62 = OpBitcast %int %61
+               OpStore %i %62 None
+         %63 = OpLoad %int %i None
+         %64 = OpIEqual %bool %63 %int_4
+               OpBranchConditional %64 %17 %16
          %17 = OpLabel
          %18 = OpLoad %bool %continue_execution None
                OpSelectionMerge %19 None
                OpBranchConditional %18 %20 %19
          %20 = OpLabel
-         %62 = OpLoad %int %i None
-               OpStore %return_value %62 None
+         %65 = OpLoad %int %i None
+               OpStore %return_value %65 None
                OpBranch %19
          %19 = OpLabel
          %21 = OpLoad %int %return_value None
                OpReturnValue %21
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %67
-         %68 = OpLabel
+%unused_entry_point = OpFunction %void None %70
+         %71 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/loop_with_continuing.wgsl.expected.glsl b/test/tint/loops/loop_with_continuing.wgsl.expected.glsl
index 85f0c3f..32571a3 100644
--- a/test/tint/loops/loop_with_continuing.wgsl.expected.glsl
+++ b/test/tint/loops/loop_with_continuing.wgsl.expected.glsl
@@ -16,7 +16,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm b/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm
index fe402e7..e050952 100644
--- a/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 63
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,7 +36,7 @@
       %int_1 = OpConstant %int 1
       %false = OpConstantFalse %bool
        %void = OpTypeVoid
-         %61 = OpTypeFunction %void
+         %64 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -65,9 +65,9 @@
                OpSelectionMerge %35 None
                OpBranchConditional %33 %36 %35
          %36 = OpLabel
-         %57 = OpLoad %int %i None
+         %60 = OpLoad %int %i None
                OpStore %continue_execution %false None
-               OpStore %return_value %57 None
+               OpStore %return_value %60 None
                OpBranch %35
          %35 = OpLabel
          %37 = OpLoad %bool %continue_execution None
@@ -92,14 +92,17 @@
          %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %53 %52 None
          %54 = OpLoad %int %i None
-         %55 = OpIAdd %int %54 %int_1
-               OpStore %i %55 None
+         %55 = OpBitcast %uint %54
+         %56 = OpBitcast %uint %int_1
+         %58 = OpIAdd %uint %55 %56
+         %59 = OpBitcast %int %58
+               OpStore %i %59 None
                OpBranch %16
          %17 = OpLabel
          %18 = OpLoad %int %return_value None
                OpReturnValue %18
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %61
-         %62 = OpLabel
+%unused_entry_point = OpFunction %void None %64
+         %65 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.glsl b/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.glsl
index 85f0c3f..32571a3 100644
--- a/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.glsl
@@ -16,7 +16,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm b/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm
index fe402e7..e050952 100644
--- a/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 63
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,7 +36,7 @@
       %int_1 = OpConstant %int 1
       %false = OpConstantFalse %bool
        %void = OpTypeVoid
-         %61 = OpTypeFunction %void
+         %64 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -65,9 +65,9 @@
                OpSelectionMerge %35 None
                OpBranchConditional %33 %36 %35
          %36 = OpLabel
-         %57 = OpLoad %int %i None
+         %60 = OpLoad %int %i None
                OpStore %continue_execution %false None
-               OpStore %return_value %57 None
+               OpStore %return_value %60 None
                OpBranch %35
          %35 = OpLabel
          %37 = OpLoad %bool %continue_execution None
@@ -92,14 +92,17 @@
          %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %53 %52 None
          %54 = OpLoad %int %i None
-         %55 = OpIAdd %int %54 %int_1
-               OpStore %i %55 None
+         %55 = OpBitcast %uint %54
+         %56 = OpBitcast %uint %int_1
+         %58 = OpIAdd %uint %55 %56
+         %59 = OpBitcast %int %58
+               OpStore %i %59 None
                OpBranch %16
          %17 = OpLabel
          %18 = OpLoad %int %return_value None
                OpReturnValue %18
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %61
-         %62 = OpLabel
+%unused_entry_point = OpFunction %void None %64
+         %65 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/multiple_continues.wgsl.expected.glsl b/test/tint/loops/multiple_continues.wgsl.expected.glsl
index 993c63b..f235e7c 100644
--- a/test/tint/loops/multiple_continues.wgsl.expected.glsl
+++ b/test/tint/loops/multiple_continues.wgsl.expected.glsl
@@ -33,12 +33,14 @@
       }
       if (tint_continue) {
         {
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
         }
         continue;
       }
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/multiple_continues.wgsl.expected.spvasm b/test/tint/loops/multiple_continues.wgsl.expected.spvasm
index 6a5bed9..fda8470 100644
--- a/test/tint/loops/multiple_continues.wgsl.expected.spvasm
+++ b/test/tint/loops/multiple_continues.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 29
+; Bound: 33
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,6 +16,7 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
@@ -50,8 +51,11 @@
                OpBranch %7
           %7 = OpLabel
          %26 = OpLoad %int %i None
-         %27 = OpIAdd %int %26 %int_1
-               OpStore %i %27 None
+         %28 = OpBitcast %uint %26
+         %29 = OpBitcast %uint %int_1
+         %31 = OpIAdd %uint %28 %29
+         %32 = OpBitcast %int %31
+               OpStore %i %32 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/multiple_continues_robustness.wgsl.expected.glsl b/test/tint/loops/multiple_continues_robustness.wgsl.expected.glsl
index 993c63b..f235e7c 100644
--- a/test/tint/loops/multiple_continues_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/multiple_continues_robustness.wgsl.expected.glsl
@@ -33,12 +33,14 @@
       }
       if (tint_continue) {
         {
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
         }
         continue;
       }
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/multiple_continues_robustness.wgsl.expected.spvasm b/test/tint/loops/multiple_continues_robustness.wgsl.expected.spvasm
index 6a5bed9..fda8470 100644
--- a/test/tint/loops/multiple_continues_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/multiple_continues_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 29
+; Bound: 33
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,6 +16,7 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
@@ -50,8 +51,11 @@
                OpBranch %7
           %7 = OpLabel
          %26 = OpLoad %int %i None
-         %27 = OpIAdd %int %26 %int_1
-               OpStore %i %27 None
+         %28 = OpBitcast %uint %26
+         %29 = OpBitcast %uint %int_1
+         %31 = OpIAdd %uint %28 %29
+         %32 = OpBitcast %int %31
+               OpStore %i %32 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/multiple_switch.wgsl.expected.glsl b/test/tint/loops/multiple_switch.wgsl.expected.glsl
index b3ab152..44f4d73 100644
--- a/test/tint/loops/multiple_switch.wgsl.expected.glsl
+++ b/test/tint/loops/multiple_switch.wgsl.expected.glsl
@@ -24,7 +24,8 @@
       }
       if (tint_continue) {
         {
-          i_1 = (i_1 + 1);
+          uint v = uint(i_1);
+          i_1 = int((v + uint(1)));
         }
         continue;
       }
@@ -42,12 +43,14 @@
       }
       if (tint_continue_1) {
         {
-          i_1 = (i_1 + 1);
+          uint v = uint(i_1);
+          i_1 = int((v + uint(1)));
         }
         continue;
       }
       {
-        i_1 = (i_1 + 1);
+        uint v = uint(i_1);
+        i_1 = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/multiple_switch.wgsl.expected.spvasm b/test/tint/loops/multiple_switch.wgsl.expected.spvasm
index 688e102..e6b2b2a 100644
--- a/test/tint/loops/multiple_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/multiple_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 32
+; Bound: 36
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,6 +17,7 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
@@ -57,8 +58,11 @@
                OpBranch %11
          %11 = OpLabel
          %29 = OpLoad %int %i_0 None
-         %30 = OpIAdd %int %29 %int_1
-               OpStore %i_0 %30 None
+         %31 = OpBitcast %uint %29
+         %32 = OpBitcast %uint %int_1
+         %34 = OpIAdd %uint %31 %32
+         %35 = OpBitcast %int %34
+               OpStore %i_0 %35 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
diff --git a/test/tint/loops/multiple_switch_robustness.wgsl.expected.glsl b/test/tint/loops/multiple_switch_robustness.wgsl.expected.glsl
index b3ab152..44f4d73 100644
--- a/test/tint/loops/multiple_switch_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/multiple_switch_robustness.wgsl.expected.glsl
@@ -24,7 +24,8 @@
       }
       if (tint_continue) {
         {
-          i_1 = (i_1 + 1);
+          uint v = uint(i_1);
+          i_1 = int((v + uint(1)));
         }
         continue;
       }
@@ -42,12 +43,14 @@
       }
       if (tint_continue_1) {
         {
-          i_1 = (i_1 + 1);
+          uint v = uint(i_1);
+          i_1 = int((v + uint(1)));
         }
         continue;
       }
       {
-        i_1 = (i_1 + 1);
+        uint v = uint(i_1);
+        i_1 = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/multiple_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/multiple_switch_robustness.wgsl.expected.spvasm
index 688e102..e6b2b2a 100644
--- a/test/tint/loops/multiple_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/multiple_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 32
+; Bound: 36
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,6 +17,7 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
@@ -57,8 +58,11 @@
                OpBranch %11
          %11 = OpLabel
          %29 = OpLoad %int %i_0 None
-         %30 = OpIAdd %int %29 %int_1
-               OpStore %i_0 %30 None
+         %31 = OpBitcast %uint %29
+         %32 = OpBitcast %uint %int_1
+         %34 = OpIAdd %uint %31 %32
+         %35 = OpBitcast %int %34
+               OpStore %i_0 %35 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_loop_switch.wgsl.expected.glsl b/test/tint/loops/nested_loop_loop_switch.wgsl.expected.glsl
index 9d4e46f..66b44a9 100644
--- a/test/tint/loops/nested_loop_loop_switch.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_loop_switch.wgsl.expected.glsl
@@ -42,7 +42,8 @@
               tint_loop_idx_1.x = tint_low_inc_1;
               uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
               tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-              j = (j + 2);
+              uint v = uint(j);
+              j = int((v + uint(2)));
             }
             continue;
           }
@@ -51,7 +52,8 @@
             tint_loop_idx_1.x = tint_low_inc_1;
             uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
             tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-            j = (j + 2);
+            uint v = uint(j);
+            j = int((v + uint(2)));
           }
           continue;
         }
@@ -61,7 +63,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm
index e79293e..4c15133 100644
--- a/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 80
+; Bound: 86
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -72,46 +72,49 @@
                OpLoopMerge %37 %35 None
                OpBranch %34
          %34 = OpLabel
-         %55 = OpLoad %v2uint %tint_loop_idx_0 None
-         %56 = OpIEqual %v2bool %55 %22
-         %57 = OpAll %bool %56
-               OpSelectionMerge %58 None
-               OpBranchConditional %57 %59 %58
-         %59 = OpLabel
-               OpBranch %37
-         %58 = OpLabel
-         %60 = OpLoad %int %j None
-         %61 = OpSLessThan %bool %60 %int_2
-               OpSelectionMerge %62 None
-               OpBranchConditional %61 %62 %63
-         %63 = OpLabel
-               OpBranch %37
+         %58 = OpLoad %v2uint %tint_loop_idx_0 None
+         %59 = OpIEqual %v2bool %58 %22
+         %60 = OpAll %bool %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
          %62 = OpLabel
-         %64 = OpLoad %int %i None
-               OpSelectionMerge %67 None
-               OpSwitch %64 %65 0 %66
-         %65 = OpLabel
-               OpBranch %67
+               OpBranch %37
+         %61 = OpLabel
+         %63 = OpLoad %int %j None
+         %64 = OpSLessThan %bool %63 %int_2
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %65 %66
          %66 = OpLabel
+               OpBranch %37
+         %65 = OpLabel
+         %67 = OpLoad %int %i None
+               OpSelectionMerge %70 None
+               OpSwitch %67 %68 0 %69
+         %68 = OpLabel
+               OpBranch %70
+         %69 = OpLabel
                OpBranch %35
-         %67 = OpLabel
+         %70 = OpLabel
                OpBranch %35
          %35 = OpLabel
-         %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %69 = OpLoad %uint %68 None
-%tint_low_inc_1 = OpISub %uint %69 %uint_1
          %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %71 %tint_low_inc_1 None
-         %72 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %72 %uint_1 %uint_0
-         %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-         %75 = OpLoad %uint %74 None
-         %76 = OpISub %uint %75 %tint_carry_1
+         %72 = OpLoad %uint %71 None
+%tint_low_inc_1 = OpISub %uint %72 %uint_1
+         %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %74 %tint_low_inc_1 None
+         %75 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %75 %uint_1 %uint_0
          %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %77 %76 None
-         %78 = OpLoad %int %j None
-         %79 = OpIAdd %int %78 %int_2
-               OpStore %j %79 None
+         %78 = OpLoad %uint %77 None
+         %79 = OpISub %uint %78 %tint_carry_1
+         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %80 %79 None
+         %81 = OpLoad %int %j None
+         %82 = OpBitcast %uint %81
+         %83 = OpBitcast %uint %int_2
+         %84 = OpIAdd %uint %82 %83
+         %85 = OpBitcast %int %84
+               OpStore %j %85 None
                OpBranch %36
          %37 = OpLabel
                OpBranch %7
@@ -129,8 +132,11 @@
          %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %50 %49 None
          %51 = OpLoad %int %i None
-         %52 = OpIAdd %int %51 %int_2
-               OpStore %i %52 None
+         %52 = OpBitcast %uint %51
+         %53 = OpBitcast %uint %int_2
+         %54 = OpIAdd %uint %52 %53
+         %55 = OpBitcast %int %54
+               OpStore %i %55 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.glsl b/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.glsl
index 9d4e46f..66b44a9 100644
--- a/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.glsl
@@ -42,7 +42,8 @@
               tint_loop_idx_1.x = tint_low_inc_1;
               uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
               tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-              j = (j + 2);
+              uint v = uint(j);
+              j = int((v + uint(2)));
             }
             continue;
           }
@@ -51,7 +52,8 @@
             tint_loop_idx_1.x = tint_low_inc_1;
             uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
             tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-            j = (j + 2);
+            uint v = uint(j);
+            j = int((v + uint(2)));
           }
           continue;
         }
@@ -61,7 +63,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm
index e79293e..4c15133 100644
--- a/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 80
+; Bound: 86
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -72,46 +72,49 @@
                OpLoopMerge %37 %35 None
                OpBranch %34
          %34 = OpLabel
-         %55 = OpLoad %v2uint %tint_loop_idx_0 None
-         %56 = OpIEqual %v2bool %55 %22
-         %57 = OpAll %bool %56
-               OpSelectionMerge %58 None
-               OpBranchConditional %57 %59 %58
-         %59 = OpLabel
-               OpBranch %37
-         %58 = OpLabel
-         %60 = OpLoad %int %j None
-         %61 = OpSLessThan %bool %60 %int_2
-               OpSelectionMerge %62 None
-               OpBranchConditional %61 %62 %63
-         %63 = OpLabel
-               OpBranch %37
+         %58 = OpLoad %v2uint %tint_loop_idx_0 None
+         %59 = OpIEqual %v2bool %58 %22
+         %60 = OpAll %bool %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
          %62 = OpLabel
-         %64 = OpLoad %int %i None
-               OpSelectionMerge %67 None
-               OpSwitch %64 %65 0 %66
-         %65 = OpLabel
-               OpBranch %67
+               OpBranch %37
+         %61 = OpLabel
+         %63 = OpLoad %int %j None
+         %64 = OpSLessThan %bool %63 %int_2
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %65 %66
          %66 = OpLabel
+               OpBranch %37
+         %65 = OpLabel
+         %67 = OpLoad %int %i None
+               OpSelectionMerge %70 None
+               OpSwitch %67 %68 0 %69
+         %68 = OpLabel
+               OpBranch %70
+         %69 = OpLabel
                OpBranch %35
-         %67 = OpLabel
+         %70 = OpLabel
                OpBranch %35
          %35 = OpLabel
-         %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %69 = OpLoad %uint %68 None
-%tint_low_inc_1 = OpISub %uint %69 %uint_1
          %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %71 %tint_low_inc_1 None
-         %72 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %72 %uint_1 %uint_0
-         %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-         %75 = OpLoad %uint %74 None
-         %76 = OpISub %uint %75 %tint_carry_1
+         %72 = OpLoad %uint %71 None
+%tint_low_inc_1 = OpISub %uint %72 %uint_1
+         %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %74 %tint_low_inc_1 None
+         %75 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %75 %uint_1 %uint_0
          %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %77 %76 None
-         %78 = OpLoad %int %j None
-         %79 = OpIAdd %int %78 %int_2
-               OpStore %j %79 None
+         %78 = OpLoad %uint %77 None
+         %79 = OpISub %uint %78 %tint_carry_1
+         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %80 %79 None
+         %81 = OpLoad %int %j None
+         %82 = OpBitcast %uint %81
+         %83 = OpBitcast %uint %int_2
+         %84 = OpIAdd %uint %82 %83
+         %85 = OpBitcast %int %84
+               OpStore %j %85 None
                OpBranch %36
          %37 = OpLabel
                OpBranch %7
@@ -129,8 +132,11 @@
          %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %50 %49 None
          %51 = OpLoad %int %i None
-         %52 = OpIAdd %int %51 %int_2
-               OpStore %i %52 None
+         %52 = OpBitcast %uint %51
+         %53 = OpBitcast %uint %int_2
+         %54 = OpIAdd %uint %52 %53
+         %55 = OpBitcast %int %54
+               OpStore %i %55 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.glsl b/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.glsl
index b74b006..e193c57 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.glsl
@@ -46,7 +46,8 @@
                   tint_loop_idx_1.x = tint_low_inc_1;
                   uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                   tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                  j = (j + 2);
+                  uint v = uint(j);
+                  j = int((v + uint(2)));
                 }
                 continue;
               }
@@ -55,7 +56,8 @@
                 tint_loop_idx_1.x = tint_low_inc_1;
                 uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                 tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                j = (j + 2);
+                uint v = uint(j);
+                j = int((v + uint(2)));
               }
               continue;
             }
@@ -74,7 +76,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 2);
+          uint v_1 = uint(i);
+          i = int((v_1 + uint(2)));
         }
         continue;
       }
@@ -83,7 +86,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm
index 7463eab..fb1a146 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 84
+; Bound: 90
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -69,57 +69,60 @@
          %34 = OpLabel
                OpBranch %36
          %35 = OpLabel
-               OpBranch %52
-         %52 = OpLabel
-               OpStore %tint_loop_idx_0 %14
-               OpStore %j %int_0
                OpBranch %55
          %55 = OpLabel
-               OpLoopMerge %56 %54 None
-               OpBranch %53
-         %53 = OpLabel
-         %59 = OpLoad %v2uint %tint_loop_idx_0 None
-         %60 = OpIEqual %v2bool %59 %22
-         %61 = OpAll %bool %60
-               OpSelectionMerge %62 None
-               OpBranchConditional %61 %63 %62
-         %63 = OpLabel
+               OpStore %tint_loop_idx_0 %14
+               OpStore %j %int_0
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %57 None
                OpBranch %56
-         %62 = OpLabel
-         %64 = OpLoad %int %j None
-         %65 = OpSLessThan %bool %64 %int_2
-               OpSelectionMerge %66 None
-               OpBranchConditional %65 %66 %67
-         %67 = OpLabel
-               OpBranch %56
-         %66 = OpLabel
-         %68 = OpLoad %int %j None
-               OpSelectionMerge %71 None
-               OpSwitch %68 %69 0 %70
-         %69 = OpLabel
-               OpBranch %71
-         %70 = OpLabel
-               OpBranch %54
-         %71 = OpLabel
-               OpBranch %54
-         %54 = OpLabel
-         %72 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %73 = OpLoad %uint %72 None
-%tint_low_inc_1 = OpISub %uint %73 %uint_1
-         %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %75 %tint_low_inc_1 None
-         %76 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %76 %uint_1 %uint_0
-         %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-         %79 = OpLoad %uint %78 None
-         %80 = OpISub %uint %79 %tint_carry_1
-         %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %81 %80 None
-         %82 = OpLoad %int %j None
-         %83 = OpIAdd %int %82 %int_2
-               OpStore %j %83 None
-               OpBranch %55
          %56 = OpLabel
+         %62 = OpLoad %v2uint %tint_loop_idx_0 None
+         %63 = OpIEqual %v2bool %62 %22
+         %64 = OpAll %bool %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpBranch %59
+         %65 = OpLabel
+         %67 = OpLoad %int %j None
+         %68 = OpSLessThan %bool %67 %int_2
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %69 %70
+         %70 = OpLabel
+               OpBranch %59
+         %69 = OpLabel
+         %71 = OpLoad %int %j None
+               OpSelectionMerge %74 None
+               OpSwitch %71 %72 0 %73
+         %72 = OpLabel
+               OpBranch %74
+         %73 = OpLabel
+               OpBranch %57
+         %74 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+         %76 = OpLoad %uint %75 None
+%tint_low_inc_1 = OpISub %uint %76 %uint_1
+         %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %78 %tint_low_inc_1 None
+         %79 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %79 %uint_1 %uint_0
+         %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+         %82 = OpLoad %uint %81 None
+         %83 = OpISub %uint %82 %tint_carry_1
+         %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %84 %83 None
+         %85 = OpLoad %int %j None
+         %86 = OpBitcast %uint %85
+         %87 = OpBitcast %uint %int_2
+         %88 = OpIAdd %uint %86 %87
+         %89 = OpBitcast %int %88
+               OpStore %j %89 None
+               OpBranch %58
+         %59 = OpLabel
                OpBranch %7
          %36 = OpLabel
                OpBranch %7
@@ -137,8 +140,11 @@
          %49 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %49 %48 None
          %50 = OpLoad %int %i None
-         %51 = OpIAdd %int %50 %int_2
-               OpStore %i %51 None
+         %51 = OpBitcast %uint %50
+         %52 = OpBitcast %uint %int_2
+         %53 = OpIAdd %uint %51 %52
+         %54 = OpBitcast %int %53
+               OpStore %i %54 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.glsl b/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.glsl
index b74b006..e193c57 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.glsl
@@ -46,7 +46,8 @@
                   tint_loop_idx_1.x = tint_low_inc_1;
                   uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                   tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                  j = (j + 2);
+                  uint v = uint(j);
+                  j = int((v + uint(2)));
                 }
                 continue;
               }
@@ -55,7 +56,8 @@
                 tint_loop_idx_1.x = tint_low_inc_1;
                 uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                 tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                j = (j + 2);
+                uint v = uint(j);
+                j = int((v + uint(2)));
               }
               continue;
             }
@@ -74,7 +76,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 2);
+          uint v_1 = uint(i);
+          i = int((v_1 + uint(2)));
         }
         continue;
       }
@@ -83,7 +86,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm
index 7463eab..fb1a146 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 84
+; Bound: 90
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -69,57 +69,60 @@
          %34 = OpLabel
                OpBranch %36
          %35 = OpLabel
-               OpBranch %52
-         %52 = OpLabel
-               OpStore %tint_loop_idx_0 %14
-               OpStore %j %int_0
                OpBranch %55
          %55 = OpLabel
-               OpLoopMerge %56 %54 None
-               OpBranch %53
-         %53 = OpLabel
-         %59 = OpLoad %v2uint %tint_loop_idx_0 None
-         %60 = OpIEqual %v2bool %59 %22
-         %61 = OpAll %bool %60
-               OpSelectionMerge %62 None
-               OpBranchConditional %61 %63 %62
-         %63 = OpLabel
+               OpStore %tint_loop_idx_0 %14
+               OpStore %j %int_0
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %57 None
                OpBranch %56
-         %62 = OpLabel
-         %64 = OpLoad %int %j None
-         %65 = OpSLessThan %bool %64 %int_2
-               OpSelectionMerge %66 None
-               OpBranchConditional %65 %66 %67
-         %67 = OpLabel
-               OpBranch %56
-         %66 = OpLabel
-         %68 = OpLoad %int %j None
-               OpSelectionMerge %71 None
-               OpSwitch %68 %69 0 %70
-         %69 = OpLabel
-               OpBranch %71
-         %70 = OpLabel
-               OpBranch %54
-         %71 = OpLabel
-               OpBranch %54
-         %54 = OpLabel
-         %72 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %73 = OpLoad %uint %72 None
-%tint_low_inc_1 = OpISub %uint %73 %uint_1
-         %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %75 %tint_low_inc_1 None
-         %76 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %76 %uint_1 %uint_0
-         %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-         %79 = OpLoad %uint %78 None
-         %80 = OpISub %uint %79 %tint_carry_1
-         %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %81 %80 None
-         %82 = OpLoad %int %j None
-         %83 = OpIAdd %int %82 %int_2
-               OpStore %j %83 None
-               OpBranch %55
          %56 = OpLabel
+         %62 = OpLoad %v2uint %tint_loop_idx_0 None
+         %63 = OpIEqual %v2bool %62 %22
+         %64 = OpAll %bool %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpBranch %59
+         %65 = OpLabel
+         %67 = OpLoad %int %j None
+         %68 = OpSLessThan %bool %67 %int_2
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %69 %70
+         %70 = OpLabel
+               OpBranch %59
+         %69 = OpLabel
+         %71 = OpLoad %int %j None
+               OpSelectionMerge %74 None
+               OpSwitch %71 %72 0 %73
+         %72 = OpLabel
+               OpBranch %74
+         %73 = OpLabel
+               OpBranch %57
+         %74 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+         %76 = OpLoad %uint %75 None
+%tint_low_inc_1 = OpISub %uint %76 %uint_1
+         %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %78 %tint_low_inc_1 None
+         %79 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %79 %uint_1 %uint_0
+         %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+         %82 = OpLoad %uint %81 None
+         %83 = OpISub %uint %82 %tint_carry_1
+         %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %84 %83 None
+         %85 = OpLoad %int %j None
+         %86 = OpBitcast %uint %85
+         %87 = OpBitcast %uint %int_2
+         %88 = OpIAdd %uint %86 %87
+         %89 = OpBitcast %int %88
+               OpStore %j %89 None
+               OpBranch %58
+         %59 = OpLabel
                OpBranch %7
          %36 = OpLabel
                OpBranch %7
@@ -137,8 +140,11 @@
          %49 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %49 %48 None
          %50 = OpLoad %int %i None
-         %51 = OpIAdd %int %50 %int_2
-               OpStore %i %51 None
+         %51 = OpBitcast %uint %50
+         %52 = OpBitcast %uint %int_2
+         %53 = OpIAdd %uint %51 %52
+         %54 = OpBitcast %int %53
+               OpStore %i %54 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.glsl b/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.glsl
index 5c7b5f8..af21a5e 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.glsl
@@ -67,7 +67,8 @@
                   tint_loop_idx_1.x = tint_low_inc_1;
                   uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                   tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                  j = (j + 2);
+                  uint v = uint(j);
+                  j = int((v + uint(2)));
                 }
                 continue;
               }
@@ -76,7 +77,8 @@
                 tint_loop_idx_1.x = tint_low_inc_1;
                 uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                 tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                j = (j + 2);
+                uint v = uint(j);
+                j = int((v + uint(2)));
               }
               continue;
             }
@@ -95,7 +97,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 2);
+          uint v_1 = uint(i);
+          i = int((v_1 + uint(2)));
         }
         continue;
       }
@@ -104,7 +107,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm
index 8484bee..b25d76f 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 90
+; Bound: 96
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -72,67 +72,70 @@
          %35 = OpLabel
                OpBranch %37
          %36 = OpLabel
-               OpBranch %53
-         %53 = OpLabel
-               OpStore %tint_loop_idx_0 %18
-               OpStore %j %int_0
                OpBranch %56
          %56 = OpLabel
-               OpLoopMerge %57 %55 None
-               OpBranch %54
-         %54 = OpLabel
-         %60 = OpLoad %v2uint %tint_loop_idx_0 None
-         %61 = OpIEqual %v2bool %60 %23
-         %62 = OpAll %bool %61
-               OpSelectionMerge %63 None
-               OpBranchConditional %62 %64 %63
-         %64 = OpLabel
+               OpStore %tint_loop_idx_0 %18
+               OpStore %j %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %58 None
                OpBranch %57
-         %63 = OpLabel
-         %65 = OpLoad %int %j None
-         %66 = OpSLessThan %bool %65 %int_2
-               OpSelectionMerge %67 None
-               OpBranchConditional %66 %67 %68
-         %68 = OpLabel
-               OpBranch %57
-         %67 = OpLabel
-         %69 = OpLoad %int %j None
-               OpSelectionMerge %73 None
-               OpSwitch %69 %70 0 %71 1 %72
-         %70 = OpLabel
-               OpBranch %73
-         %71 = OpLabel
-               OpBranch %55
-         %72 = OpLabel
-         %86 = OpLoad %int %k None
-               OpSelectionMerge %89 None
-               OpSwitch %86 %87 0 %88
-         %87 = OpLabel
-               OpBranch %89
-         %88 = OpLabel
-               OpBranch %55
-         %89 = OpLabel
-               OpBranch %73
-         %73 = OpLabel
-               OpBranch %55
-         %55 = OpLabel
-         %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %75 = OpLoad %uint %74 None
-%tint_low_inc_1 = OpISub %uint %75 %uint_1
-         %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %77 %tint_low_inc_1 None
-         %78 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %78 %uint_1 %uint_0
-         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-         %81 = OpLoad %uint %80 None
-         %82 = OpISub %uint %81 %tint_carry_1
-         %83 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %83 %82 None
-         %84 = OpLoad %int %j None
-         %85 = OpIAdd %int %84 %int_2
-               OpStore %j %85 None
-               OpBranch %56
          %57 = OpLabel
+         %63 = OpLoad %v2uint %tint_loop_idx_0 None
+         %64 = OpIEqual %v2bool %63 %23
+         %65 = OpAll %bool %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+               OpBranch %60
+         %66 = OpLabel
+         %68 = OpLoad %int %j None
+         %69 = OpSLessThan %bool %68 %int_2
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %70 %71
+         %71 = OpLabel
+               OpBranch %60
+         %70 = OpLabel
+         %72 = OpLoad %int %j None
+               OpSelectionMerge %76 None
+               OpSwitch %72 %73 0 %74 1 %75
+         %73 = OpLabel
+               OpBranch %76
+         %74 = OpLabel
+               OpBranch %58
+         %75 = OpLabel
+         %92 = OpLoad %int %k None
+               OpSelectionMerge %95 None
+               OpSwitch %92 %93 0 %94
+         %93 = OpLabel
+               OpBranch %95
+         %94 = OpLabel
+               OpBranch %58
+         %95 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+         %78 = OpLoad %uint %77 None
+%tint_low_inc_1 = OpISub %uint %78 %uint_1
+         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %80 %tint_low_inc_1 None
+         %81 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %81 %uint_1 %uint_0
+         %83 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+         %84 = OpLoad %uint %83 None
+         %85 = OpISub %uint %84 %tint_carry_1
+         %86 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %86 %85 None
+         %87 = OpLoad %int %j None
+         %88 = OpBitcast %uint %87
+         %89 = OpBitcast %uint %int_2
+         %90 = OpIAdd %uint %88 %89
+         %91 = OpBitcast %int %90
+               OpStore %j %91 None
+               OpBranch %59
+         %60 = OpLabel
                OpBranch %11
          %37 = OpLabel
                OpBranch %11
@@ -150,8 +153,11 @@
          %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %50 %49 None
          %51 = OpLoad %int %i None
-         %52 = OpIAdd %int %51 %int_2
-               OpStore %i %52 None
+         %52 = OpBitcast %uint %51
+         %53 = OpBitcast %uint %int_2
+         %54 = OpIAdd %uint %52 %53
+         %55 = OpBitcast %int %54
+               OpStore %i %55 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.glsl b/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.glsl
index 5c7b5f8..af21a5e 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.glsl
@@ -67,7 +67,8 @@
                   tint_loop_idx_1.x = tint_low_inc_1;
                   uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                   tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                  j = (j + 2);
+                  uint v = uint(j);
+                  j = int((v + uint(2)));
                 }
                 continue;
               }
@@ -76,7 +77,8 @@
                 tint_loop_idx_1.x = tint_low_inc_1;
                 uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
                 tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-                j = (j + 2);
+                uint v = uint(j);
+                j = int((v + uint(2)));
               }
               continue;
             }
@@ -95,7 +97,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 2);
+          uint v_1 = uint(i);
+          i = int((v_1 + uint(2)));
         }
         continue;
       }
@@ -104,7 +107,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v_1 = uint(i);
+        i = int((v_1 + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm
index 8484bee..b25d76f 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 90
+; Bound: 96
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -72,67 +72,70 @@
          %35 = OpLabel
                OpBranch %37
          %36 = OpLabel
-               OpBranch %53
-         %53 = OpLabel
-               OpStore %tint_loop_idx_0 %18
-               OpStore %j %int_0
                OpBranch %56
          %56 = OpLabel
-               OpLoopMerge %57 %55 None
-               OpBranch %54
-         %54 = OpLabel
-         %60 = OpLoad %v2uint %tint_loop_idx_0 None
-         %61 = OpIEqual %v2bool %60 %23
-         %62 = OpAll %bool %61
-               OpSelectionMerge %63 None
-               OpBranchConditional %62 %64 %63
-         %64 = OpLabel
+               OpStore %tint_loop_idx_0 %18
+               OpStore %j %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %58 None
                OpBranch %57
-         %63 = OpLabel
-         %65 = OpLoad %int %j None
-         %66 = OpSLessThan %bool %65 %int_2
-               OpSelectionMerge %67 None
-               OpBranchConditional %66 %67 %68
-         %68 = OpLabel
-               OpBranch %57
-         %67 = OpLabel
-         %69 = OpLoad %int %j None
-               OpSelectionMerge %73 None
-               OpSwitch %69 %70 0 %71 1 %72
-         %70 = OpLabel
-               OpBranch %73
-         %71 = OpLabel
-               OpBranch %55
-         %72 = OpLabel
-         %86 = OpLoad %int %k None
-               OpSelectionMerge %89 None
-               OpSwitch %86 %87 0 %88
-         %87 = OpLabel
-               OpBranch %89
-         %88 = OpLabel
-               OpBranch %55
-         %89 = OpLabel
-               OpBranch %73
-         %73 = OpLabel
-               OpBranch %55
-         %55 = OpLabel
-         %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %75 = OpLoad %uint %74 None
-%tint_low_inc_1 = OpISub %uint %75 %uint_1
-         %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %77 %tint_low_inc_1 None
-         %78 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %78 %uint_1 %uint_0
-         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-         %81 = OpLoad %uint %80 None
-         %82 = OpISub %uint %81 %tint_carry_1
-         %83 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %83 %82 None
-         %84 = OpLoad %int %j None
-         %85 = OpIAdd %int %84 %int_2
-               OpStore %j %85 None
-               OpBranch %56
          %57 = OpLabel
+         %63 = OpLoad %v2uint %tint_loop_idx_0 None
+         %64 = OpIEqual %v2bool %63 %23
+         %65 = OpAll %bool %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+               OpBranch %60
+         %66 = OpLabel
+         %68 = OpLoad %int %j None
+         %69 = OpSLessThan %bool %68 %int_2
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %70 %71
+         %71 = OpLabel
+               OpBranch %60
+         %70 = OpLabel
+         %72 = OpLoad %int %j None
+               OpSelectionMerge %76 None
+               OpSwitch %72 %73 0 %74 1 %75
+         %73 = OpLabel
+               OpBranch %76
+         %74 = OpLabel
+               OpBranch %58
+         %75 = OpLabel
+         %92 = OpLoad %int %k None
+               OpSelectionMerge %95 None
+               OpSwitch %92 %93 0 %94
+         %93 = OpLabel
+               OpBranch %95
+         %94 = OpLabel
+               OpBranch %58
+         %95 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+         %78 = OpLoad %uint %77 None
+%tint_low_inc_1 = OpISub %uint %78 %uint_1
+         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %80 %tint_low_inc_1 None
+         %81 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %81 %uint_1 %uint_0
+         %83 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+         %84 = OpLoad %uint %83 None
+         %85 = OpISub %uint %84 %tint_carry_1
+         %86 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %86 %85 None
+         %87 = OpLoad %int %j None
+         %88 = OpBitcast %uint %87
+         %89 = OpBitcast %uint %int_2
+         %90 = OpIAdd %uint %88 %89
+         %91 = OpBitcast %int %90
+               OpStore %j %91 None
+               OpBranch %59
+         %60 = OpLabel
                OpBranch %11
          %37 = OpLabel
                OpBranch %11
@@ -150,8 +153,11 @@
          %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %50 %49 None
          %51 = OpLoad %int %i None
-         %52 = OpIAdd %int %51 %int_2
-               OpStore %i %52 None
+         %52 = OpBitcast %uint %51
+         %53 = OpBitcast %uint %int_2
+         %54 = OpIAdd %uint %52 %53
+         %55 = OpBitcast %int %54
+               OpStore %i %55 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_switch_switch.wgsl.expected.glsl b/test/tint/loops/nested_loop_switch_switch.wgsl.expected.glsl
index dfcd0ad..f0e0adb 100644
--- a/test/tint/loops/nested_loop_switch_switch.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_switch_switch.wgsl.expected.glsl
@@ -47,7 +47,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 2);
+          uint v = uint(i);
+          i = int((v + uint(2)));
         }
         continue;
       }
@@ -56,7 +57,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v = uint(i);
+        i = int((v + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm
index 458006a..d68e811 100644
--- a/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 57
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -66,14 +66,14 @@
          %35 = OpLabel
                OpBranch %37
          %36 = OpLabel
-         %53 = OpLoad %int %j None
-               OpSelectionMerge %56 None
-               OpSwitch %53 %54 0 %55
-         %54 = OpLabel
-               OpBranch %56
-         %55 = OpLabel
+         %56 = OpLoad %int %j None
+               OpSelectionMerge %59 None
+               OpSwitch %56 %57 0 %58
+         %57 = OpLabel
+               OpBranch %59
+         %58 = OpLabel
                OpBranch %11
-         %56 = OpLabel
+         %59 = OpLabel
                OpBranch %37
          %37 = OpLabel
                OpBranch %11
@@ -91,8 +91,11 @@
          %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %50 %49 None
          %51 = OpLoad %int %i None
-         %52 = OpIAdd %int %51 %int_2
-               OpStore %i %52 None
+         %52 = OpBitcast %uint %51
+         %53 = OpBitcast %uint %int_2
+         %54 = OpIAdd %uint %52 %53
+         %55 = OpBitcast %int %54
+               OpStore %i %55 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.glsl b/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.glsl
index dfcd0ad..f0e0adb 100644
--- a/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.glsl
@@ -47,7 +47,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 2);
+          uint v = uint(i);
+          i = int((v + uint(2)));
         }
         continue;
       }
@@ -56,7 +57,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 2);
+        uint v = uint(i);
+        i = int((v + uint(2)));
       }
       continue;
     }
diff --git a/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm
index 458006a..d68e811 100644
--- a/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 57
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -66,14 +66,14 @@
          %35 = OpLabel
                OpBranch %37
          %36 = OpLabel
-         %53 = OpLoad %int %j None
-               OpSelectionMerge %56 None
-               OpSwitch %53 %54 0 %55
-         %54 = OpLabel
-               OpBranch %56
-         %55 = OpLabel
+         %56 = OpLoad %int %j None
+               OpSelectionMerge %59 None
+               OpSwitch %56 %57 0 %58
+         %57 = OpLabel
+               OpBranch %59
+         %58 = OpLabel
                OpBranch %11
-         %56 = OpLabel
+         %59 = OpLabel
                OpBranch %37
          %37 = OpLabel
                OpBranch %11
@@ -91,8 +91,11 @@
          %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %50 %49 None
          %51 = OpLoad %int %i None
-         %52 = OpIAdd %int %51 %int_2
-               OpStore %i %52 None
+         %52 = OpBitcast %uint %51
+         %53 = OpBitcast %uint %int_2
+         %54 = OpIAdd %uint %52 %53
+         %55 = OpBitcast %int %54
+               OpStore %i %55 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
diff --git a/test/tint/loops/nested_loops.wgsl.expected.glsl b/test/tint/loops/nested_loops.wgsl.expected.glsl
index 78ac004..4435461 100644
--- a/test/tint/loops/nested_loops.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loops.wgsl.expected.glsl
@@ -9,7 +9,8 @@
       if (all(equal(tint_loop_idx, uvec2(0u)))) {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       if ((i > 4)) {
         return 1;
       }
@@ -19,7 +20,8 @@
           if (all(equal(tint_loop_idx_1, uvec2(0u)))) {
             break;
           }
-          j = (j + 1);
+          uint v_1 = uint(j);
+          j = int((v_1 + uint(1)));
           if ((j > 4)) {
             return 2;
           }
diff --git a/test/tint/loops/nested_loops.wgsl.expected.spvasm b/test/tint/loops/nested_loops.wgsl.expected.spvasm
index 10b1cd7..eccd4e3 100644
--- a/test/tint/loops/nested_loops.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 99
+; Bound: 105
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -41,7 +41,7 @@
       %false = OpConstantFalse %bool
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %97 = OpTypeFunction %void
+        %103 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -68,102 +68,108 @@
                OpBranch %18
          %31 = OpLabel
          %33 = OpLoad %int %i None
-         %34 = OpIAdd %int %33 %int_1
-               OpStore %i %34 None
-         %36 = OpLoad %int %i None
-         %37 = OpSGreaterThan %bool %36 %int_4
-               OpSelectionMerge %39 None
-               OpBranchConditional %37 %40 %39
-         %40 = OpLabel
+         %34 = OpBitcast %uint %33
+         %35 = OpBitcast %uint %int_1
+         %37 = OpIAdd %uint %34 %35
+         %38 = OpBitcast %int %37
+               OpStore %i %38 None
+         %39 = OpLoad %int %i None
+         %40 = OpSGreaterThan %bool %39 %int_4
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
                OpStore %continue_execution %false None
                OpStore %return_value %int_1 None
-               OpBranch %39
-         %39 = OpLabel
-         %41 = OpLoad %bool %continue_execution None
-         %42 = OpLogicalNot %bool %41
-               OpSelectionMerge %43 None
-               OpBranchConditional %42 %44 %43
-         %44 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+         %44 = OpLoad %bool %continue_execution None
+         %45 = OpLogicalNot %bool %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
                OpBranch %18
-         %43 = OpLabel
-               OpBranch %45
-         %45 = OpLabel
-               OpStore %tint_loop_idx_0 %24
+         %46 = OpLabel
                OpBranch %48
          %48 = OpLabel
-               OpLoopMerge %49 %47 None
-               OpBranch %46
-         %46 = OpLabel
-         %69 = OpLoad %v2uint %tint_loop_idx_0 None
-         %70 = OpIEqual %v2bool %69 %28
-         %71 = OpAll %bool %70
-               OpSelectionMerge %72 None
-               OpBranchConditional %71 %73 %72
-         %73 = OpLabel
+               OpStore %tint_loop_idx_0 %24
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %50 None
                OpBranch %49
-         %72 = OpLabel
-         %74 = OpLoad %int %j None
-         %75 = OpIAdd %int %74 %int_1
-               OpStore %j %75 None
-         %76 = OpLoad %int %j None
-         %77 = OpSGreaterThan %bool %76 %int_4
-               OpSelectionMerge %78 None
-               OpBranchConditional %77 %79 %78
-         %79 = OpLabel
+         %49 = OpLabel
+         %72 = OpLoad %v2uint %tint_loop_idx_0 None
+         %73 = OpIEqual %v2bool %72 %28
+         %74 = OpAll %bool %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpBranch %52
+         %75 = OpLabel
+         %77 = OpLoad %int %j None
+         %78 = OpBitcast %uint %77
+         %79 = OpBitcast %uint %int_1
+         %80 = OpIAdd %uint %78 %79
+         %81 = OpBitcast %int %80
+               OpStore %j %81 None
+         %82 = OpLoad %int %j None
+         %83 = OpSGreaterThan %bool %82 %int_4
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
                OpStore %continue_execution %false None
                OpStore %return_value %int_2 None
-               OpBranch %78
-         %78 = OpLabel
-         %80 = OpLoad %bool %continue_execution None
-         %81 = OpLogicalNot %bool %80
-               OpSelectionMerge %82 None
-               OpBranchConditional %81 %83 %82
-         %83 = OpLabel
-               OpBranch %49
-         %82 = OpLabel
-               OpBranch %47
-         %47 = OpLabel
-         %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %85 = OpLoad %uint %84 None
-%tint_low_inc_1 = OpISub %uint %85 %uint_1
-         %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %87 %tint_low_inc_1 None
-         %88 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %88 %uint_1 %uint_0
-         %90 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpLoad %bool %continue_execution None
+         %87 = OpLogicalNot %bool %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %52
+         %88 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
          %91 = OpLoad %uint %90 None
-         %92 = OpISub %uint %91 %tint_carry_1
-         %93 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %93 %92 None
-               OpBranch %48
-         %49 = OpLabel
-         %50 = OpLoad %bool %continue_execution None
-         %51 = OpLogicalNot %bool %50
-               OpSelectionMerge %52 None
-               OpBranchConditional %51 %53 %52
-         %53 = OpLabel
-               OpBranch %18
+%tint_low_inc_1 = OpISub %uint %91 %uint_1
+         %93 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %93 %tint_low_inc_1 None
+         %94 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %94 %uint_1 %uint_0
+         %96 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+         %97 = OpLoad %uint %96 None
+         %98 = OpISub %uint %97 %tint_carry_1
+         %99 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %99 %98 None
+               OpBranch %51
          %52 = OpLabel
+         %53 = OpLoad %bool %continue_execution None
+         %54 = OpLogicalNot %bool %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpBranch %18
+         %55 = OpLabel
                OpUnreachable
          %16 = OpLabel
-         %54 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %57 = OpLoad %uint %54 None
-%tint_low_inc = OpISub %uint %57 %uint_1
-         %60 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %60 %tint_low_inc None
-         %61 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %61 %uint_1 %uint_0
-         %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %64 = OpLoad %uint %63 None
-         %65 = OpISub %uint %64 %tint_carry
+         %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %60 = OpLoad %uint %57 None
+%tint_low_inc = OpISub %uint %60 %uint_1
+         %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %63 %tint_low_inc None
+         %64 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %64 %uint_1 %uint_0
          %66 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %66 %65 None
+         %67 = OpLoad %uint %66 None
+         %68 = OpISub %uint %67 %tint_carry
+         %69 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %69 %68 None
                OpBranch %17
          %18 = OpLabel
          %19 = OpLoad %int %return_value None
                OpReturnValue %19
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %97
-         %98 = OpLabel
+%unused_entry_point = OpFunction %void None %103
+        %104 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/nested_loops_robustness.wgsl.expected.glsl b/test/tint/loops/nested_loops_robustness.wgsl.expected.glsl
index 78ac004..4435461 100644
--- a/test/tint/loops/nested_loops_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loops_robustness.wgsl.expected.glsl
@@ -9,7 +9,8 @@
       if (all(equal(tint_loop_idx, uvec2(0u)))) {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       if ((i > 4)) {
         return 1;
       }
@@ -19,7 +20,8 @@
           if (all(equal(tint_loop_idx_1, uvec2(0u)))) {
             break;
           }
-          j = (j + 1);
+          uint v_1 = uint(j);
+          j = int((v_1 + uint(1)));
           if ((j > 4)) {
             return 2;
           }
diff --git a/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm
index 10b1cd7..eccd4e3 100644
--- a/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 99
+; Bound: 105
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -41,7 +41,7 @@
       %false = OpConstantFalse %bool
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %97 = OpTypeFunction %void
+        %103 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -68,102 +68,108 @@
                OpBranch %18
          %31 = OpLabel
          %33 = OpLoad %int %i None
-         %34 = OpIAdd %int %33 %int_1
-               OpStore %i %34 None
-         %36 = OpLoad %int %i None
-         %37 = OpSGreaterThan %bool %36 %int_4
-               OpSelectionMerge %39 None
-               OpBranchConditional %37 %40 %39
-         %40 = OpLabel
+         %34 = OpBitcast %uint %33
+         %35 = OpBitcast %uint %int_1
+         %37 = OpIAdd %uint %34 %35
+         %38 = OpBitcast %int %37
+               OpStore %i %38 None
+         %39 = OpLoad %int %i None
+         %40 = OpSGreaterThan %bool %39 %int_4
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
                OpStore %continue_execution %false None
                OpStore %return_value %int_1 None
-               OpBranch %39
-         %39 = OpLabel
-         %41 = OpLoad %bool %continue_execution None
-         %42 = OpLogicalNot %bool %41
-               OpSelectionMerge %43 None
-               OpBranchConditional %42 %44 %43
-         %44 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+         %44 = OpLoad %bool %continue_execution None
+         %45 = OpLogicalNot %bool %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
                OpBranch %18
-         %43 = OpLabel
-               OpBranch %45
-         %45 = OpLabel
-               OpStore %tint_loop_idx_0 %24
+         %46 = OpLabel
                OpBranch %48
          %48 = OpLabel
-               OpLoopMerge %49 %47 None
-               OpBranch %46
-         %46 = OpLabel
-         %69 = OpLoad %v2uint %tint_loop_idx_0 None
-         %70 = OpIEqual %v2bool %69 %28
-         %71 = OpAll %bool %70
-               OpSelectionMerge %72 None
-               OpBranchConditional %71 %73 %72
-         %73 = OpLabel
+               OpStore %tint_loop_idx_0 %24
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %50 None
                OpBranch %49
-         %72 = OpLabel
-         %74 = OpLoad %int %j None
-         %75 = OpIAdd %int %74 %int_1
-               OpStore %j %75 None
-         %76 = OpLoad %int %j None
-         %77 = OpSGreaterThan %bool %76 %int_4
-               OpSelectionMerge %78 None
-               OpBranchConditional %77 %79 %78
-         %79 = OpLabel
+         %49 = OpLabel
+         %72 = OpLoad %v2uint %tint_loop_idx_0 None
+         %73 = OpIEqual %v2bool %72 %28
+         %74 = OpAll %bool %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpBranch %52
+         %75 = OpLabel
+         %77 = OpLoad %int %j None
+         %78 = OpBitcast %uint %77
+         %79 = OpBitcast %uint %int_1
+         %80 = OpIAdd %uint %78 %79
+         %81 = OpBitcast %int %80
+               OpStore %j %81 None
+         %82 = OpLoad %int %j None
+         %83 = OpSGreaterThan %bool %82 %int_4
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
                OpStore %continue_execution %false None
                OpStore %return_value %int_2 None
-               OpBranch %78
-         %78 = OpLabel
-         %80 = OpLoad %bool %continue_execution None
-         %81 = OpLogicalNot %bool %80
-               OpSelectionMerge %82 None
-               OpBranchConditional %81 %83 %82
-         %83 = OpLabel
-               OpBranch %49
-         %82 = OpLabel
-               OpBranch %47
-         %47 = OpLabel
-         %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-         %85 = OpLoad %uint %84 None
-%tint_low_inc_1 = OpISub %uint %85 %uint_1
-         %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
-               OpStore %87 %tint_low_inc_1 None
-         %88 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
-%tint_carry_1 = OpSelect %uint %88 %uint_1 %uint_0
-         %90 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpLoad %bool %continue_execution None
+         %87 = OpLogicalNot %bool %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %52
+         %88 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
          %91 = OpLoad %uint %90 None
-         %92 = OpISub %uint %91 %tint_carry_1
-         %93 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
-               OpStore %93 %92 None
-               OpBranch %48
-         %49 = OpLabel
-         %50 = OpLoad %bool %continue_execution None
-         %51 = OpLogicalNot %bool %50
-               OpSelectionMerge %52 None
-               OpBranchConditional %51 %53 %52
-         %53 = OpLabel
-               OpBranch %18
+%tint_low_inc_1 = OpISub %uint %91 %uint_1
+         %93 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+               OpStore %93 %tint_low_inc_1 None
+         %94 = OpIEqual %bool %tint_low_inc_1 %uint_4294967295
+%tint_carry_1 = OpSelect %uint %94 %uint_1 %uint_0
+         %96 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+         %97 = OpLoad %uint %96 None
+         %98 = OpISub %uint %97 %tint_carry_1
+         %99 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+               OpStore %99 %98 None
+               OpBranch %51
          %52 = OpLabel
+         %53 = OpLoad %bool %continue_execution None
+         %54 = OpLogicalNot %bool %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpBranch %18
+         %55 = OpLabel
                OpUnreachable
          %16 = OpLabel
-         %54 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %57 = OpLoad %uint %54 None
-%tint_low_inc = OpISub %uint %57 %uint_1
-         %60 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %60 %tint_low_inc None
-         %61 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %61 %uint_1 %uint_0
-         %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %64 = OpLoad %uint %63 None
-         %65 = OpISub %uint %64 %tint_carry
+         %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %60 = OpLoad %uint %57 None
+%tint_low_inc = OpISub %uint %60 %uint_1
+         %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %63 %tint_low_inc None
+         %64 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %64 %uint_1 %uint_0
          %66 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %66 %65 None
+         %67 = OpLoad %uint %66 None
+         %68 = OpISub %uint %67 %tint_carry
+         %69 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %69 %68 None
                OpBranch %17
          %18 = OpLabel
          %19 = OpLoad %int %return_value None
                OpReturnValue %19
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %97
-         %98 = OpLabel
+%unused_entry_point = OpFunction %void None %103
+        %104 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/nested_loops_with_continuing.wgsl.expected.glsl b/test/tint/loops/nested_loops_with_continuing.wgsl.expected.glsl
index 088d3b2..e642ef8 100644
--- a/test/tint/loops/nested_loops_with_continuing.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loops_with_continuing.wgsl.expected.glsl
@@ -26,7 +26,8 @@
             tint_loop_idx_1.x = tint_low_inc_1;
             uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
             tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-            j = (j + 1);
+            uint v = uint(j);
+            j = int((v + uint(1)));
           }
           continue;
         }
diff --git a/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm b/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm
index 1c01831..7487191 100644
--- a/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 97
+; Bound: 100
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -41,7 +41,7 @@
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %95 = OpTypeFunction %void
+         %98 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -130,8 +130,11 @@
          %89 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
                OpStore %89 %88 None
          %90 = OpLoad %int %j None
-         %91 = OpIAdd %int %90 %int_1
-               OpStore %j %91 None
+         %91 = OpBitcast %uint %90
+         %92 = OpBitcast %uint %int_1
+         %93 = OpIAdd %uint %91 %92
+         %94 = OpBitcast %int %93
+               OpStore %j %94 None
                OpBranch %45
          %46 = OpLabel
          %47 = OpLoad %bool %continue_execution None
@@ -160,7 +163,7 @@
          %19 = OpLoad %int %return_value None
                OpReturnValue %19
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %95
-         %96 = OpLabel
+%unused_entry_point = OpFunction %void None %98
+         %99 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.glsl b/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.glsl
index 088d3b2..e642ef8 100644
--- a/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.glsl
@@ -26,7 +26,8 @@
             tint_loop_idx_1.x = tint_low_inc_1;
             uint tint_carry_1 = uint((tint_low_inc_1 == 4294967295u));
             tint_loop_idx_1.y = (tint_loop_idx_1.y - tint_carry_1);
-            j = (j + 1);
+            uint v = uint(j);
+            j = int((v + uint(1)));
           }
           continue;
         }
diff --git a/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm
index 1c01831..7487191 100644
--- a/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 97
+; Bound: 100
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -41,7 +41,7 @@
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %95 = OpTypeFunction %void
+         %98 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
 %return_value = OpVariable %_ptr_Function_int Function %7
@@ -130,8 +130,11 @@
          %89 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
                OpStore %89 %88 None
          %90 = OpLoad %int %j None
-         %91 = OpIAdd %int %90 %int_1
-               OpStore %j %91 None
+         %91 = OpBitcast %uint %90
+         %92 = OpBitcast %uint %int_1
+         %93 = OpIAdd %uint %91 %92
+         %94 = OpBitcast %int %93
+               OpStore %j %94 None
                OpBranch %45
          %46 = OpLabel
          %47 = OpLoad %bool %continue_execution None
@@ -160,7 +163,7 @@
          %19 = OpLoad %int %return_value None
                OpReturnValue %19
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %95
-         %96 = OpLabel
+%unused_entry_point = OpFunction %void None %98
+         %99 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/single_continue.wgsl.expected.glsl b/test/tint/loops/single_continue.wgsl.expected.glsl
index 4abaca6..03a66f8 100644
--- a/test/tint/loops/single_continue.wgsl.expected.glsl
+++ b/test/tint/loops/single_continue.wgsl.expected.glsl
@@ -23,12 +23,14 @@
       }
       if (tint_continue) {
         {
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
         }
         continue;
       }
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/single_continue.wgsl.expected.spvasm b/test/tint/loops/single_continue.wgsl.expected.spvasm
index 882a203..65cddcd 100644
--- a/test/tint/loops/single_continue.wgsl.expected.spvasm
+++ b/test/tint/loops/single_continue.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 27
+; Bound: 31
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,6 +16,7 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
@@ -46,8 +47,11 @@
                OpBranch %7
           %7 = OpLabel
          %24 = OpLoad %int %i None
-         %25 = OpIAdd %int %24 %int_1
-               OpStore %i %25 None
+         %26 = OpBitcast %uint %24
+         %27 = OpBitcast %uint %int_1
+         %29 = OpIAdd %uint %26 %27
+         %30 = OpBitcast %int %29
+               OpStore %i %30 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/single_continue_robustness.wgsl.expected.glsl b/test/tint/loops/single_continue_robustness.wgsl.expected.glsl
index 4abaca6..03a66f8 100644
--- a/test/tint/loops/single_continue_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/single_continue_robustness.wgsl.expected.glsl
@@ -23,12 +23,14 @@
       }
       if (tint_continue) {
         {
-          i = (i + 1);
+          uint v = uint(i);
+          i = int((v + uint(1)));
         }
         continue;
       }
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/loops/single_continue_robustness.wgsl.expected.spvasm b/test/tint/loops/single_continue_robustness.wgsl.expected.spvasm
index 882a203..65cddcd 100644
--- a/test/tint/loops/single_continue_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/single_continue_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 27
+; Bound: 31
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,6 +16,7 @@
       %int_0 = OpConstant %int 0
       %int_2 = OpConstant %int 2
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
@@ -46,8 +47,11 @@
                OpBranch %7
           %7 = OpLabel
          %24 = OpLoad %int %i None
-         %25 = OpIAdd %int %24 %int_1
-               OpStore %i %25 None
+         %26 = OpBitcast %uint %24
+         %27 = OpBitcast %uint %int_1
+         %29 = OpIAdd %uint %26 %27
+         %30 = OpBitcast %int %29
+               OpStore %i %30 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
diff --git a/test/tint/loops/while.wgsl.expected.glsl b/test/tint/loops/while.wgsl.expected.glsl
index 2280d1b..7493c94 100644
--- a/test/tint/loops/while.wgsl.expected.glsl
+++ b/test/tint/loops/while.wgsl.expected.glsl
@@ -12,7 +12,8 @@
       } else {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
diff --git a/test/tint/loops/while.wgsl.expected.spvasm b/test/tint/loops/while.wgsl.expected.spvasm
index b26011f..cde37f7 100644
--- a/test/tint/loops/while.wgsl.expected.spvasm
+++ b/test/tint/loops/while.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 53
+; Bound: 56
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,7 +31,7 @@
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-         %51 = OpTypeFunction %void
+         %54 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function %7
@@ -60,28 +60,31 @@
                OpBranch %12
          %31 = OpLabel
          %33 = OpLoad %int %i None
-         %34 = OpIAdd %int %33 %int_1
-               OpStore %i %34 None
+         %34 = OpBitcast %uint %33
+         %35 = OpBitcast %uint %int_1
+         %37 = OpIAdd %uint %34 %35
+         %38 = OpBitcast %int %37
+               OpStore %i %38 None
                OpBranch %10
          %10 = OpLabel
-         %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %39 = OpLoad %uint %36 None
-%tint_low_inc = OpISub %uint %39 %uint_1
-         %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %42 %tint_low_inc None
-         %43 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %43 %uint_1 %uint_0
-         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %46 = OpLoad %uint %45 None
-         %47 = OpISub %uint %46 %tint_carry
+         %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %42 = OpLoad %uint %39 None
+%tint_low_inc = OpISub %uint %42 %uint_1
+         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %45 %tint_low_inc None
+         %46 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %46 %uint_1 %uint_0
          %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %48 %47 None
+         %49 = OpLoad %uint %48 None
+         %50 = OpISub %uint %49 %tint_carry
+         %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %51 %50 None
                OpBranch %11
          %12 = OpLabel
          %13 = OpLoad %int %i None
                OpReturnValue %13
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %51
-         %52 = OpLabel
+%unused_entry_point = OpFunction %void None %54
+         %55 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/while_robustness.wgsl.expected.glsl b/test/tint/loops/while_robustness.wgsl.expected.glsl
index 2280d1b..7493c94 100644
--- a/test/tint/loops/while_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/while_robustness.wgsl.expected.glsl
@@ -12,7 +12,8 @@
       } else {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
diff --git a/test/tint/loops/while_robustness.wgsl.expected.spvasm b/test/tint/loops/while_robustness.wgsl.expected.spvasm
index b26011f..cde37f7 100644
--- a/test/tint/loops/while_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/while_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 53
+; Bound: 56
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,7 +31,7 @@
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-         %51 = OpTypeFunction %void
+         %54 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function %7
@@ -60,28 +60,31 @@
                OpBranch %12
          %31 = OpLabel
          %33 = OpLoad %int %i None
-         %34 = OpIAdd %int %33 %int_1
-               OpStore %i %34 None
+         %34 = OpBitcast %uint %33
+         %35 = OpBitcast %uint %int_1
+         %37 = OpIAdd %uint %34 %35
+         %38 = OpBitcast %int %37
+               OpStore %i %38 None
                OpBranch %10
          %10 = OpLabel
-         %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %39 = OpLoad %uint %36 None
-%tint_low_inc = OpISub %uint %39 %uint_1
-         %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %42 %tint_low_inc None
-         %43 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %43 %uint_1 %uint_0
-         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %46 = OpLoad %uint %45 None
-         %47 = OpISub %uint %46 %tint_carry
+         %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %42 = OpLoad %uint %39 None
+%tint_low_inc = OpISub %uint %42 %uint_1
+         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %45 %tint_low_inc None
+         %46 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %46 %uint_1 %uint_0
          %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %48 %47 None
+         %49 = OpLoad %uint %48 None
+         %50 = OpISub %uint %49 %tint_carry
+         %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %51 %50 None
                OpBranch %11
          %12 = OpLabel
          %13 = OpLoad %int %i None
                OpReturnValue %13
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %51
-         %52 = OpLabel
+%unused_entry_point = OpFunction %void None %54
+         %55 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/while_with_continue.wgsl.expected.glsl b/test/tint/loops/while_with_continue.wgsl.expected.glsl
index 2280d1b..7493c94 100644
--- a/test/tint/loops/while_with_continue.wgsl.expected.glsl
+++ b/test/tint/loops/while_with_continue.wgsl.expected.glsl
@@ -12,7 +12,8 @@
       } else {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
diff --git a/test/tint/loops/while_with_continue.wgsl.expected.spvasm b/test/tint/loops/while_with_continue.wgsl.expected.spvasm
index b26011f..cde37f7 100644
--- a/test/tint/loops/while_with_continue.wgsl.expected.spvasm
+++ b/test/tint/loops/while_with_continue.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 53
+; Bound: 56
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,7 +31,7 @@
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-         %51 = OpTypeFunction %void
+         %54 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function %7
@@ -60,28 +60,31 @@
                OpBranch %12
          %31 = OpLabel
          %33 = OpLoad %int %i None
-         %34 = OpIAdd %int %33 %int_1
-               OpStore %i %34 None
+         %34 = OpBitcast %uint %33
+         %35 = OpBitcast %uint %int_1
+         %37 = OpIAdd %uint %34 %35
+         %38 = OpBitcast %int %37
+               OpStore %i %38 None
                OpBranch %10
          %10 = OpLabel
-         %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %39 = OpLoad %uint %36 None
-%tint_low_inc = OpISub %uint %39 %uint_1
-         %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %42 %tint_low_inc None
-         %43 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %43 %uint_1 %uint_0
-         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %46 = OpLoad %uint %45 None
-         %47 = OpISub %uint %46 %tint_carry
+         %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %42 = OpLoad %uint %39 None
+%tint_low_inc = OpISub %uint %42 %uint_1
+         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %45 %tint_low_inc None
+         %46 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %46 %uint_1 %uint_0
          %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %48 %47 None
+         %49 = OpLoad %uint %48 None
+         %50 = OpISub %uint %49 %tint_carry
+         %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %51 %50 None
                OpBranch %11
          %12 = OpLabel
          %13 = OpLoad %int %i None
                OpReturnValue %13
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %51
-         %52 = OpLabel
+%unused_entry_point = OpFunction %void None %54
+         %55 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/loops/while_with_continue_robustness.wgsl.expected.glsl b/test/tint/loops/while_with_continue_robustness.wgsl.expected.glsl
index 2280d1b..7493c94 100644
--- a/test/tint/loops/while_with_continue_robustness.wgsl.expected.glsl
+++ b/test/tint/loops/while_with_continue_robustness.wgsl.expected.glsl
@@ -12,7 +12,8 @@
       } else {
         break;
       }
-      i = (i + 1);
+      uint v = uint(i);
+      i = int((v + uint(1)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
diff --git a/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm b/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm
index b26011f..cde37f7 100644
--- a/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 53
+; Bound: 56
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -31,7 +31,7 @@
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
        %void = OpTypeVoid
-         %51 = OpTypeFunction %void
+         %54 = OpTypeFunction %void
           %f = OpFunction %int None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function %7
@@ -60,28 +60,31 @@
                OpBranch %12
          %31 = OpLabel
          %33 = OpLoad %int %i None
-         %34 = OpIAdd %int %33 %int_1
-               OpStore %i %34 None
+         %34 = OpBitcast %uint %33
+         %35 = OpBitcast %uint %int_1
+         %37 = OpIAdd %uint %34 %35
+         %38 = OpBitcast %int %37
+               OpStore %i %38 None
                OpBranch %10
          %10 = OpLabel
-         %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %39 = OpLoad %uint %36 None
-%tint_low_inc = OpISub %uint %39 %uint_1
-         %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %42 %tint_low_inc None
-         %43 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %43 %uint_1 %uint_0
-         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %46 = OpLoad %uint %45 None
-         %47 = OpISub %uint %46 %tint_carry
+         %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %42 = OpLoad %uint %39 None
+%tint_low_inc = OpISub %uint %42 %uint_1
+         %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %45 %tint_low_inc None
+         %46 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %46 %uint_1 %uint_0
          %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %48 %47 None
+         %49 = OpLoad %uint %48 None
+         %50 = OpISub %uint %49 %tint_carry
+         %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %51 %50 None
                OpBranch %11
          %12 = OpLabel
          %13 = OpLoad %int %i None
                OpReturnValue %13
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %51
-         %52 = OpLabel
+%unused_entry_point = OpFunction %void None %54
+         %55 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/global/i32.wgsl.expected.glsl b/test/tint/ptr_ref/load/global/i32.wgsl.expected.glsl
index 0adb927..6cb80a8 100644
--- a/test/tint/ptr_ref/load/global/i32.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/global/i32.wgsl.expected.glsl
@@ -4,5 +4,6 @@
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   int i = I;
-  int u = (i + 1);
+  uint v = uint(i);
+  int u = int((v + uint(1)));
 }
diff --git a/test/tint/ptr_ref/load/global/i32.wgsl.expected.spvasm b/test/tint/ptr_ref/load/global/i32.wgsl.expected.spvasm
index 8280edc..814d366 100644
--- a/test/tint/ptr_ref/load/global/i32.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/global/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 12
+; Bound: 16
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,10 +17,14 @@
           %I = OpVariable %_ptr_Private_int Private %4
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %7
           %8 = OpLabel
           %i = OpLoad %int %I None
-          %u = OpIAdd %int %i %int_1
+         %11 = OpBitcast %uint %i
+         %12 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %11 %12
+          %u = OpBitcast %int %14
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/local/i32.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/i32.wgsl.expected.glsl
index 25381ce..ea2c704 100644
--- a/test/tint/ptr_ref/load/local/i32.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/i32.wgsl.expected.glsl
@@ -3,5 +3,6 @@
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   int i = 123;
-  int u = (i + 1);
+  uint v = uint(i);
+  int u = int((v + uint(1)));
 }
diff --git a/test/tint/ptr_ref/load/local/i32.wgsl.expected.spvasm b/test/tint/ptr_ref/load/local/i32.wgsl.expected.spvasm
index f2889ac..a06d697 100644
--- a/test/tint/ptr_ref/load/local/i32.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/local/i32.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 12
+; Bound: 16
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,12 +15,16 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
     %int_123 = OpConstant %int 123
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function
                OpStore %i %int_123
           %9 = OpLoad %int %i None
-          %u = OpIAdd %int %9 %int_1
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %11 %12
+          %u = OpBitcast %int %14
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.glsl
index 25381ce..ea2c704 100644
--- a/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.glsl
@@ -3,5 +3,6 @@
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   int i = 123;
-  int u = (i + 1);
+  uint v = uint(i);
+  int u = int((v + uint(1)));
 }
diff --git a/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.spvasm b/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.spvasm
index 72e6abf..c1204e5 100644
--- a/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/local/ptr_function.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 12
+; Bound: 16
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,12 +16,16 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
     %int_123 = OpConstant %int 123
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function
                OpStore %i %int_123
           %9 = OpLoad %int %i None
-          %u = OpIAdd %int %9 %int_1
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %11 %12
+          %u = OpBitcast %int %14
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.glsl
index c1b85c7..d779074 100644
--- a/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.glsl
@@ -3,5 +3,6 @@
 int i = 123;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  int u = (i + 1);
+  uint v = uint(i);
+  int u = int((v + uint(1)));
 }
diff --git a/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.spvasm b/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.spvasm
index c068d87..76b6cc3 100644
--- a/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 12
+; Bound: 16
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,10 +17,14 @@
           %i = OpVariable %_ptr_Private_int Private %int_123
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %7
           %8 = OpLabel
           %9 = OpLoad %int %i None
-          %u = OpIAdd %int %9 %int_1
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %11 %12
+          %u = OpBitcast %int %14
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl
index 8c87d98..0ecfe7b 100644
--- a/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl
@@ -11,5 +11,6 @@
 } v_1;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  int u = (v_1.inner.a + 1);
+  uint v_2 = uint(v_1.inner.a);
+  int u = int((v_2 + uint(1)));
 }
diff --git a/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.spvasm b/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.spvasm
index 059cb5c..408fb21 100644
--- a/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 17
+; Bound: 20
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -35,6 +35,9 @@
           %9 = OpLabel
           %p = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
          %14 = OpLoad %int %p None
-          %u = OpIAdd %int %14 %int_1
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+          %u = OpBitcast %int %18
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl
index 8efd233..393639f 100644
--- a/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl
@@ -11,5 +11,6 @@
 } v_1;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  int u = (v_1.inner.a + 1);
+  uint v_2 = uint(v_1.inner.a);
+  int u = int((v_2 + uint(1)));
 }
diff --git a/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.spvasm b/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.spvasm
index 2927719..3dde4f5 100644
--- a/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 17
+; Bound: 20
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -35,6 +35,9 @@
           %9 = OpLabel
           %p = OpAccessChain %_ptr_Uniform_int %1 %uint_0 %uint_0
          %14 = OpLoad %int %p None
-          %u = OpIAdd %int %14 %int_1
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_1
+         %18 = OpIAdd %uint %15 %16
+          %u = OpBitcast %int %18
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.glsl
index 47ee968..337ee21 100644
--- a/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.glsl
@@ -7,7 +7,8 @@
   }
   barrier();
   i = 123;
-  int u = (i + 1);
+  uint v = uint(i);
+  int u = int((v + uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.spvasm b/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.spvasm
index 74a2de5..e8f51ea 100644
--- a/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/local/ptr_workgroup.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 30
+; Bound: 33
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -30,7 +30,7 @@
     %int_123 = OpConstant %int 123
       %int_1 = OpConstant %int 1
       %int_0 = OpConstant %int 0
-         %26 = OpTypeFunction %void
+         %29 = OpTypeFunction %void
  %main_inner = OpFunction %void None %10
 %tint_local_index = OpFunctionParameter %uint
          %11 = OpLabel
@@ -44,12 +44,15 @@
                OpControlBarrier %uint_2 %uint_2 %uint_264
                OpStore %i %int_123 None
          %21 = OpLoad %int %i None
-          %u = OpIAdd %int %21 %int_1
+         %22 = OpBitcast %uint %21
+         %23 = OpBitcast %uint %int_1
+         %25 = OpIAdd %uint %22 %23
+          %u = OpBitcast %int %25
                OpReturn
                OpFunctionEnd
-       %main = OpFunction %void None %26
-         %27 = OpLabel
-         %28 = OpLoad %uint %main_local_invocation_index_Input None
-         %29 = OpFunctionCall %void %main_inner %28
+       %main = OpFunction %void None %29
+         %30 = OpLabel
+         %31 = OpLoad %uint %main_local_invocation_index_Input None
+         %32 = OpFunctionCall %void %main_inner %31
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_ref/load/param/ptr.wgsl.expected.glsl b/test/tint/ptr_ref/load/param/ptr.wgsl.expected.glsl
index f5dc821..811775a 100644
--- a/test/tint/ptr_ref/load/param/ptr.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/param/ptr.wgsl.expected.glsl
@@ -1,7 +1,9 @@
 #version 310 es
 
 int func(int value, inout int pointer) {
-  return (value + pointer);
+  int v = pointer;
+  uint v_1 = uint(value);
+  return int((v_1 + uint(v)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/ptr_ref/load/param/ptr.wgsl.expected.spvasm b/test/tint/ptr_ref/load/param/ptr.wgsl.expected.spvasm
index 4d68c3f..fc35e1f 100644
--- a/test/tint/ptr_ref/load/param/ptr.wgsl.expected.spvasm
+++ b/test/tint/ptr_ref/load/param/ptr.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 22
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,22 +16,26 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
           %6 = OpTypeFunction %int %int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
        %void = OpTypeVoid
-         %12 = OpTypeFunction %void
+         %16 = OpTypeFunction %void
     %int_123 = OpConstant %int 123
        %func = OpFunction %int None %6
       %value = OpFunctionParameter %int
 %pointer_root = OpFunctionParameter %_ptr_Function_int
           %7 = OpLabel
           %8 = OpLoad %int %pointer_root None
-          %9 = OpIAdd %int %value %8
-               OpReturnValue %9
+         %10 = OpBitcast %uint %value
+         %11 = OpBitcast %uint %8
+         %12 = OpIAdd %uint %10 %11
+         %13 = OpBitcast %int %12
+               OpReturnValue %13
                OpFunctionEnd
-       %main = OpFunction %void None %12
-         %13 = OpLabel
+       %main = OpFunction %void None %16
+         %17 = OpLabel
           %i = OpVariable %_ptr_Function_int Function
                OpStore %i %int_123
-         %16 = OpLoad %int %i None
-          %r = OpFunctionCall %int %func %16 %i
+         %20 = OpLoad %int %i None
+          %r = OpFunctionCall %int %func %20 %i
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.glsl b/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.glsl
index b6d4cff..07e2935 100644
--- a/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.glsl
+++ b/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.glsl
@@ -2,19 +2,23 @@
 
 void deref() {
   ivec3 a = ivec3(0);
-  a.x = (a.x + 42);
+  uint v = uint(a.x);
+  a.x = int((v + uint(42)));
 }
 void no_deref() {
   ivec3 a = ivec3(0);
-  a.x = (a.x + 42);
+  uint v_1 = uint(a.x);
+  a.x = int((v_1 + uint(42)));
 }
 void deref_inc() {
   ivec3 a = ivec3(0);
-  a.x = (a.x + 1);
+  uint v_2 = uint(a.x);
+  a.x = int((v_2 + uint(1)));
 }
 void no_deref_inc() {
   ivec3 a = ivec3(0);
-  a.x = (a.x + 1);
+  uint v_3 = uint(a.x);
+  a.x = int((v_3 + uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.spvasm b/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.spvasm
index 1a48662..284a7c7 100644
--- a/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.spvasm
+++ b/test/tint/ptr_sugar/compound_assign_index.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 46
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,46 +36,58 @@
           %a = OpVariable %_ptr_Function_v3int Function %9
          %10 = OpAccessChain %_ptr_Function_int %a %uint_0
          %14 = OpLoad %int %10 None
-         %15 = OpIAdd %int %14 %int_42
-         %17 = OpAccessChain %_ptr_Function_int %a %uint_0
-               OpStore %17 %15 None
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_42
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+         %20 = OpAccessChain %_ptr_Function_int %a %uint_0
+               OpStore %20 %19 None
                OpReturn
                OpFunctionEnd
    %no_deref = OpFunction %void None %3
-         %19 = OpLabel
+         %22 = OpLabel
         %a_0 = OpVariable %_ptr_Function_v3int Function %9
-         %21 = OpAccessChain %_ptr_Function_int %a_0 %uint_0
-         %22 = OpLoad %int %21 None
-         %23 = OpIAdd %int %22 %int_42
          %24 = OpAccessChain %_ptr_Function_int %a_0 %uint_0
-               OpStore %24 %23 None
+         %25 = OpLoad %int %24 None
+         %26 = OpBitcast %uint %25
+         %27 = OpBitcast %uint %int_42
+         %28 = OpIAdd %uint %26 %27
+         %29 = OpBitcast %int %28
+         %30 = OpAccessChain %_ptr_Function_int %a_0 %uint_0
+               OpStore %30 %29 None
                OpReturn
                OpFunctionEnd
   %deref_inc = OpFunction %void None %3
-         %26 = OpLabel
+         %32 = OpLabel
         %a_1 = OpVariable %_ptr_Function_v3int Function %9
-         %28 = OpAccessChain %_ptr_Function_int %a_1 %uint_0
-         %29 = OpLoad %int %28 None
-         %30 = OpIAdd %int %29 %int_1
-         %32 = OpAccessChain %_ptr_Function_int %a_1 %uint_0
-               OpStore %32 %30 None
+         %34 = OpAccessChain %_ptr_Function_int %a_1 %uint_0
+         %35 = OpLoad %int %34 None
+         %36 = OpBitcast %uint %35
+         %37 = OpBitcast %uint %int_1
+         %39 = OpIAdd %uint %36 %37
+         %40 = OpBitcast %int %39
+         %41 = OpAccessChain %_ptr_Function_int %a_1 %uint_0
+               OpStore %41 %40 None
                OpReturn
                OpFunctionEnd
 %no_deref_inc = OpFunction %void None %3
-         %34 = OpLabel
+         %43 = OpLabel
         %a_2 = OpVariable %_ptr_Function_v3int Function %9
-         %36 = OpAccessChain %_ptr_Function_int %a_2 %uint_0
-         %37 = OpLoad %int %36 None
-         %38 = OpIAdd %int %37 %int_1
-         %39 = OpAccessChain %_ptr_Function_int %a_2 %uint_0
-               OpStore %39 %38 None
+         %45 = OpAccessChain %_ptr_Function_int %a_2 %uint_0
+         %46 = OpLoad %int %45 None
+         %47 = OpBitcast %uint %46
+         %48 = OpBitcast %uint %int_1
+         %49 = OpIAdd %uint %47 %48
+         %50 = OpBitcast %int %49
+         %51 = OpAccessChain %_ptr_Function_int %a_2 %uint_0
+               OpStore %51 %50 None
                OpReturn
                OpFunctionEnd
        %main = OpFunction %void None %3
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %deref
-         %43 = OpFunctionCall %void %no_deref
-         %44 = OpFunctionCall %void %deref_inc
-         %45 = OpFunctionCall %void %no_deref_inc
+         %53 = OpLabel
+         %54 = OpFunctionCall %void %deref
+         %55 = OpFunctionCall %void %no_deref
+         %56 = OpFunctionCall %void %deref_inc
+         %57 = OpFunctionCall %void %no_deref_inc
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.glsl b/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.glsl
index b8f2865..bdd8751 100644
--- a/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.glsl
+++ b/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.glsl
@@ -2,11 +2,13 @@
 
 void deref() {
   ivec3 a = ivec3(0);
-  a.x = (a.x + 42);
+  uint v = uint(a.x);
+  a.x = int((v + uint(42)));
 }
 void no_deref() {
   ivec3 a = ivec3(0);
-  a.x = (a.x + 42);
+  uint v_1 = uint(a.x);
+  a.x = int((v_1 + uint(42)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.spvasm b/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.spvasm
index 0119c96..90effc4 100644
--- a/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.spvasm
+++ b/test/tint/ptr_sugar/compound_assign_member.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 29
+; Bound: 35
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -29,24 +29,30 @@
           %a = OpVariable %_ptr_Function_v3int Function %9
          %10 = OpAccessChain %_ptr_Function_int %a %uint_0
          %14 = OpLoad %int %10 None
-         %15 = OpIAdd %int %14 %int_42
-         %17 = OpAccessChain %_ptr_Function_int %a %uint_0
-               OpStore %17 %15 None
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_42
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+         %20 = OpAccessChain %_ptr_Function_int %a %uint_0
+               OpStore %20 %19 None
                OpReturn
                OpFunctionEnd
    %no_deref = OpFunction %void None %3
-         %19 = OpLabel
+         %22 = OpLabel
         %a_0 = OpVariable %_ptr_Function_v3int Function %9
-         %21 = OpAccessChain %_ptr_Function_int %a_0 %uint_0
-         %22 = OpLoad %int %21 None
-         %23 = OpIAdd %int %22 %int_42
          %24 = OpAccessChain %_ptr_Function_int %a_0 %uint_0
-               OpStore %24 %23 None
+         %25 = OpLoad %int %24 None
+         %26 = OpBitcast %uint %25
+         %27 = OpBitcast %uint %int_42
+         %28 = OpIAdd %uint %26 %27
+         %29 = OpBitcast %int %28
+         %30 = OpAccessChain %_ptr_Function_int %a_0 %uint_0
+               OpStore %30 %29 None
                OpReturn
                OpFunctionEnd
        %main = OpFunction %void None %3
-         %26 = OpLabel
-         %27 = OpFunctionCall %void %deref
-         %28 = OpFunctionCall %void %no_deref
+         %32 = OpLabel
+         %33 = OpFunctionCall %void %deref
+         %34 = OpFunctionCall %void %no_deref
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/samples/compute_boids.wgsl.expected.glsl b/test/tint/samples/compute_boids.wgsl.expected.glsl
index 4d9b07d..8c2cc88 100644
--- a/test/tint/samples/compute_boids.wgsl.expected.glsl
+++ b/test/tint/samples/compute_boids.wgsl.expected.glsl
@@ -102,14 +102,16 @@
       vel = v_1.inner.particles[v_7].vel.xy;
       if ((distance(pos, vPos) < v.inner.rule1Distance)) {
         cMass = (cMass + pos);
-        cMassCount = (cMassCount + 1);
+        uint v_8 = uint(cMassCount);
+        cMassCount = int((v_8 + uint(1)));
       }
       if ((distance(pos, vPos) < v.inner.rule2Distance)) {
         colVel = (colVel - (pos - vPos));
       }
       if ((distance(pos, vPos) < v.inner.rule3Distance)) {
         cVel = (cVel + vel);
-        cVelCount = (cVelCount + 1);
+        uint v_9 = uint(cVelCount);
+        cVelCount = int((v_9 + uint(1)));
       }
       {
         i = (i + 1u);
@@ -118,15 +120,15 @@
     }
   }
   if ((cMassCount > 0)) {
-    vec2 v_8 = cMass;
-    float v_9 = float(cMassCount);
-    vec2 v_10 = (v_8 / vec2(v_9, float(cMassCount)));
-    cMass = (v_10 - vPos);
+    vec2 v_10 = cMass;
+    float v_11 = float(cMassCount);
+    vec2 v_12 = (v_10 / vec2(v_11, float(cMassCount)));
+    cMass = (v_12 - vPos);
   }
   if ((cVelCount > 0)) {
-    vec2 v_11 = cVel;
-    float v_12 = float(cVelCount);
-    cVel = (v_11 / vec2(v_12, float(cVelCount)));
+    vec2 v_13 = cVel;
+    float v_14 = float(cVelCount);
+    cVel = (v_13 / vec2(v_14, float(cVelCount)));
   }
   vVel = (((vVel + (cMass * v.inner.rule1Scale)) + (colVel * v.inner.rule2Scale)) + (cVel * v.inner.rule3Scale));
   vVel = (normalize(vVel) * clamp(length(vVel), 0.0f, 0.10000000149011611938f));
@@ -143,10 +145,10 @@
   if ((vPos.y > 1.0f)) {
     vPos.y = -1.0f;
   }
-  uint v_13 = min(index, 4u);
-  v_2.inner.particles[v_13].pos = vPos;
-  uint v_14 = min(index, 4u);
-  v_2.inner.particles[v_14].vel = vVel;
+  uint v_15 = min(index, 4u);
+  v_2.inner.particles[v_15].pos = vPos;
+  uint v_16 = min(index, 4u);
+  v_2.inner.particles[v_16].vel = vVel;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/samples/compute_boids.wgsl.expected.spvasm b/test/tint/samples/compute_boids.wgsl.expected.spvasm
index dbea510..ec040e6 100644
--- a/test/tint/samples/compute_boids.wgsl.expected.spvasm
+++ b/test/tint/samples/compute_boids.wgsl.expected.spvasm
@@ -133,7 +133,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 226
+; Bound: 232
 ; Schema: 0
                OpCapability Shader
          %36 = OpExtInstImport "GLSL.std.450"
@@ -244,7 +244,7 @@
      %uint_2 = OpConstant %uint 2
      %uint_3 = OpConstant %uint 3
       %int_1 = OpConstant %int 1
-        %222 = OpTypeFunction %void
+        %228 = OpTypeFunction %void
 %comp_main_inner = OpFunction %void None %24
 %gl_GlobalInvocationID = OpFunctionParameter %v3uint
          %25 = OpLabel
@@ -332,8 +332,11 @@
         %207 = OpFAdd %v2float %205 %206
                OpStore %cMass %207 None
         %208 = OpLoad %int %cMassCount None
-        %209 = OpIAdd %int %208 %int_1
-               OpStore %cMassCount %209 None
+        %209 = OpBitcast %uint %208
+        %210 = OpBitcast %uint %int_1
+        %212 = OpIAdd %uint %209 %210
+        %213 = OpBitcast %int %212
+               OpStore %cMassCount %213 None
                OpBranch %163
         %163 = OpLabel
         %165 = OpLoad %v2float %pos None
@@ -345,12 +348,12 @@
                OpSelectionMerge %172 None
                OpBranchConditional %171 %173 %172
         %173 = OpLabel
-        %211 = OpLoad %v2float %colVel None
-        %212 = OpLoad %v2float %pos None
-        %213 = OpLoad %v2float %vPos None
-        %214 = OpFSub %v2float %212 %213
-        %215 = OpFSub %v2float %211 %214
-               OpStore %colVel %215 None
+        %214 = OpLoad %v2float %colVel None
+        %215 = OpLoad %v2float %pos None
+        %216 = OpLoad %v2float %vPos None
+        %217 = OpFSub %v2float %215 %216
+        %218 = OpFSub %v2float %214 %217
+               OpStore %colVel %218 None
                OpBranch %172
         %172 = OpLabel
         %174 = OpLoad %v2float %pos None
@@ -362,13 +365,16 @@
                OpSelectionMerge %181 None
                OpBranchConditional %180 %182 %181
         %182 = OpLabel
-        %216 = OpLoad %v2float %cVel None
-        %217 = OpLoad %v2float %vel None
-        %218 = OpFAdd %v2float %216 %217
-               OpStore %cVel %218 None
-        %219 = OpLoad %int %cVelCount None
-        %220 = OpIAdd %int %219 %int_1
-               OpStore %cVelCount %220 None
+        %219 = OpLoad %v2float %cVel None
+        %220 = OpLoad %v2float %vel None
+        %221 = OpFAdd %v2float %219 %220
+               OpStore %cVel %221 None
+        %222 = OpLoad %int %cVelCount None
+        %223 = OpBitcast %uint %222
+        %224 = OpBitcast %uint %int_1
+        %225 = OpIAdd %uint %223 %224
+        %226 = OpBitcast %int %225
+               OpStore %cVelCount %226 None
                OpBranch %181
         %181 = OpLabel
                OpBranch %63
@@ -493,9 +499,9 @@
                OpStore %135 %136 None
                OpReturn
                OpFunctionEnd
-  %comp_main = OpFunction %void None %222
-        %223 = OpLabel
-        %224 = OpLoad %v3uint %comp_main_global_invocation_id_Input None
-        %225 = OpFunctionCall %void %comp_main_inner %224
+  %comp_main = OpFunction %void None %228
+        %229 = OpLabel
+        %230 = OpLoad %v3uint %comp_main_global_invocation_id_Input None
+        %231 = OpFunctionCall %void %comp_main_inner %230
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.glsl b/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.glsl
index 2381b4e..4ff3720 100644
--- a/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.glsl
+++ b/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.glsl
@@ -67,14 +67,16 @@
       vel = v_1.inner.particles[v_7].vel.xy;
       if ((distance(pos, vPos) < v.inner.rule1Distance)) {
         cMass = (cMass + pos);
-        cMassCount = (cMassCount + 1);
+        uint v_8 = uint(cMassCount);
+        cMassCount = int((v_8 + uint(1)));
       }
       if ((distance(pos, vPos) < v.inner.rule2Distance)) {
         colVel = (colVel - (pos - vPos));
       }
       if ((distance(pos, vPos) < v.inner.rule3Distance)) {
         cVel = (cVel + vel);
-        cVelCount = (cVelCount + 1);
+        uint v_9 = uint(cVelCount);
+        cVelCount = int((v_9 + uint(1)));
       }
       {
         i = (i + 1u);
@@ -83,15 +85,15 @@
     }
   }
   if ((cMassCount > 0)) {
-    vec2 v_8 = cMass;
-    float v_9 = float(cMassCount);
-    vec2 v_10 = (v_8 / vec2(v_9, float(cMassCount)));
-    cMass = (v_10 - vPos);
+    vec2 v_10 = cMass;
+    float v_11 = float(cMassCount);
+    vec2 v_12 = (v_10 / vec2(v_11, float(cMassCount)));
+    cMass = (v_12 - vPos);
   }
   if ((cVelCount > 0)) {
-    vec2 v_11 = cVel;
-    float v_12 = float(cVelCount);
-    cVel = (v_11 / vec2(v_12, float(cVelCount)));
+    vec2 v_13 = cVel;
+    float v_14 = float(cVelCount);
+    cVel = (v_13 / vec2(v_14, float(cVelCount)));
   }
   vVel = (((vVel + (cMass * v.inner.rule1Scale)) + (colVel * v.inner.rule2Scale)) + (cVel * v.inner.rule3Scale));
   vVel = (normalize(vVel) * clamp(length(vVel), 0.0f, 0.10000000149011611938f));
@@ -108,10 +110,10 @@
   if ((vPos.y > 1.0f)) {
     vPos.y = -1.0f;
   }
-  uint v_13 = min(index, 4u);
-  v_2.inner.particles[v_13].pos = vPos;
-  uint v_14 = min(index, 4u);
-  v_2.inner.particles[v_14].vel = vVel;
+  uint v_15 = min(index, 4u);
+  v_2.inner.particles[v_15].pos = vPos;
+  uint v_16 = min(index, 4u);
+  v_2.inner.particles[v_16].vel = vVel;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.spvasm b/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.spvasm
index 4698914..70109d5 100644
--- a/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.spvasm
+++ b/test/tint/samples/compute_boids_arg_buffer.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 226
+; Bound: 232
 ; Schema: 0
                OpCapability Shader
          %36 = OpExtInstImport "GLSL.std.450"
@@ -112,7 +112,7 @@
      %uint_2 = OpConstant %uint 2
      %uint_3 = OpConstant %uint 3
       %int_1 = OpConstant %int 1
-        %222 = OpTypeFunction %void
+        %228 = OpTypeFunction %void
 %comp_main_inner = OpFunction %void None %24
 %gl_GlobalInvocationID = OpFunctionParameter %v3uint
          %25 = OpLabel
@@ -200,8 +200,11 @@
         %207 = OpFAdd %v2float %205 %206
                OpStore %cMass %207 None
         %208 = OpLoad %int %cMassCount None
-        %209 = OpIAdd %int %208 %int_1
-               OpStore %cMassCount %209 None
+        %209 = OpBitcast %uint %208
+        %210 = OpBitcast %uint %int_1
+        %212 = OpIAdd %uint %209 %210
+        %213 = OpBitcast %int %212
+               OpStore %cMassCount %213 None
                OpBranch %163
         %163 = OpLabel
         %165 = OpLoad %v2float %pos None
@@ -213,12 +216,12 @@
                OpSelectionMerge %172 None
                OpBranchConditional %171 %173 %172
         %173 = OpLabel
-        %211 = OpLoad %v2float %colVel None
-        %212 = OpLoad %v2float %pos None
-        %213 = OpLoad %v2float %vPos None
-        %214 = OpFSub %v2float %212 %213
-        %215 = OpFSub %v2float %211 %214
-               OpStore %colVel %215 None
+        %214 = OpLoad %v2float %colVel None
+        %215 = OpLoad %v2float %pos None
+        %216 = OpLoad %v2float %vPos None
+        %217 = OpFSub %v2float %215 %216
+        %218 = OpFSub %v2float %214 %217
+               OpStore %colVel %218 None
                OpBranch %172
         %172 = OpLabel
         %174 = OpLoad %v2float %pos None
@@ -230,13 +233,16 @@
                OpSelectionMerge %181 None
                OpBranchConditional %180 %182 %181
         %182 = OpLabel
-        %216 = OpLoad %v2float %cVel None
-        %217 = OpLoad %v2float %vel None
-        %218 = OpFAdd %v2float %216 %217
-               OpStore %cVel %218 None
-        %219 = OpLoad %int %cVelCount None
-        %220 = OpIAdd %int %219 %int_1
-               OpStore %cVelCount %220 None
+        %219 = OpLoad %v2float %cVel None
+        %220 = OpLoad %v2float %vel None
+        %221 = OpFAdd %v2float %219 %220
+               OpStore %cVel %221 None
+        %222 = OpLoad %int %cVelCount None
+        %223 = OpBitcast %uint %222
+        %224 = OpBitcast %uint %int_1
+        %225 = OpIAdd %uint %223 %224
+        %226 = OpBitcast %int %225
+               OpStore %cVelCount %226 None
                OpBranch %181
         %181 = OpLabel
                OpBranch %63
@@ -361,9 +367,9 @@
                OpStore %135 %136 None
                OpReturn
                OpFunctionEnd
-  %comp_main = OpFunction %void None %222
-        %223 = OpLabel
-        %224 = OpLoad %v3uint %comp_main_global_invocation_id_Input None
-        %225 = OpFunctionCall %void %comp_main_inner %224
+  %comp_main = OpFunction %void None %228
+        %229 = OpLabel
+        %230 = OpLoad %v3uint %comp_main_global_invocation_id_Input None
+        %231 = OpFunctionCall %void %comp_main_inner %230
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/shadowing/loop.wgsl.expected.glsl b/test/tint/shadowing/loop.wgsl.expected.glsl
index 6cb8f46..156fcdd 100644
--- a/test/tint/shadowing/loop.wgsl.expected.glsl
+++ b/test/tint/shadowing/loop.wgsl.expected.glsl
@@ -22,7 +22,9 @@
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
         uint v_2 = min(uint(x), 9u);
         int x_1 = v.inner[v_2];
-        i = (i + x_1);
+        int v_3 = x_1;
+        uint v_4 = uint(i);
+        i = int((v_4 + uint(v_3)));
         if ((i > 10)) { break; }
       }
       continue;
diff --git a/test/tint/shadowing/loop.wgsl.expected.spvasm b/test/tint/shadowing/loop.wgsl.expected.spvasm
index 9227000..bbc659a 100644
--- a/test/tint/shadowing/loop.wgsl.expected.spvasm
+++ b/test/tint/shadowing/loop.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 69
+; Bound: 72
 ; Schema: 0
                OpCapability Shader
          %40 = OpExtInstImport "GLSL.std.450"
@@ -98,11 +98,14 @@
                OpStore %x_0 %61
          %63 = OpLoad %int %x_0 None
          %64 = OpLoad %int %i None
-         %65 = OpIAdd %int %64 %63
-               OpStore %i %65 None
-         %66 = OpLoad %int %i None
-         %67 = OpSGreaterThan %bool %66 %int_10
-               OpBranchConditional %67 %19 %18
+         %65 = OpBitcast %uint %64
+         %66 = OpBitcast %uint %63
+         %67 = OpIAdd %uint %65 %66
+         %68 = OpBitcast %int %67
+               OpStore %i %68 None
+         %69 = OpLoad %int %i None
+         %70 = OpSGreaterThan %bool %69 %int_10
+               OpBranchConditional %70 %19 %18
          %19 = OpLabel
          %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
          %23 = OpLoad %int %i None
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl
index c3ae2f0..82dc51e 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl
@@ -31,7 +31,8 @@
       uint v_2 = min(v_1.inner.i, 7u);
       s1.a1[v_2] = v;
       {
-        i = (i + 1);
+        uint v_3 = uint(i);
+        i = int((v_3 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.spvasm b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.spvasm
index b6c00d5..d29ea96 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.spvasm
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 47
+; Bound: 50
 ; Schema: 0
                OpCapability Shader
          %40 = OpExtInstImport "GLSL.std.450"
@@ -79,8 +79,11 @@
                OpBranch %23
          %23 = OpLabel
          %44 = OpLoad %int %i None
-         %45 = OpIAdd %int %44 %int_1
-               OpStore %i %45 None
+         %45 = OpBitcast %uint %44
+         %46 = OpBitcast %uint %int_1
+         %48 = OpIAdd %uint %45 %46
+         %49 = OpBitcast %int %48
+               OpStore %i %49 None
                OpBranch %24
          %25 = OpLabel
                OpReturn
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl
index cd16bc6..f6b909e 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl
@@ -32,14 +32,15 @@
       } else {
         break;
       }
-      i = (i + 1);
+      uint v_2 = uint(i);
+      i = int((v_2 + uint(1)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        uint v_2 = min(v_1.inner.i, 7u);
-        s1.a1[v_2] = v;
+        uint v_3 = min(v_1.inner.i, 7u);
+        s1.a1[v_3] = v;
       }
       continue;
     }
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm
index 743f225..92264bb 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 71
+; Bound: 74
 ; Schema: 0
                OpCapability Shader
-         %67 = OpExtInstImport "GLSL.std.450"
+         %70 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
@@ -92,28 +92,31 @@
                OpBranch %25
          %45 = OpLabel
          %47 = OpLoad %int %i None
-         %48 = OpIAdd %int %47 %int_1
-               OpStore %i %48 None
+         %48 = OpBitcast %uint %47
+         %49 = OpBitcast %uint %int_1
+         %51 = OpIAdd %uint %48 %49
+         %52 = OpBitcast %int %51
+               OpStore %i %52 None
                OpBranch %23
          %23 = OpLabel
-         %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %53 = OpLoad %uint %50 None
-%tint_low_inc = OpISub %uint %53 %uint_1
-         %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %56 %tint_low_inc None
-         %57 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %57 %uint_1 %uint_0
-         %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %60 = OpLoad %uint %59 None
-         %61 = OpISub %uint %60 %tint_carry
+         %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %56 = OpLoad %uint %53 None
+%tint_low_inc = OpISub %uint %56 %uint_1
+         %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %59 %tint_low_inc None
+         %60 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %60 %uint_1 %uint_0
          %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %62 %61 None
-         %63 = OpAccessChain %_ptr_Uniform_uint %1 %uint_0 %uint_0
-         %65 = OpLoad %uint %63 None
-         %66 = OpExtInst %uint %67 UMin %65 %uint_7
-         %69 = OpAccessChain %_ptr_Function_InnerS %s1 %uint_0 %66
-         %70 = OpLoad %InnerS %v None
-               OpStore %69 %70 None
+         %63 = OpLoad %uint %62 None
+         %64 = OpISub %uint %63 %tint_carry
+         %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %65 %64 None
+         %66 = OpAccessChain %_ptr_Uniform_uint %1 %uint_0 %uint_0
+         %68 = OpLoad %uint %66 None
+         %69 = OpExtInst %uint %70 UMin %68 %uint_7
+         %72 = OpAccessChain %_ptr_Function_InnerS %s1 %uint_0 %69
+         %73 = OpLoad %InnerS %v None
+               OpStore %72 %73 None
                OpBranch %24
          %25 = OpLabel
                OpReturn
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl
index 5f49b88..5e9143b 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl
@@ -39,7 +39,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v_3 = uint(i);
+        i = int((v_3 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm
index 4710a86..3adc248 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 71
+; Bound: 74
 ; Schema: 0
                OpCapability Shader
          %39 = OpExtInstImport "GLSL.std.450"
@@ -112,8 +112,11 @@
          %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %67 %66 None
          %68 = OpLoad %int %i None
-         %69 = OpIAdd %int %68 %int_1
-               OpStore %i %69 None
+         %69 = OpBitcast %uint %68
+         %70 = OpBitcast %uint %int_1
+         %72 = OpIAdd %uint %69 %70
+         %73 = OpBitcast %int %72
+               OpStore %i %73 None
                OpBranch %27
          %28 = OpLabel
                OpReturn
diff --git a/test/tint/statements/assign/phony/call.wgsl.expected.glsl b/test/tint/statements/assign/phony/call.wgsl.expected.glsl
index 20f7498..88c40bc 100644
--- a/test/tint/statements/assign/phony/call.wgsl.expected.glsl
+++ b/test/tint/statements/assign/phony/call.wgsl.expected.glsl
@@ -1,7 +1,9 @@
 #version 310 es
 
 int f(int a, int b, int c) {
-  return ((a * b) + c);
+  uint v = uint(a);
+  uint v_1 = uint(int((v * uint(b))));
+  return int((v_1 + uint(c)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/assign/phony/call.wgsl.expected.spvasm b/test/tint/statements/assign/phony/call.wgsl.expected.spvasm
index 37c3756..19a52e8 100644
--- a/test/tint/statements/assign/phony/call.wgsl.expected.spvasm
+++ b/test/tint/statements/assign/phony/call.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 25
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -14,8 +14,9 @@
                OpName %main "main"
         %int = OpTypeInt 32 1
           %6 = OpTypeFunction %int %int %int %int
+       %uint = OpTypeInt 32 0
        %void = OpTypeVoid
-         %12 = OpTypeFunction %void
+         %19 = OpTypeFunction %void
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
       %int_3 = OpConstant %int 3
@@ -24,12 +25,18 @@
           %b = OpFunctionParameter %int
           %c = OpFunctionParameter %int
           %7 = OpLabel
-          %8 = OpIMul %int %a %b
-          %9 = OpIAdd %int %8 %c
-               OpReturnValue %9
+          %9 = OpBitcast %uint %a
+         %10 = OpBitcast %uint %b
+         %11 = OpIMul %uint %9 %10
+         %12 = OpBitcast %int %11
+         %13 = OpBitcast %uint %12
+         %14 = OpBitcast %uint %c
+         %15 = OpIAdd %uint %13 %14
+         %16 = OpBitcast %int %15
+               OpReturnValue %16
                OpFunctionEnd
-       %main = OpFunction %void None %12
-         %13 = OpLabel
-         %14 = OpFunctionCall %int %f %int_1 %int_2 %int_3
+       %main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %f %int_1 %int_2 %int_3
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.glsl b/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.glsl
index 0a272b1..2ff11b5 100644
--- a/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.glsl
+++ b/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.glsl
@@ -1,11 +1,17 @@
 #version 310 es
 
 int f(int a, int b, int c) {
-  return ((a * b) + c);
+  uint v = uint(a);
+  uint v_1 = uint(int((v * uint(b))));
+  return int((v_1 + uint(c)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
-  int v = f(1, 2, 3);
-  int v_1 = f(4, 5, 6);
-  int v_2 = (v + (v_1 * f(7, f(8, 9, 10), 11)));
+  int v_2 = f(1, 2, 3);
+  int v_3 = f(4, 5, 6);
+  int v_4 = f(7, f(8, 9, 10), 11);
+  uint v_5 = uint(v_3);
+  int v_6 = int((v_5 * uint(v_4)));
+  uint v_7 = uint(v_2);
+  int v_8 = int((v_7 + uint(v_6)));
 }
diff --git a/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.spvasm b/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.spvasm
index 6d8eb9e..3dd6f69 100644
--- a/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.spvasm
+++ b/test/tint/statements/assign/phony/multiple_side_effects.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 31
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -14,8 +14,9 @@
                OpName %main "main"
         %int = OpTypeInt 32 1
           %6 = OpTypeFunction %int %int %int %int
+       %uint = OpTypeInt 32 0
        %void = OpTypeVoid
-         %12 = OpTypeFunction %void
+         %19 = OpTypeFunction %void
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
       %int_3 = OpConstant %int 3
@@ -32,17 +33,29 @@
           %b = OpFunctionParameter %int
           %c = OpFunctionParameter %int
           %7 = OpLabel
-          %8 = OpIMul %int %a %b
-          %9 = OpIAdd %int %8 %c
-               OpReturnValue %9
+          %9 = OpBitcast %uint %a
+         %10 = OpBitcast %uint %b
+         %11 = OpIMul %uint %9 %10
+         %12 = OpBitcast %int %11
+         %13 = OpBitcast %uint %12
+         %14 = OpBitcast %uint %c
+         %15 = OpIAdd %uint %13 %14
+         %16 = OpBitcast %int %15
+               OpReturnValue %16
                OpFunctionEnd
-       %main = OpFunction %void None %12
-         %13 = OpLabel
-         %14 = OpFunctionCall %int %f %int_1 %int_2 %int_3
-         %18 = OpFunctionCall %int %f %int_4 %int_5 %int_6
-         %22 = OpFunctionCall %int %f %int_8 %int_9 %int_10
-         %26 = OpFunctionCall %int %f %int_7 %22 %int_11
-         %29 = OpIMul %int %18 %26
-         %30 = OpIAdd %int %14 %29
+       %main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %f %int_1 %int_2 %int_3
+         %25 = OpFunctionCall %int %f %int_4 %int_5 %int_6
+         %29 = OpFunctionCall %int %f %int_8 %int_9 %int_10
+         %33 = OpFunctionCall %int %f %int_7 %29 %int_11
+         %36 = OpBitcast %uint %25
+         %37 = OpBitcast %uint %33
+         %38 = OpIMul %uint %36 %37
+         %39 = OpBitcast %int %38
+         %40 = OpBitcast %uint %21
+         %41 = OpBitcast %uint %39
+         %42 = OpIAdd %uint %40 %41
+         %43 = OpBitcast %int %42
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.glsl b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.glsl
index 7a6a72a..93c1a89 100644
--- a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.glsl
@@ -7,19 +7,22 @@
 
 int counter = 0;
 int foo() {
-  counter = (counter + 1);
+  uint v = uint(counter);
+  counter = int((v + uint(1)));
   return counter;
 }
 int bar() {
-  counter = (counter + 2);
+  uint v_1 = uint(counter);
+  counter = int((v_1 + uint(2)));
   return counter;
 }
-void v() {
+void v_2() {
   S x = S(ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0)));
-  uint v_1 = min(uint(foo()), 3u);
-  int v_2 = bar();
-  int v_3 = (x.a[v_1][min(uint(v_2), 3u)] + 5);
-  x.a[v_1][min(uint(v_2), 3u)] = v_3;
+  uint v_3 = min(uint(foo()), 3u);
+  int v_4 = bar();
+  uint v_5 = uint(x.a[v_3][min(uint(v_4), 3u)]);
+  int v_6 = int((v_5 + uint(5)));
+  x.a[v_3][min(uint(v_4), 3u)] = v_6;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.spvasm b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.spvasm
index aaf23a2..fffba7b 100644
--- a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 51
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
-         %33 = OpExtInstImport "GLSL.std.450"
+         %39 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
                OpExecutionMode %unused_entry_point LocalSize 1 1 1
@@ -22,17 +22,17 @@
           %4 = OpConstantNull %int
     %counter = OpVariable %_ptr_Private_int Private %4
           %6 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
        %void = OpTypeVoid
-         %20 = OpTypeFunction %void
+         %27 = OpTypeFunction %void
       %v4int = OpTypeVector %int 4
-       %uint = OpTypeInt 32 0
      %uint_4 = OpConstant %uint 4
 %_arr_v4int_uint_4 = OpTypeArray %v4int %uint_4
           %S = OpTypeStruct %_arr_v4int_uint_4
 %_ptr_Function_S = OpTypePointer Function %S
-         %29 = OpConstantNull %S
+         %35 = OpConstantNull %S
      %uint_3 = OpConstant %uint 3
 %_ptr_Function_v4int = OpTypePointer Function %v4int
      %uint_0 = OpConstant %uint 0
@@ -41,40 +41,49 @@
         %foo = OpFunction %int None %6
           %7 = OpLabel
           %8 = OpLoad %int %counter None
-          %9 = OpIAdd %int %8 %int_1
-               OpStore %counter %9 None
-         %11 = OpLoad %int %counter None
-               OpReturnValue %11
+         %10 = OpBitcast %uint %8
+         %11 = OpBitcast %uint %int_1
+         %13 = OpIAdd %uint %10 %11
+         %14 = OpBitcast %int %13
+               OpStore %counter %14 None
+         %15 = OpLoad %int %counter None
+               OpReturnValue %15
                OpFunctionEnd
         %bar = OpFunction %int None %6
-         %13 = OpLabel
-         %14 = OpLoad %int %counter None
-         %15 = OpIAdd %int %14 %int_2
-               OpStore %counter %15 None
-         %17 = OpLoad %int %counter None
-               OpReturnValue %17
+         %17 = OpLabel
+         %18 = OpLoad %int %counter None
+         %19 = OpBitcast %uint %18
+         %20 = OpBitcast %uint %int_2
+         %22 = OpIAdd %uint %19 %20
+         %23 = OpBitcast %int %22
+               OpStore %counter %23 None
+         %24 = OpLoad %int %counter None
+               OpReturnValue %24
                OpFunctionEnd
-       %main = OpFunction %void None %20
-         %21 = OpLabel
+       %main = OpFunction %void None %27
+         %28 = OpLabel
           %x = OpVariable %_ptr_Function_S Function
-               OpStore %x %29
-         %30 = OpFunctionCall %int %foo
-         %31 = OpBitcast %uint %30
-         %32 = OpExtInst %uint %33 UMin %31 %uint_3
-         %35 = OpAccessChain %_ptr_Function_v4int %x %uint_0 %32
-         %38 = OpFunctionCall %int %bar
-         %39 = OpBitcast %uint %38
-         %40 = OpExtInst %uint %33 UMin %39 %uint_3
-         %41 = OpAccessChain %_ptr_Function_int %35 %40
-         %43 = OpLoad %int %41 None
-         %44 = OpIAdd %int %43 %int_5
-         %46 = OpBitcast %uint %38
-         %47 = OpExtInst %uint %33 UMin %46 %uint_3
-         %48 = OpAccessChain %_ptr_Function_int %35 %47
-               OpStore %48 %44 None
+               OpStore %x %35
+         %36 = OpFunctionCall %int %foo
+         %37 = OpBitcast %uint %36
+         %38 = OpExtInst %uint %39 UMin %37 %uint_3
+         %41 = OpAccessChain %_ptr_Function_v4int %x %uint_0 %38
+         %44 = OpFunctionCall %int %bar
+         %45 = OpBitcast %uint %44
+         %46 = OpExtInst %uint %39 UMin %45 %uint_3
+         %47 = OpAccessChain %_ptr_Function_int %41 %46
+         %49 = OpLoad %int %47 None
+         %50 = OpBitcast %uint %49
+         %51 = OpBitcast %uint %int_5
+         %53 = OpIAdd %uint %50 %51
+         %54 = OpBitcast %int %53
+         %55 = OpBitcast %uint %44
+         %56 = OpExtInst %uint %39 UMin %55 %uint_3
+         %57 = OpAccessChain %_ptr_Function_int %41 %56
+               OpStore %57 %54 None
                OpReturn
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %20
-         %50 = OpLabel
+%unused_entry_point = OpFunction %void None %27
+         %59 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.glsl b/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.glsl
index 8a2d327..8df1c9e 100644
--- a/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.glsl
@@ -10,23 +10,26 @@
   bool v_1 = bool((v & uint((rhs == -1))));
   uint v_2 = uint((rhs == 0));
   int v_3 = mix(rhs, 1, bool((v_2 | uint(v_1))));
-  return (lhs - ((lhs / v_3) * v_3));
+  uint v_4 = uint((lhs / v_3));
+  int v_5 = int((v_4 * uint(v_3)));
+  uint v_6 = uint(lhs);
+  return int((v_6 - uint(v_5)));
 }
 int tint_div_i32(int lhs, int rhs) {
-  uint v_4 = uint((lhs == (-2147483647 - 1)));
-  bool v_5 = bool((v_4 & uint((rhs == -1))));
-  uint v_6 = uint((rhs == 0));
-  return (lhs / mix(rhs, 1, bool((v_6 | uint(v_5)))));
+  uint v_7 = uint((lhs == (-2147483647 - 1)));
+  bool v_8 = bool((v_7 & uint((rhs == -1))));
+  uint v_9 = uint((rhs == 0));
+  return (lhs / mix(rhs, 1, bool((v_9 | uint(v_8)))));
 }
 void foo(int maybe_zero) {
   a = tint_div_i32(a, maybe_zero);
   a = tint_mod_i32(a, maybe_zero);
   b = (b / 0.0f);
   b = tint_float_modulo(b, 0.0f);
-  float v_7 = float(maybe_zero);
-  b = (b / v_7);
-  float v_8 = float(maybe_zero);
-  b = tint_float_modulo(b, v_8);
+  float v_10 = float(maybe_zero);
+  b = (b / v_10);
+  float v_11 = float(maybe_zero);
+  b = tint_float_modulo(b, v_11);
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.spvasm b/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.spvasm
index 4bc339a..b7fe1ae 100644
--- a/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 62
+; Bound: 69
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -35,7 +35,8 @@
 %int_n2147483648 = OpConstant %int -2147483648
      %int_n1 = OpConstant %int -1
       %int_1 = OpConstant %int 1
-         %60 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+         %67 = OpTypeFunction %void
         %foo = OpFunction %void None %12
  %maybe_zero = OpFunctionParameter %int
          %13 = OpLabel
@@ -85,11 +86,17 @@
          %54 = OpLogicalOr %bool %50 %53
          %55 = OpSelect %int %54 %int_1 %rhs_0
          %56 = OpSDiv %int %lhs_0 %55
-         %57 = OpIMul %int %56 %55
-         %58 = OpISub %int %lhs_0 %57
-               OpReturnValue %58
+         %58 = OpBitcast %uint %56
+         %59 = OpBitcast %uint %55
+         %60 = OpIMul %uint %58 %59
+         %61 = OpBitcast %int %60
+         %62 = OpBitcast %uint %lhs_0
+         %63 = OpBitcast %uint %61
+         %64 = OpISub %uint %62 %63
+         %65 = OpBitcast %int %64
+               OpReturnValue %65
                OpFunctionEnd
-%unused_entry_point = OpFunction %void None %60
-         %61 = OpLabel
+%unused_entry_point = OpFunction %void None %67
+         %68 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl
index 76ce1a9..7df3fc0 100644
--- a/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl
@@ -10,7 +10,8 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a - 2);
+  uint v_2 = uint(v_1.inner.a);
+  v_1.inner.a = int((v_2 - uint(2)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.spvasm b/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.spvasm
index 20abb6c..3f11bac 100644
--- a/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 19
+; Bound: 22
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -34,11 +34,14 @@
           %9 = OpLabel
          %10 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
          %14 = OpLoad %int %10 None
-         %15 = OpISub %int %14 %int_2
-               OpStore %10 %15 None
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_2
+         %18 = OpISub %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %10 %19 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %8
-         %18 = OpLabel
+         %21 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl
index 7876859..07f388a 100644
--- a/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl
@@ -14,7 +14,10 @@
   bool v_3 = bool((v_2 & uint((rhs == -1))));
   uint v_4 = uint((rhs == 0));
   int v_5 = mix(rhs, 1, bool((v_4 | uint(v_3))));
-  return (lhs - ((lhs / v_5) * v_5));
+  uint v_6 = uint((lhs / v_5));
+  int v_7 = int((v_6 * uint(v_5)));
+  uint v_8 = uint(lhs);
+  return int((v_8 - uint(v_7)));
 }
 void foo() {
   v_1.inner.a = tint_mod_i32(v_1.inner.a, 2);
diff --git a/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.spvasm b/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.spvasm
index 6c7c7d5..b54a9cd 100644
--- a/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 38
+; Bound: 44
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -58,11 +58,17 @@
          %30 = OpLogicalOr %bool %22 %29
          %31 = OpSelect %int %30 %int_1 %rhs
          %33 = OpSDiv %int %lhs %31
-         %34 = OpIMul %int %33 %31
-         %35 = OpISub %int %lhs %34
-               OpReturnValue %35
+         %34 = OpBitcast %uint %33
+         %35 = OpBitcast %uint %31
+         %36 = OpIMul %uint %34 %35
+         %37 = OpBitcast %int %36
+         %38 = OpBitcast %uint %lhs
+         %39 = OpBitcast %uint %37
+         %40 = OpISub %uint %38 %39
+         %41 = OpBitcast %int %40
+               OpReturnValue %41
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %8
-         %37 = OpLabel
+         %43 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl
index 4d3f824..67d2371 100644
--- a/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl
@@ -10,7 +10,8 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a + 2);
+  uint v_2 = uint(v_1.inner.a);
+  v_1.inner.a = int((v_2 + uint(2)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.spvasm b/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.spvasm
index f2bc8b6..be59495 100644
--- a/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 19
+; Bound: 22
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -34,11 +34,14 @@
           %9 = OpLabel
          %10 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
          %14 = OpLoad %int %10 None
-         %15 = OpIAdd %int %14 %int_2
-               OpStore %10 %15 None
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_2
+         %18 = OpIAdd %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %10 %19 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %8
-         %18 = OpLabel
+         %21 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl
index cf67c86..8a54da0 100644
--- a/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl
@@ -10,7 +10,7 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a << (2u & 31u));
+  v_1.inner.a = int((uint(v_1.inner.a) << (2u & 31u)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.spvasm b/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.spvasm
index a7d5f5d..3b19cb9 100644
--- a/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 23
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -36,11 +36,13 @@
          %10 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
          %14 = OpLoad %int %10 None
          %15 = OpBitwiseAnd %uint %uint_2 %uint_31
-         %18 = OpShiftLeftLogical %int %14 %15
-               OpStore %10 %18 None
+         %18 = OpBitcast %uint %14
+         %19 = OpShiftLeftLogical %uint %18 %15
+         %20 = OpBitcast %int %19
+               OpStore %10 %20 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %8
-         %20 = OpLabel
+         %22 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl
index bf5957f..fbc2c49 100644
--- a/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl
@@ -10,7 +10,8 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a * 2);
+  uint v_2 = uint(v_1.inner.a);
+  v_1.inner.a = int((v_2 * uint(2)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/scalar/times.wgsl.expected.spvasm b/test/tint/statements/compound_assign/scalar/times.wgsl.expected.spvasm
index 3cfa0cf..ec455c1 100644
--- a/test/tint/statements/compound_assign/scalar/times.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/scalar/times.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 19
+; Bound: 22
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -34,11 +34,14 @@
           %9 = OpLabel
          %10 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
          %14 = OpLoad %int %10 None
-         %15 = OpIMul %int %14 %int_2
-               OpStore %10 %15 None
+         %15 = OpBitcast %uint %14
+         %16 = OpBitcast %uint %int_2
+         %18 = OpIMul %uint %15 %16
+         %19 = OpBitcast %int %18
+               OpStore %10 %19 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %8
-         %18 = OpLabel
+         %21 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl
index 17aa919..ad1e343 100644
--- a/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl
@@ -10,7 +10,8 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a - ivec4(2));
+  uvec4 v_2 = uvec4(v_1.inner.a);
+  v_1.inner.a = ivec4((v_2 - uvec4(ivec4(2))));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/vector/minus.wgsl.expected.spvasm b/test/tint/statements/compound_assign/vector/minus.wgsl.expected.spvasm
index fab704c..4607168 100644
--- a/test/tint/statements/compound_assign/vector/minus.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/vector/minus.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 25
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -30,17 +30,21 @@
 %_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
        %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
+     %v4uint = OpTypeVector %uint 4
       %int_2 = OpConstant %int 2
-         %17 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
+         %19 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
         %foo = OpFunction %void None %9
          %10 = OpLabel
          %11 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %uint_0
          %15 = OpLoad %v4int %11 None
-         %16 = OpISub %v4int %15 %17
-               OpStore %11 %16 None
+         %17 = OpBitcast %v4uint %15
+         %18 = OpBitcast %v4uint %19
+         %21 = OpISub %v4uint %17 %18
+         %22 = OpBitcast %v4int %21
+               OpStore %11 %22 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %9
-         %20 = OpLabel
+         %24 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl
index 9e14fa4..9a4c74e 100644
--- a/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl
@@ -14,11 +14,14 @@
   bvec4 v_3 = bvec4((v_2 & uvec4(equal(rhs, ivec4(-1)))));
   uvec4 v_4 = uvec4(equal(rhs, ivec4(0)));
   ivec4 v_5 = mix(rhs, ivec4(1), bvec4((v_4 | uvec4(v_3))));
-  return (lhs - ((lhs / v_5) * v_5));
+  uvec4 v_6 = uvec4((lhs / v_5));
+  ivec4 v_7 = ivec4((v_6 * uvec4(v_5)));
+  uvec4 v_8 = uvec4(lhs);
+  return ivec4((v_8 - uvec4(v_7)));
 }
 void foo() {
-  ivec4 v_6 = v_1.inner.a;
-  v_1.inner.a = tint_mod_v4i32(v_6, ivec4(2));
+  ivec4 v_9 = v_1.inner.a;
+  v_1.inner.a = tint_mod_v4i32(v_9, ivec4(2));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.spvasm b/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.spvasm
index b669a0d..27db001 100644
--- a/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 51
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -44,6 +44,7 @@
          %32 = OpConstantComposite %v4int %int_n1 %int_n1 %int_n1 %int_n1
       %int_1 = OpConstant %int 1
          %37 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+     %v4uint = OpTypeVector %uint 4
         %foo = OpFunction %void None %9
          %10 = OpLabel
          %11 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %uint_0
@@ -64,11 +65,17 @@
          %35 = OpLogicalOr %v4bool %24 %34
          %36 = OpSelect %v4int %35 %37 %rhs
          %39 = OpSDiv %v4int %lhs %36
-         %40 = OpIMul %v4int %39 %36
-         %41 = OpISub %v4int %lhs %40
-               OpReturnValue %41
+         %41 = OpBitcast %v4uint %39
+         %42 = OpBitcast %v4uint %36
+         %43 = OpIMul %v4uint %41 %42
+         %44 = OpBitcast %v4int %43
+         %45 = OpBitcast %v4uint %lhs
+         %46 = OpBitcast %v4uint %44
+         %47 = OpISub %v4uint %45 %46
+         %48 = OpBitcast %v4int %47
+               OpReturnValue %48
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %9
-         %43 = OpLabel
+         %50 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl
index 2c22851..5022d385 100644
--- a/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl
@@ -14,7 +14,10 @@
   bvec4 v_3 = bvec4((v_2 & uvec4(equal(rhs, ivec4(-1)))));
   uvec4 v_4 = uvec4(equal(rhs, ivec4(0)));
   ivec4 v_5 = mix(rhs, ivec4(1), bvec4((v_4 | uvec4(v_3))));
-  return (lhs - ((lhs / v_5) * v_5));
+  uvec4 v_6 = uvec4((lhs / v_5));
+  ivec4 v_7 = ivec4((v_6 * uvec4(v_5)));
+  uvec4 v_8 = uvec4(lhs);
+  return ivec4((v_8 - uvec4(v_7)));
 }
 void foo() {
   v_1.inner.a = tint_mod_v4i32(v_1.inner.a, ivec4(2));
diff --git a/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.spvasm b/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.spvasm
index a7cfdb7..baa2a4d 100644
--- a/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 51
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -45,6 +45,7 @@
          %32 = OpConstantComposite %v4int %int_n1 %int_n1 %int_n1 %int_n1
       %int_1 = OpConstant %int 1
          %37 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+     %v4uint = OpTypeVector %uint 4
         %foo = OpFunction %void None %9
          %10 = OpLabel
          %11 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %uint_0
@@ -64,11 +65,17 @@
          %35 = OpLogicalOr %v4bool %24 %34
          %36 = OpSelect %v4int %35 %37 %rhs
          %39 = OpSDiv %v4int %lhs %36
-         %40 = OpIMul %v4int %39 %36
-         %41 = OpISub %v4int %lhs %40
-               OpReturnValue %41
+         %41 = OpBitcast %v4uint %39
+         %42 = OpBitcast %v4uint %36
+         %43 = OpIMul %v4uint %41 %42
+         %44 = OpBitcast %v4int %43
+         %45 = OpBitcast %v4uint %lhs
+         %46 = OpBitcast %v4uint %44
+         %47 = OpISub %v4uint %45 %46
+         %48 = OpBitcast %v4int %47
+               OpReturnValue %48
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %9
-         %43 = OpLabel
+         %50 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl
index e43847d..f7c0e1a 100644
--- a/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl
@@ -10,7 +10,8 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a + ivec4(2));
+  uvec4 v_2 = uvec4(v_1.inner.a);
+  v_1.inner.a = ivec4((v_2 + uvec4(ivec4(2))));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/vector/plus.wgsl.expected.spvasm b/test/tint/statements/compound_assign/vector/plus.wgsl.expected.spvasm
index 87c5c77..e7ab783 100644
--- a/test/tint/statements/compound_assign/vector/plus.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/vector/plus.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 25
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -30,17 +30,21 @@
 %_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
        %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
+     %v4uint = OpTypeVector %uint 4
       %int_2 = OpConstant %int 2
-         %17 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
+         %19 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
         %foo = OpFunction %void None %9
          %10 = OpLabel
          %11 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %uint_0
          %15 = OpLoad %v4int %11 None
-         %16 = OpIAdd %v4int %15 %17
-               OpStore %11 %16 None
+         %17 = OpBitcast %v4uint %15
+         %18 = OpBitcast %v4uint %19
+         %21 = OpIAdd %v4uint %17 %18
+         %22 = OpBitcast %v4int %21
+               OpStore %11 %22 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %9
-         %20 = OpLabel
+         %24 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl
index 889fafa..b026dd2 100644
--- a/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl
@@ -10,7 +10,7 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a << (uvec4(2u) & uvec4(31u)));
+  v_1.inner.a = ivec4((uvec4(v_1.inner.a) << (uvec4(2u) & uvec4(31u))));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.spvasm b/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.spvasm
index 98c284b..b862ca2 100644
--- a/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 25
+; Bound: 27
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -40,11 +40,13 @@
          %11 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %uint_0
          %15 = OpLoad %v4int %11 None
          %16 = OpBitwiseAnd %v4uint %17 %20
-         %22 = OpShiftLeftLogical %v4int %15 %16
-               OpStore %11 %22 None
+         %22 = OpBitcast %v4uint %15
+         %23 = OpShiftLeftLogical %v4uint %22 %16
+         %24 = OpBitcast %v4int %23
+               OpStore %11 %24 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %9
-         %24 = OpLabel
+         %26 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl
index 892fba2..28d6b33 100644
--- a/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl
@@ -10,7 +10,8 @@
   S inner;
 } v_1;
 void foo() {
-  v_1.inner.a = (v_1.inner.a * ivec4(2));
+  uvec4 v_2 = uvec4(v_1.inner.a);
+  v_1.inner.a = ivec4((v_2 * uvec4(ivec4(2))));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/compound_assign/vector/times.wgsl.expected.spvasm b/test/tint/statements/compound_assign/vector/times.wgsl.expected.spvasm
index 65fe438..9818576 100644
--- a/test/tint/statements/compound_assign/vector/times.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/vector/times.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 25
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -30,17 +30,21 @@
 %_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
        %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
+     %v4uint = OpTypeVector %uint 4
       %int_2 = OpConstant %int 2
-         %17 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
+         %19 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
         %foo = OpFunction %void None %9
          %10 = OpLabel
          %11 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %uint_0
          %15 = OpLoad %v4int %11 None
-         %16 = OpIMul %v4int %15 %17
-               OpStore %11 %16 None
+         %17 = OpBitcast %v4uint %15
+         %18 = OpBitcast %v4uint %19
+         %21 = OpIMul %v4uint %17 %18
+         %22 = OpBitcast %v4int %21
+               OpStore %11 %22 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %9
-         %20 = OpLabel
+         %24 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/decrement/complex.wgsl.expected.glsl b/test/tint/statements/decrement/complex.wgsl.expected.glsl
index 7cf031d..1fd4509 100644
--- a/test/tint/statements/decrement/complex.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/complex.wgsl.expected.glsl
@@ -43,8 +43,9 @@
     uint v_6 = min(uint(v_3), v_5);
     uint v_7 = min(uint(v_4), 3u);
     int v_8 = idx3();
-    int v_9 = (v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)] - 1);
-    v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)] = v_9;
+    uint v_9 = uint(v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)]);
+    int v_10 = int((v_9 - uint(1)));
+    v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)] = v_10;
     while(true) {
       if (all(equal(tint_loop_idx, uvec2(0u)))) {
         break;
@@ -58,14 +59,15 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        int v_10 = idx4();
-        int v_11 = idx5();
-        uint v_12 = (uint(v_1.inner.length()) - 1u);
-        uint v_13 = min(uint(v_10), v_12);
-        uint v_14 = min(uint(v_11), 3u);
-        int v_15 = idx6();
-        int v_16 = (v_1.inner[v_13].a[v_14][min(uint(v_15), 3u)] - 1);
-        v_1.inner[v_13].a[v_14][min(uint(v_15), 3u)] = v_16;
+        int v_11 = idx4();
+        int v_12 = idx5();
+        uint v_13 = (uint(v_1.inner.length()) - 1u);
+        uint v_14 = min(uint(v_11), v_13);
+        uint v_15 = min(uint(v_12), 3u);
+        int v_16 = idx6();
+        uint v_17 = uint(v_1.inner[v_14].a[v_15][min(uint(v_16), 3u)]);
+        int v_18 = int((v_17 - uint(1)));
+        v_1.inner[v_14].a[v_15][min(uint(v_16), 3u)] = v_18;
       }
       continue;
     }
diff --git a/test/tint/statements/decrement/complex.wgsl.expected.spvasm b/test/tint/statements/decrement/complex.wgsl.expected.spvasm
index aea01bc..46441e3 100644
--- a/test/tint/statements/decrement/complex.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/complex.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 129
+; Bound: 135
 ; Schema: 0
                OpCapability Shader
          %68 = OpExtInstImport "GLSL.std.450"
@@ -63,7 +63,7 @@
      %uint_3 = OpConstant %uint 3
 %_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-         %86 = OpConstantNull %v2uint
+         %89 = OpConstantNull %v2uint
        %bool = OpTypeBool
      %v2bool = OpTypeVector %bool 2
     %uint_10 = OpConstant %uint 10
@@ -131,70 +131,76 @@
          %76 = OpExtInst %uint %68 UMin %75 %uint_3
          %77 = OpAccessChain %_ptr_StorageBuffer_int %72 %76
          %79 = OpLoad %int %77 None
-         %80 = OpISub %int %79 %int_1
-         %81 = OpBitcast %uint %74
-         %82 = OpExtInst %uint %68 UMin %81 %uint_3
-         %83 = OpAccessChain %_ptr_StorageBuffer_int %72 %82
-               OpStore %83 %80 None
+         %80 = OpBitcast %uint %79
+         %81 = OpBitcast %uint %int_1
+         %82 = OpISub %uint %80 %81
+         %83 = OpBitcast %int %82
+         %84 = OpBitcast %uint %74
+         %85 = OpExtInst %uint %68 UMin %84 %uint_3
+         %86 = OpAccessChain %_ptr_StorageBuffer_int %72 %85
+               OpStore %86 %83 None
                OpBranch %52
          %52 = OpLabel
                OpLoopMerge %53 %51 None
                OpBranch %50
          %50 = OpLabel
-         %84 = OpLoad %v2uint %tint_loop_idx None
-         %85 = OpIEqual %v2bool %84 %86
-         %89 = OpAll %bool %85
-               OpSelectionMerge %90 None
-               OpBranchConditional %89 %91 %90
-         %91 = OpLabel
+         %87 = OpLoad %v2uint %tint_loop_idx None
+         %88 = OpIEqual %v2bool %87 %89
+         %92 = OpAll %bool %88
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
                OpBranch %53
-         %90 = OpLabel
-         %92 = OpLoad %uint %v None
-         %93 = OpULessThan %bool %92 %uint_10
-               OpSelectionMerge %95 None
-               OpBranchConditional %93 %95 %96
-         %96 = OpLabel
+         %93 = OpLabel
+         %95 = OpLoad %uint %v None
+         %96 = OpULessThan %bool %95 %uint_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %96 %98 %99
+         %99 = OpLabel
                OpBranch %53
-         %95 = OpLabel
+         %98 = OpLabel
                OpBranch %51
          %51 = OpLabel
-         %97 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %99 = OpLoad %uint %97 None
-%tint_low_inc = OpISub %uint %99 %uint_1
-        %101 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %101 %tint_low_inc None
-        %102 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %102 %uint_1 %uint_0
-        %104 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-        %105 = OpLoad %uint %104 None
-        %106 = OpISub %uint %105 %tint_carry
+        %100 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+        %102 = OpLoad %uint %100 None
+%tint_low_inc = OpISub %uint %102 %uint_1
+        %104 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %104 %tint_low_inc None
+        %105 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %105 %uint_1 %uint_0
         %107 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %107 %106 None
-        %108 = OpFunctionCall %int %idx4
-        %109 = OpFunctionCall %int %idx5
-        %110 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S_tint_explicit_layout %1 %uint_0
-        %111 = OpArrayLength %uint %1 0
-        %112 = OpISub %uint %111 %uint_1
-        %113 = OpBitcast %uint %108
-        %114 = OpExtInst %uint %68 UMin %113 %112
-        %115 = OpBitcast %uint %109
-        %116 = OpExtInst %uint %68 UMin %115 %uint_3
-        %117 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %114 %uint_0 %116
-        %118 = OpFunctionCall %int %idx6
-        %119 = OpBitcast %uint %118
-        %120 = OpExtInst %uint %68 UMin %119 %uint_3
-        %121 = OpAccessChain %_ptr_StorageBuffer_int %117 %120
-        %122 = OpLoad %int %121 None
-        %123 = OpISub %int %122 %int_1
-        %124 = OpBitcast %uint %118
-        %125 = OpExtInst %uint %68 UMin %124 %uint_3
-        %126 = OpAccessChain %_ptr_StorageBuffer_int %117 %125
-               OpStore %126 %123 None
+        %108 = OpLoad %uint %107 None
+        %109 = OpISub %uint %108 %tint_carry
+        %110 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %110 %109 None
+        %111 = OpFunctionCall %int %idx4
+        %112 = OpFunctionCall %int %idx5
+        %113 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S_tint_explicit_layout %1 %uint_0
+        %114 = OpArrayLength %uint %1 0
+        %115 = OpISub %uint %114 %uint_1
+        %116 = OpBitcast %uint %111
+        %117 = OpExtInst %uint %68 UMin %116 %115
+        %118 = OpBitcast %uint %112
+        %119 = OpExtInst %uint %68 UMin %118 %uint_3
+        %120 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %117 %uint_0 %119
+        %121 = OpFunctionCall %int %idx6
+        %122 = OpBitcast %uint %121
+        %123 = OpExtInst %uint %68 UMin %122 %uint_3
+        %124 = OpAccessChain %_ptr_StorageBuffer_int %120 %123
+        %125 = OpLoad %int %124 None
+        %126 = OpBitcast %uint %125
+        %127 = OpBitcast %uint %int_1
+        %128 = OpISub %uint %126 %127
+        %129 = OpBitcast %int %128
+        %130 = OpBitcast %uint %121
+        %131 = OpExtInst %uint %68 UMin %130 %uint_3
+        %132 = OpAccessChain %_ptr_StorageBuffer_int %120 %131
+               OpStore %132 %129 None
                OpBranch %52
          %53 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %47
-        %128 = OpLabel
+        %134 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/decrement/function.wgsl.expected.glsl b/test/tint/statements/decrement/function.wgsl.expected.glsl
index 743a65e..00b79db 100644
--- a/test/tint/statements/decrement/function.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/function.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 void v() {
   int i = 0;
-  i = (i - 1);
+  uint v_1 = uint(i);
+  i = int((v_1 - uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/decrement/function.wgsl.expected.spvasm b/test/tint/statements/decrement/function.wgsl.expected.spvasm
index 6f2ae7c..ff62a78 100644
--- a/test/tint/statements/decrement/function.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/function.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 18
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,17 +15,21 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function
                OpStore %i %int_0
           %9 = OpLoad %int %i None
-         %10 = OpISub %int %9 %int_1
-               OpStore %i %10 None
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpISub %uint %11 %12
+         %15 = OpBitcast %int %14
+               OpStore %i %15 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %13 = OpLabel
+         %17 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/decrement/private.wgsl.expected.glsl b/test/tint/statements/decrement/private.wgsl.expected.glsl
index c7aa6e4..a8a638b 100644
--- a/test/tint/statements/decrement/private.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/private.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 int i = 0;
 void v() {
-  i = (i - 1);
+  uint v_1 = uint(i);
+  i = int((v_1 - uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/decrement/private.wgsl.expected.spvasm b/test/tint/statements/decrement/private.wgsl.expected.spvasm
index a0d72db..5db9a7f 100644
--- a/test/tint/statements/decrement/private.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/private.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 18
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,15 +16,19 @@
           %i = OpVariable %_ptr_Private_int Private %int_0
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %7
           %8 = OpLabel
           %9 = OpLoad %int %i None
-         %10 = OpISub %int %9 %int_1
-               OpStore %i %10 None
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpISub %uint %11 %12
+         %15 = OpBitcast %int %14
+               OpStore %i %15 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %7
-         %13 = OpLabel
+         %17 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/decrement/split.wgsl.expected.glsl b/test/tint/statements/decrement/split.wgsl.expected.glsl
index 0318a6d..5d2b52b 100644
--- a/test/tint/statements/decrement/split.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/split.wgsl.expected.glsl
@@ -2,7 +2,10 @@
 
 void v() {
   int b = 2;
-  int c = (b - -(b));
+  int v_1 = b;
+  int v_2 = int((~(uint(b)) + 1u));
+  uint v_3 = uint(v_1);
+  int c = int((v_3 - uint(v_2)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/decrement/split.wgsl.expected.spvasm b/test/tint/statements/decrement/split.wgsl.expected.spvasm
index d9143c5..dad0131 100644
--- a/test/tint/statements/decrement/split.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/split.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 16
+; Bound: 24
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,6 +16,8 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_2 = OpConstant %int 2
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
        %main = OpFunction %void None %3
           %4 = OpLabel
           %b = OpVariable %_ptr_Function_int Function
@@ -23,12 +25,18 @@
                OpStore %b %int_2
           %9 = OpLoad %int %b None
          %10 = OpLoad %int %b None
-         %11 = OpSNegate %int %10
-         %12 = OpISub %int %9 %11
-               OpStore %c %12
+         %12 = OpBitcast %uint %10
+         %13 = OpNot %uint %12
+         %14 = OpIAdd %uint %13 %uint_1
+         %16 = OpBitcast %int %14
+         %17 = OpBitcast %uint %9
+         %18 = OpBitcast %uint %16
+         %19 = OpISub %uint %17 %18
+         %20 = OpBitcast %int %19
+               OpStore %c %20
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %15 = OpLabel
+         %23 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/decrement/workgroup.wgsl.expected.glsl b/test/tint/statements/decrement/workgroup.wgsl.expected.glsl
index 91f4834..aa70b2c 100644
--- a/test/tint/statements/decrement/workgroup.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/workgroup.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 shared int i;
 void v() {
-  i = (i - 1);
+  uint v_1 = uint(i);
+  i = int((v_1 - uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/decrement/workgroup.wgsl.expected.spvasm b/test/tint/statements/decrement/workgroup.wgsl.expected.spvasm
index 39203b8..33d523c 100644
--- a/test/tint/statements/decrement/workgroup.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/workgroup.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 13
+; Bound: 17
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,15 +15,19 @@
           %i = OpVariable %_ptr_Workgroup_int Workgroup
        %void = OpTypeVoid
           %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %6
           %7 = OpLabel
           %8 = OpLoad %int %i None
-          %9 = OpISub %int %8 %int_1
-               OpStore %i %9 None
+         %10 = OpBitcast %uint %8
+         %11 = OpBitcast %uint %int_1
+         %13 = OpISub %uint %10 %11
+         %14 = OpBitcast %int %13
+               OpStore %i %14 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %6
-         %12 = OpLabel
+         %16 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.glsl b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.glsl
index d8b459d..1c2bf98 100644
--- a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.glsl
+++ b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.glsl
@@ -30,17 +30,19 @@
       } else {
         break;
       }
-      result = (result + i);
+      int v_2 = i;
+      uint v_3 = uint(result);
+      result = int((v_3 + uint(v_2)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        int v_2 = 0;
+        int v_4 = 0;
         if (continue_execution) {
-          v_2 = atomicAdd(v.inner, 1);
+          v_4 = atomicAdd(v.inner, 1);
         }
-        i = v_2;
+        i = v_4;
       }
       continue;
     }
diff --git a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm
index 2c81dd2..34ec0a5 100644
--- a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm
+++ b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 115
+; Bound: 118
 ; Schema: 0
                OpCapability Shader
-        %104 = OpExtInstImport "GLSL.std.450"
+        %107 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %foo "foo" %foo_loc0_Input %foo_loc1_Input %foo_loc0_Output
                OpExecutionMode %foo OriginUpperLeft
@@ -80,13 +80,13 @@
      %uint_0 = OpConstant %uint 0
      %uint_1 = OpConstant %uint 1
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-         %98 = OpUndef %int
+        %101 = OpUndef %int
       %int_1 = OpConstant %int 1
-        %101 = OpTypeFunction %int %float
+        %104 = OpTypeFunction %int %float
 %float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
 %float_2_14748352e_09 = OpConstant %float 2.14748352e+09
        %void = OpTypeVoid
-        %110 = OpTypeFunction %void
+        %113 = OpTypeFunction %void
   %foo_inner = OpFunction %int None %26
          %in = OpFunctionParameter %float
       %coord = OpFunctionParameter %v2float
@@ -134,34 +134,37 @@
          %72 = OpLabel
          %74 = OpLoad %int %i None
          %75 = OpLoad %int %result None
-         %76 = OpIAdd %int %75 %74
-               OpStore %result %76 None
+         %76 = OpBitcast %uint %75
+         %77 = OpBitcast %uint %74
+         %78 = OpIAdd %uint %76 %77
+         %79 = OpBitcast %int %78
+               OpStore %result %79 None
                OpBranch %45
          %45 = OpLabel
-         %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %80 = OpLoad %uint %77 None
-%tint_low_inc = OpISub %uint %80 %uint_1
-         %83 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %83 %tint_low_inc None
-         %84 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %84 %uint_1 %uint_0
-         %86 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %87 = OpLoad %uint %86 None
-         %88 = OpISub %uint %87 %tint_carry
+         %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %83 = OpLoad %uint %80 None
+%tint_low_inc = OpISub %uint %83 %uint_1
+         %86 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %86 %tint_low_inc None
+         %87 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %87 %uint_1 %uint_0
          %89 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %89 %88 None
-         %90 = OpAccessChain %_ptr_StorageBuffer_int %8 %uint_0
-         %92 = OpLoad %bool %continue_execution None
-               OpSelectionMerge %93 None
-               OpBranchConditional %92 %94 %95
-         %94 = OpLabel
-         %97 = OpAtomicIAdd %int %90 %uint_1 %uint_0 %int_1
-               OpBranch %93
-         %95 = OpLabel
-               OpBranch %93
-         %93 = OpLabel
-         %96 = OpPhi %int %97 %94 %98 %95
-               OpStore %i %96 None
+         %90 = OpLoad %uint %89 None
+         %91 = OpISub %uint %90 %tint_carry
+         %92 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %92 %91 None
+         %93 = OpAccessChain %_ptr_StorageBuffer_int %8 %uint_0
+         %95 = OpLoad %bool %continue_execution None
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+        %100 = OpAtomicIAdd %int %93 %uint_1 %uint_0 %int_1
+               OpBranch %96
+         %98 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+         %99 = OpPhi %int %100 %97 %101 %98
+               OpStore %i %99 None
                OpBranch %46
          %47 = OpLabel
          %48 = OpLoad %int %result None
@@ -174,18 +177,18 @@
          %51 = OpLabel
                OpReturnValue %48
                OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %101
+%tint_f32_to_i32 = OpFunction %int None %104
       %value = OpFunctionParameter %float
-        %102 = OpLabel
-        %103 = OpExtInst %float %104 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
-        %107 = OpConvertFToS %int %103
-               OpReturnValue %107
+        %105 = OpLabel
+        %106 = OpExtInst %float %107 NClamp %value %float_n2_14748365e_09 %float_2_14748352e_09
+        %110 = OpConvertFToS %int %106
+               OpReturnValue %110
                OpFunctionEnd
-        %foo = OpFunction %void None %110
-        %111 = OpLabel
-        %112 = OpLoad %float %foo_loc0_Input None
-        %113 = OpLoad %v2float %foo_loc1_Input None
-        %114 = OpFunctionCall %int %foo_inner %112 %113
-               OpStore %foo_loc0_Output %114 None
+        %foo = OpFunction %void None %113
+        %114 = OpLabel
+        %115 = OpLoad %float %foo_loc0_Input None
+        %116 = OpLoad %v2float %foo_loc1_Input None
+        %117 = OpFunctionCall %int %foo_inner %115 %116
+               OpStore %foo_loc0_Output %117 None
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/discard/multiple_returns.wgsl.expected.glsl b/test/tint/statements/discard/multiple_returns.wgsl.expected.glsl
index 0a6d77c..344c7b7 100644
--- a/test/tint/statements/discard/multiple_returns.wgsl.expected.glsl
+++ b/test/tint/statements/discard/multiple_returns.wgsl.expected.glsl
@@ -43,7 +43,8 @@
           tint_loop_idx.x = tint_low_inc;
           uint tint_carry = uint((tint_low_inc == 4294967295u));
           tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-          i = (i + 1);
+          uint v_5 = uint(i);
+          i = int((v_5 + uint(1)));
           if ((i == 5)) { break; }
         }
         continue;
diff --git a/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm b/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm
index 1023180..c4c033f 100644
--- a/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm
+++ b/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 102
+; Bound: 105
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -113,23 +113,23 @@
                OpSelectionMerge %72 None
                OpBranchConditional %71 %73 %72
          %73 = OpLabel
-         %92 = OpLoad %int %i None
-         %93 = OpConvertSToF %float %92
-         %94 = OpAccessChain %_ptr_StorageBuffer_float %5 %uint_0
-         %95 = OpLoad %bool %continue_execution None
-               OpSelectionMerge %96 None
-               OpBranchConditional %95 %97 %96
-         %97 = OpLabel
-               OpStore %94 %93 None
-               OpBranch %96
-         %96 = OpLabel
+         %95 = OpLoad %int %i None
+         %96 = OpConvertSToF %float %95
+         %97 = OpAccessChain %_ptr_StorageBuffer_float %5 %uint_0
          %98 = OpLoad %bool %continue_execution None
-         %99 = OpLogicalNot %bool %98
-               OpSelectionMerge %100 None
-               OpBranchConditional %99 %101 %100
-        %101 = OpLabel
-               OpKill
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %99
         %100 = OpLabel
+               OpStore %97 %96 None
+               OpBranch %99
+         %99 = OpLabel
+        %101 = OpLoad %bool %continue_execution None
+        %102 = OpLogicalNot %bool %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+               OpKill
+        %103 = OpLabel
                OpReturn
          %72 = OpLabel
                OpBranch %48
@@ -147,11 +147,14 @@
          %85 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %85 %84 None
          %86 = OpLoad %int %i None
-         %87 = OpIAdd %int %86 %int_1
-               OpStore %i %87 None
-         %89 = OpLoad %int %i None
-         %90 = OpIEqual %bool %89 %int_5
-               OpBranchConditional %90 %50 %49
+         %87 = OpBitcast %uint %86
+         %88 = OpBitcast %uint %int_1
+         %90 = OpIAdd %uint %87 %88
+         %91 = OpBitcast %int %90
+               OpStore %i %91 None
+         %92 = OpLoad %int %i None
+         %93 = OpIEqual %bool %92 %int_5
+               OpBranchConditional %93 %50 %49
          %50 = OpLabel
          %51 = OpLoad %bool %continue_execution None
          %52 = OpLogicalNot %bool %51
diff --git a/test/tint/statements/for/basic.wgsl.expected.glsl b/test/tint/statements/for/basic.wgsl.expected.glsl
index 65a3aca..340aadd 100644
--- a/test/tint/statements/for/basic.wgsl.expected.glsl
+++ b/test/tint/statements/for/basic.wgsl.expected.glsl
@@ -12,7 +12,8 @@
       }
       some_loop_body();
       {
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/statements/for/basic.wgsl.expected.spvasm b/test/tint/statements/for/basic.wgsl.expected.spvasm
index dad73e4..f6b402c 100644
--- a/test/tint/statements/for/basic.wgsl.expected.spvasm
+++ b/test/tint/statements/for/basic.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 28
+; Bound: 32
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -18,6 +18,7 @@
       %int_0 = OpConstant %int 0
       %int_5 = OpConstant %int 5
        %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
 %some_loop_body = OpFunction %void None %3
           %4 = OpLabel
@@ -45,13 +46,16 @@
                OpBranch %9
           %9 = OpLabel
          %23 = OpLoad %int %i None
-         %24 = OpIAdd %int %23 %int_1
-               OpStore %i %24 None
+         %25 = OpBitcast %uint %23
+         %26 = OpBitcast %uint %int_1
+         %28 = OpIAdd %uint %25 %26
+         %29 = OpBitcast %int %28
+               OpStore %i %29 None
                OpBranch %10
          %11 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %27 = OpLabel
+         %31 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/for/complex.wgsl.expected.glsl b/test/tint/statements/for/complex.wgsl.expected.glsl
index 26904e9..0197469 100644
--- a/test/tint/statements/for/complex.wgsl.expected.glsl
+++ b/test/tint/statements/for/complex.wgsl.expected.glsl
@@ -22,13 +22,15 @@
         break;
       }
       some_loop_body();
-      j = (i * 30);
+      uint v_1 = uint(i);
+      j = int((v_1 * uint(30)));
       {
         uint tint_low_inc = (tint_loop_idx.x - 1u);
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v_2 = uint(i);
+        i = int((v_2 + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/statements/for/complex.wgsl.expected.spvasm b/test/tint/statements/for/complex.wgsl.expected.spvasm
index 1619b7e..9de9a23 100644
--- a/test/tint/statements/for/complex.wgsl.expected.spvasm
+++ b/test/tint/statements/for/complex.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 67
+; Bound: 73
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -68,8 +68,8 @@
                OpSelectionMerge %35 None
                OpBranchConditional %33 %36 %37
          %36 = OpLabel
-         %63 = OpLoad %int %j None
-         %39 = OpSLessThan %bool %63 %int_10
+         %69 = OpLoad %int %j None
+         %39 = OpSLessThan %bool %69 %int_10
                OpBranch %35
          %37 = OpLabel
                OpBranch %35
@@ -82,30 +82,36 @@
          %41 = OpLabel
          %43 = OpFunctionCall %void %some_loop_body
          %44 = OpLoad %int %i None
-         %45 = OpIMul %int %44 %int_30
-               OpStore %j %45 None
+         %45 = OpBitcast %uint %44
+         %46 = OpBitcast %uint %int_30
+         %48 = OpIMul %uint %45 %46
+         %49 = OpBitcast %int %48
+               OpStore %j %49 None
                OpBranch %13
          %13 = OpLabel
-         %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %50 = OpLoad %uint %47 None
-%tint_low_inc = OpISub %uint %50 %uint_1
-         %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %53 %tint_low_inc None
-         %54 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %54 %uint_1 %uint_0
-         %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-         %57 = OpLoad %uint %56 None
-         %58 = OpISub %uint %57 %tint_carry
+         %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+         %53 = OpLoad %uint %50 None
+%tint_low_inc = OpISub %uint %53 %uint_1
+         %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %56 %tint_low_inc None
+         %57 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %57 %uint_1 %uint_0
          %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %59 %58 None
-         %60 = OpLoad %int %i None
-         %61 = OpIAdd %int %60 %int_1
-               OpStore %i %61 None
+         %60 = OpLoad %uint %59 None
+         %61 = OpISub %uint %60 %tint_carry
+         %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %62 %61 None
+         %63 = OpLoad %int %i None
+         %64 = OpBitcast %uint %63
+         %65 = OpBitcast %uint %int_1
+         %67 = OpIAdd %uint %64 %65
+         %68 = OpBitcast %int %67
+               OpStore %i %68 None
                OpBranch %14
          %15 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %66 = OpLabel
+         %72 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.glsl b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.glsl
index 5e66156..e06fdc8 100644
--- a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.glsl
+++ b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.glsl
@@ -17,7 +17,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm
index ffa6233..92785c8 100644
--- a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 49
+; Bound: 52
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -71,13 +71,16 @@
          %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %43 %42 None
          %44 = OpLoad %int %i None
-         %45 = OpIAdd %int %44 %int_1
-               OpStore %i %45 None
+         %45 = OpBitcast %uint %44
+         %46 = OpBitcast %uint %int_1
+         %48 = OpIAdd %uint %45 %46
+         %49 = OpBitcast %int %48
+               OpStore %i %49 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %48 = OpLabel
+         %51 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/for/continuing/basic.wgsl.expected.glsl b/test/tint/statements/for/continuing/basic.wgsl.expected.glsl
index 5e66156..e06fdc8 100644
--- a/test/tint/statements/for/continuing/basic.wgsl.expected.glsl
+++ b/test/tint/statements/for/continuing/basic.wgsl.expected.glsl
@@ -17,7 +17,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm b/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm
index ffa6233..92785c8 100644
--- a/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm
+++ b/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 49
+; Bound: 52
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -71,13 +71,16 @@
          %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %43 %42 None
          %44 = OpLoad %int %i None
-         %45 = OpIAdd %int %44 %int_1
-               OpStore %i %45 None
+         %45 = OpBitcast %uint %44
+         %46 = OpBitcast %uint %int_1
+         %48 = OpIAdd %uint %45 %46
+         %49 = OpBitcast %int %48
+               OpStore %i %49 None
                OpBranch %12
          %13 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %48 = OpLabel
+         %51 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.glsl b/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.glsl
index ada6764..1ca2a12 100644
--- a/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.glsl
+++ b/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.glsl
@@ -17,7 +17,8 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        i = (i + 1);
+        uint v = uint(i);
+        i = int((v + uint(1)));
       }
       continue;
     }
diff --git a/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm b/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm
index cf27d7b..9a24363 100644
--- a/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 49
+; Bound: 52
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -72,13 +72,16 @@
          %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
                OpStore %43 %42 None
          %44 = OpLoad %int %i None
-         %45 = OpIAdd %int %44 %int_1
-               OpStore %i %45 None
+         %45 = OpBitcast %uint %44
+         %46 = OpBitcast %uint %int_1
+         %48 = OpIAdd %uint %45 %46
+         %49 = OpBitcast %int %48
+               OpStore %i %49 None
                OpBranch %8
           %9 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %48 = OpLabel
+         %51 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/increment/complex.wgsl.expected.glsl b/test/tint/statements/increment/complex.wgsl.expected.glsl
index 8d231e2..907e976 100644
--- a/test/tint/statements/increment/complex.wgsl.expected.glsl
+++ b/test/tint/statements/increment/complex.wgsl.expected.glsl
@@ -43,8 +43,9 @@
     uint v_6 = min(uint(v_3), v_5);
     uint v_7 = min(uint(v_4), 3u);
     int v_8 = idx3();
-    int v_9 = (v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)] + 1);
-    v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)] = v_9;
+    uint v_9 = uint(v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)]);
+    int v_10 = int((v_9 + uint(1)));
+    v_1.inner[v_6].a[v_7][min(uint(v_8), 3u)] = v_10;
     while(true) {
       if (all(equal(tint_loop_idx, uvec2(0u)))) {
         break;
@@ -58,14 +59,15 @@
         tint_loop_idx.x = tint_low_inc;
         uint tint_carry = uint((tint_low_inc == 4294967295u));
         tint_loop_idx.y = (tint_loop_idx.y - tint_carry);
-        int v_10 = idx4();
-        int v_11 = idx5();
-        uint v_12 = (uint(v_1.inner.length()) - 1u);
-        uint v_13 = min(uint(v_10), v_12);
-        uint v_14 = min(uint(v_11), 3u);
-        int v_15 = idx6();
-        int v_16 = (v_1.inner[v_13].a[v_14][min(uint(v_15), 3u)] + 1);
-        v_1.inner[v_13].a[v_14][min(uint(v_15), 3u)] = v_16;
+        int v_11 = idx4();
+        int v_12 = idx5();
+        uint v_13 = (uint(v_1.inner.length()) - 1u);
+        uint v_14 = min(uint(v_11), v_13);
+        uint v_15 = min(uint(v_12), 3u);
+        int v_16 = idx6();
+        uint v_17 = uint(v_1.inner[v_14].a[v_15][min(uint(v_16), 3u)]);
+        int v_18 = int((v_17 + uint(1)));
+        v_1.inner[v_14].a[v_15][min(uint(v_16), 3u)] = v_18;
       }
       continue;
     }
diff --git a/test/tint/statements/increment/complex.wgsl.expected.spvasm b/test/tint/statements/increment/complex.wgsl.expected.spvasm
index 5bcf359..c6b5b15 100644
--- a/test/tint/statements/increment/complex.wgsl.expected.spvasm
+++ b/test/tint/statements/increment/complex.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 129
+; Bound: 135
 ; Schema: 0
                OpCapability Shader
          %68 = OpExtInstImport "GLSL.std.450"
@@ -63,7 +63,7 @@
      %uint_3 = OpConstant %uint 3
 %_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
 %_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
-         %86 = OpConstantNull %v2uint
+         %89 = OpConstantNull %v2uint
        %bool = OpTypeBool
      %v2bool = OpTypeVector %bool 2
     %uint_10 = OpConstant %uint 10
@@ -131,70 +131,76 @@
          %76 = OpExtInst %uint %68 UMin %75 %uint_3
          %77 = OpAccessChain %_ptr_StorageBuffer_int %72 %76
          %79 = OpLoad %int %77 None
-         %80 = OpIAdd %int %79 %int_1
-         %81 = OpBitcast %uint %74
-         %82 = OpExtInst %uint %68 UMin %81 %uint_3
-         %83 = OpAccessChain %_ptr_StorageBuffer_int %72 %82
-               OpStore %83 %80 None
+         %80 = OpBitcast %uint %79
+         %81 = OpBitcast %uint %int_1
+         %82 = OpIAdd %uint %80 %81
+         %83 = OpBitcast %int %82
+         %84 = OpBitcast %uint %74
+         %85 = OpExtInst %uint %68 UMin %84 %uint_3
+         %86 = OpAccessChain %_ptr_StorageBuffer_int %72 %85
+               OpStore %86 %83 None
                OpBranch %52
          %52 = OpLabel
                OpLoopMerge %53 %51 None
                OpBranch %50
          %50 = OpLabel
-         %84 = OpLoad %v2uint %tint_loop_idx None
-         %85 = OpIEqual %v2bool %84 %86
-         %89 = OpAll %bool %85
-               OpSelectionMerge %90 None
-               OpBranchConditional %89 %91 %90
-         %91 = OpLabel
+         %87 = OpLoad %v2uint %tint_loop_idx None
+         %88 = OpIEqual %v2bool %87 %89
+         %92 = OpAll %bool %88
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
                OpBranch %53
-         %90 = OpLabel
-         %92 = OpLoad %uint %v None
-         %93 = OpULessThan %bool %92 %uint_10
-               OpSelectionMerge %95 None
-               OpBranchConditional %93 %95 %96
-         %96 = OpLabel
+         %93 = OpLabel
+         %95 = OpLoad %uint %v None
+         %96 = OpULessThan %bool %95 %uint_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %96 %98 %99
+         %99 = OpLabel
                OpBranch %53
-         %95 = OpLabel
+         %98 = OpLabel
                OpBranch %51
          %51 = OpLabel
-         %97 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-         %99 = OpLoad %uint %97 None
-%tint_low_inc = OpISub %uint %99 %uint_1
-        %101 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
-               OpStore %101 %tint_low_inc None
-        %102 = OpIEqual %bool %tint_low_inc %uint_4294967295
- %tint_carry = OpSelect %uint %102 %uint_1 %uint_0
-        %104 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-        %105 = OpLoad %uint %104 None
-        %106 = OpISub %uint %105 %tint_carry
+        %100 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+        %102 = OpLoad %uint %100 None
+%tint_low_inc = OpISub %uint %102 %uint_1
+        %104 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+               OpStore %104 %tint_low_inc None
+        %105 = OpIEqual %bool %tint_low_inc %uint_4294967295
+ %tint_carry = OpSelect %uint %105 %uint_1 %uint_0
         %107 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
-               OpStore %107 %106 None
-        %108 = OpFunctionCall %int %idx4
-        %109 = OpFunctionCall %int %idx5
-        %110 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S_tint_explicit_layout %1 %uint_0
-        %111 = OpArrayLength %uint %1 0
-        %112 = OpISub %uint %111 %uint_1
-        %113 = OpBitcast %uint %108
-        %114 = OpExtInst %uint %68 UMin %113 %112
-        %115 = OpBitcast %uint %109
-        %116 = OpExtInst %uint %68 UMin %115 %uint_3
-        %117 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %114 %uint_0 %116
-        %118 = OpFunctionCall %int %idx6
-        %119 = OpBitcast %uint %118
-        %120 = OpExtInst %uint %68 UMin %119 %uint_3
-        %121 = OpAccessChain %_ptr_StorageBuffer_int %117 %120
-        %122 = OpLoad %int %121 None
-        %123 = OpIAdd %int %122 %int_1
-        %124 = OpBitcast %uint %118
-        %125 = OpExtInst %uint %68 UMin %124 %uint_3
-        %126 = OpAccessChain %_ptr_StorageBuffer_int %117 %125
-               OpStore %126 %123 None
+        %108 = OpLoad %uint %107 None
+        %109 = OpISub %uint %108 %tint_carry
+        %110 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+               OpStore %110 %109 None
+        %111 = OpFunctionCall %int %idx4
+        %112 = OpFunctionCall %int %idx5
+        %113 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S_tint_explicit_layout %1 %uint_0
+        %114 = OpArrayLength %uint %1 0
+        %115 = OpISub %uint %114 %uint_1
+        %116 = OpBitcast %uint %111
+        %117 = OpExtInst %uint %68 UMin %116 %115
+        %118 = OpBitcast %uint %112
+        %119 = OpExtInst %uint %68 UMin %118 %uint_3
+        %120 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %117 %uint_0 %119
+        %121 = OpFunctionCall %int %idx6
+        %122 = OpBitcast %uint %121
+        %123 = OpExtInst %uint %68 UMin %122 %uint_3
+        %124 = OpAccessChain %_ptr_StorageBuffer_int %120 %123
+        %125 = OpLoad %int %124 None
+        %126 = OpBitcast %uint %125
+        %127 = OpBitcast %uint %int_1
+        %128 = OpIAdd %uint %126 %127
+        %129 = OpBitcast %int %128
+        %130 = OpBitcast %uint %121
+        %131 = OpExtInst %uint %68 UMin %130 %uint_3
+        %132 = OpAccessChain %_ptr_StorageBuffer_int %120 %131
+               OpStore %132 %129 None
                OpBranch %52
          %53 = OpLabel
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %47
-        %128 = OpLabel
+        %134 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/increment/function.wgsl.expected.glsl b/test/tint/statements/increment/function.wgsl.expected.glsl
index f569c14..077e49c 100644
--- a/test/tint/statements/increment/function.wgsl.expected.glsl
+++ b/test/tint/statements/increment/function.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 void v() {
   int i = 0;
-  i = (i + 1);
+  uint v_1 = uint(i);
+  i = int((v_1 + uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/increment/function.wgsl.expected.spvasm b/test/tint/statements/increment/function.wgsl.expected.spvasm
index f8796a5..1fe4994 100644
--- a/test/tint/statements/increment/function.wgsl.expected.spvasm
+++ b/test/tint/statements/increment/function.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 18
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,17 +15,21 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %3
           %4 = OpLabel
           %i = OpVariable %_ptr_Function_int Function
                OpStore %i %int_0
           %9 = OpLoad %int %i None
-         %10 = OpIAdd %int %9 %int_1
-               OpStore %i %10 None
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %11 %12
+         %15 = OpBitcast %int %14
+               OpStore %i %15 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %13 = OpLabel
+         %17 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/increment/private.wgsl.expected.glsl b/test/tint/statements/increment/private.wgsl.expected.glsl
index 447803f..1c39826 100644
--- a/test/tint/statements/increment/private.wgsl.expected.glsl
+++ b/test/tint/statements/increment/private.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 int i = 0;
 void v() {
-  i = (i + 1);
+  uint v_1 = uint(i);
+  i = int((v_1 + uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/increment/private.wgsl.expected.spvasm b/test/tint/statements/increment/private.wgsl.expected.spvasm
index a4b1c84..0b775ff 100644
--- a/test/tint/statements/increment/private.wgsl.expected.spvasm
+++ b/test/tint/statements/increment/private.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 18
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -16,15 +16,19 @@
           %i = OpVariable %_ptr_Private_int Private %int_0
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %7
           %8 = OpLabel
           %9 = OpLoad %int %i None
-         %10 = OpIAdd %int %9 %int_1
-               OpStore %i %10 None
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %11 %12
+         %15 = OpBitcast %int %14
+               OpStore %i %15 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %7
-         %13 = OpLabel
+         %17 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/increment/workgroup.wgsl.expected.glsl b/test/tint/statements/increment/workgroup.wgsl.expected.glsl
index ea4092e..cd765640 100644
--- a/test/tint/statements/increment/workgroup.wgsl.expected.glsl
+++ b/test/tint/statements/increment/workgroup.wgsl.expected.glsl
@@ -2,7 +2,8 @@
 
 shared int i;
 void v() {
-  i = (i + 1);
+  uint v_1 = uint(i);
+  i = int((v_1 + uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
diff --git a/test/tint/statements/increment/workgroup.wgsl.expected.spvasm b/test/tint/statements/increment/workgroup.wgsl.expected.spvasm
index dee4d3d..5290dba 100644
--- a/test/tint/statements/increment/workgroup.wgsl.expected.spvasm
+++ b/test/tint/statements/increment/workgroup.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 13
+; Bound: 17
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,15 +15,19 @@
           %i = OpVariable %_ptr_Workgroup_int Workgroup
        %void = OpTypeVoid
           %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
        %main = OpFunction %void None %6
           %7 = OpLabel
           %8 = OpLoad %int %i None
-          %9 = OpIAdd %int %8 %int_1
-               OpStore %i %9 None
+         %10 = OpBitcast %uint %8
+         %11 = OpBitcast %uint %int_1
+         %13 = OpIAdd %uint %10 %11
+         %14 = OpBitcast %int %13
+               OpStore %i %14 None
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %6
-         %12 = OpLabel
+         %16 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/struct/type_initializer.wgsl.expected.glsl b/test/tint/struct/type_initializer.wgsl.expected.glsl
index 8828e88..3578302 100644
--- a/test/tint/struct/type_initializer.wgsl.expected.glsl
+++ b/test/tint/struct/type_initializer.wgsl.expected.glsl
@@ -28,18 +28,23 @@
   int x = 42;
   S1 empty = S1(0, 0, 0, 0);
   S1 nonempty = S1(1, 2, 3, 4);
-  S1 nonempty_with_expr = S1(1, x, (x + 1), nonempty.d);
+  uint v = uint(x);
+  S1 nonempty_with_expr = S1(1, x, int((v + uint(1))), nonempty.d);
   S3 nested_empty = S3(0, S1(0, 0, 0, 0), S2(0, S1(0, 0, 0, 0)));
   S3 nested_nonempty = S3(1, S1(2, 3, 4, 5), S2(6, S1(7, 8, 9, 10)));
-  S1 v = S1(2, x, (x + 1), nested_nonempty.i.f.d);
-  S3 nested_nonempty_with_expr = S3(1, v, S2(6, nonempty));
+  uint v_1 = uint(x);
+  S1 v_2 = S1(2, x, int((v_1 + uint(1))), nested_nonempty.i.f.d);
+  S3 nested_nonempty_with_expr = S3(1, v_2, S2(6, nonempty));
   int subexpr_empty = 0;
   int subexpr_nonempty = 2;
-  int subexpr_nonempty_with_expr = S1(1, x, (x + 1), nonempty.d).c;
+  uint v_3 = uint(x);
+  int subexpr_nonempty_with_expr = S1(1, x, int((v_3 + uint(1))), nonempty.d).c;
   S1 subexpr_nested_empty = S1(0, 0, 0, 0);
   S1 subexpr_nested_nonempty = S1(2, 3, 4, 5);
-  S1 subexpr_nested_nonempty_with_expr = S2(1, S1(2, x, (x + 1), nested_nonempty.i.f.d)).f;
+  uint v_4 = uint(x);
+  S1 subexpr_nested_nonempty_with_expr = S2(1, S1(2, x, int((v_4 + uint(1))), nested_nonempty.i.f.d)).f;
   T aosoa_empty[2] = T[2](T(int[2](0, 0)), T(int[2](0, 0)));
   T aosoa_nonempty[2] = T[2](T(int[2](1, 2)), T(int[2](3, 4)));
-  T aosoa_nonempty_with_expr[2] = T[2](T(int[2](1, (aosoa_nonempty[0u].a[0u] + 1))), aosoa_nonempty[1u]);
+  uint v_5 = uint(aosoa_nonempty[0u].a[0u]);
+  T aosoa_nonempty_with_expr[2] = T[2](T(int[2](1, int((v_5 + uint(1))))), aosoa_nonempty[1u]);
 }
diff --git a/test/tint/struct/type_initializer.wgsl.expected.spvasm b/test/tint/struct/type_initializer.wgsl.expected.spvasm
index 885f128..b672c81 100644
--- a/test/tint/struct/type_initializer.wgsl.expected.spvasm
+++ b/test/tint/struct/type_initializer.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 62
+; Bound: 77
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -49,6 +49,7 @@
       %int_3 = OpConstant %int 3
       %int_4 = OpConstant %int 4
    %nonempty = OpConstantComposite %S1 %int_1 %subexpr_nonempty %int_3 %int_4
+       %uint = OpTypeInt 32 0
          %S2 = OpTypeStruct %int %S1
          %S3 = OpTypeStruct %int %S1 %S2
 %nested_empty = OpConstantNull %S3
@@ -59,45 +60,59 @@
       %int_8 = OpConstant %int 8
       %int_9 = OpConstant %int 9
      %int_10 = OpConstant %int 10
-         %25 = OpConstantComposite %S1 %int_7 %int_8 %int_9 %int_10
-         %23 = OpConstantComposite %S2 %int_6 %25
-%nested_nonempty = OpConstantComposite %S3 %int_1 %subexpr_nested_nonempty %23
+         %29 = OpConstantComposite %S1 %int_7 %int_8 %int_9 %int_10
+         %27 = OpConstantComposite %S2 %int_6 %29
+%nested_nonempty = OpConstantComposite %S3 %int_1 %subexpr_nested_nonempty %27
 %subexpr_empty = OpConstant %int 0
-       %uint = OpTypeInt 32 0
      %uint_2 = OpConstant %uint 2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
           %T = OpTypeStruct %_arr_int_uint_2
 %_arr_T_uint_2 = OpTypeArray %T %uint_2
 %aosoa_empty = OpConstantNull %_arr_T_uint_2
-         %53 = OpConstantComposite %_arr_int_uint_2 %int_1 %subexpr_nonempty
-         %52 = OpConstantComposite %T %53
-         %55 = OpConstantComposite %_arr_int_uint_2 %int_3 %int_4
-         %54 = OpConstantComposite %T %55
-%aosoa_nonempty = OpConstantComposite %_arr_T_uint_2 %52 %54
+         %65 = OpConstantComposite %_arr_int_uint_2 %int_1 %subexpr_nonempty
+         %64 = OpConstantComposite %T %65
+         %67 = OpConstantComposite %_arr_int_uint_2 %int_3 %int_4
+         %66 = OpConstantComposite %T %67
+%aosoa_nonempty = OpConstantComposite %_arr_T_uint_2 %64 %66
        %main = OpFunction %void None %3
           %4 = OpLabel
-         %14 = OpIAdd %int %x %int_1
-         %15 = OpCompositeExtract %int %nonempty 3
-%nonempty_with_expr = OpCompositeConstruct %S1 %int_1 %x %14 %15
-         %30 = OpIAdd %int %x %int_1
-         %31 = OpCompositeExtract %int %nested_nonempty 2 1 3
-         %32 = OpCompositeConstruct %S1 %subexpr_nonempty %x %30 %31
-         %33 = OpCompositeConstruct %S2 %int_6 %nonempty
-%nested_nonempty_with_expr = OpCompositeConstruct %S3 %int_1 %32 %33
-         %36 = OpIAdd %int %x %int_1
-         %37 = OpCompositeExtract %int %nonempty 3
-         %38 = OpCompositeConstruct %S1 %int_1 %x %36 %37
-%subexpr_nonempty_with_expr = OpCompositeExtract %int %38 2
-         %40 = OpIAdd %int %x %int_1
-         %41 = OpCompositeExtract %int %nested_nonempty 2 1 3
-         %42 = OpCompositeConstruct %S1 %subexpr_nonempty %x %40 %41
-         %43 = OpCompositeConstruct %S2 %int_1 %42
-%subexpr_nested_nonempty_with_expr = OpCompositeExtract %S1 %43 1
-         %56 = OpCompositeExtract %int %aosoa_nonempty 0 0 0
-         %57 = OpIAdd %int %56 %int_1
-         %58 = OpCompositeConstruct %_arr_int_uint_2 %int_1 %57
-         %59 = OpCompositeConstruct %T %58
-         %60 = OpCompositeExtract %T %aosoa_nonempty 1
-%aosoa_nonempty_with_expr = OpCompositeConstruct %_arr_T_uint_2 %59 %60
+         %15 = OpBitcast %uint %x
+         %16 = OpBitcast %uint %int_1
+         %17 = OpIAdd %uint %15 %16
+         %18 = OpBitcast %int %17
+         %19 = OpCompositeExtract %int %nonempty 3
+%nonempty_with_expr = OpCompositeConstruct %S1 %int_1 %x %18 %19
+         %34 = OpBitcast %uint %x
+         %35 = OpBitcast %uint %int_1
+         %36 = OpIAdd %uint %34 %35
+         %37 = OpBitcast %int %36
+         %38 = OpCompositeExtract %int %nested_nonempty 2 1 3
+         %39 = OpCompositeConstruct %S1 %subexpr_nonempty %x %37 %38
+         %40 = OpCompositeConstruct %S2 %int_6 %nonempty
+%nested_nonempty_with_expr = OpCompositeConstruct %S3 %int_1 %39 %40
+         %43 = OpBitcast %uint %x
+         %44 = OpBitcast %uint %int_1
+         %45 = OpIAdd %uint %43 %44
+         %46 = OpBitcast %int %45
+         %47 = OpCompositeExtract %int %nonempty 3
+         %48 = OpCompositeConstruct %S1 %int_1 %x %46 %47
+%subexpr_nonempty_with_expr = OpCompositeExtract %int %48 2
+         %50 = OpBitcast %uint %x
+         %51 = OpBitcast %uint %int_1
+         %52 = OpIAdd %uint %50 %51
+         %53 = OpBitcast %int %52
+         %54 = OpCompositeExtract %int %nested_nonempty 2 1 3
+         %55 = OpCompositeConstruct %S1 %subexpr_nonempty %x %53 %54
+         %56 = OpCompositeConstruct %S2 %int_1 %55
+%subexpr_nested_nonempty_with_expr = OpCompositeExtract %S1 %56 1
+         %68 = OpCompositeExtract %int %aosoa_nonempty 0 0 0
+         %69 = OpBitcast %uint %68
+         %70 = OpBitcast %uint %int_1
+         %71 = OpIAdd %uint %69 %70
+         %72 = OpBitcast %int %71
+         %73 = OpCompositeConstruct %_arr_int_uint_2 %int_1 %72
+         %74 = OpCompositeConstruct %T %73
+         %75 = OpCompositeExtract %T %aosoa_nonempty 1
+%aosoa_nonempty_with_expr = OpCompositeConstruct %_arr_T_uint_2 %74 %75
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/switch/switch.wgsl.expected.glsl b/test/tint/switch/switch.wgsl.expected.glsl
index 1d966dd..a15f008 100644
--- a/test/tint/switch/switch.wgsl.expected.glsl
+++ b/test/tint/switch/switch.wgsl.expected.glsl
@@ -13,7 +13,8 @@
     }
     default:
     {
-      a_1 = (a_1 + 2);
+      uint v = uint(a_1);
+      a_1 = int((v + uint(2)));
       break;
     }
   }
diff --git a/test/tint/switch/switch.wgsl.expected.spvasm b/test/tint/switch/switch.wgsl.expected.spvasm
index 2ec658b..2ced473 100644
--- a/test/tint/switch/switch.wgsl.expected.spvasm
+++ b/test/tint/switch/switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 19
+; Bound: 23
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -15,6 +15,7 @@
         %int = OpTypeInt 32 1
 %_ptr_Function_int = OpTypePointer Function %int
       %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
       %int_2 = OpConstant %int 2
           %a = OpFunction %void None %3
           %4 = OpLabel
@@ -25,8 +26,11 @@
                OpSwitch %9 %10 0 %11 1 %12
          %10 = OpLabel
          %14 = OpLoad %int %a_0 None
-         %15 = OpIAdd %int %14 %int_2
-               OpStore %a_0 %15 None
+         %16 = OpBitcast %uint %14
+         %17 = OpBitcast %uint %int_2
+         %19 = OpIAdd %uint %16 %17
+         %20 = OpBitcast %int %19
+               OpStore %a_0 %20 None
                OpBranch %13
          %11 = OpLabel
                OpBranch %13
@@ -36,6 +40,6 @@
                OpReturn
                OpFunctionEnd
 %unused_entry_point = OpFunction %void None %3
-         %18 = OpLabel
+         %22 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/var/uses/private.wgsl.expected.glsl b/test/tint/var/uses/private.wgsl.expected.glsl
index cfcabf5..0c2aa45 100644
--- a/test/tint/var/uses/private.wgsl.expected.glsl
+++ b/test/tint/var/uses/private.wgsl.expected.glsl
@@ -5,7 +5,8 @@
 
 int a = 0;
 void uses_a() {
-  a = (a + 1);
+  uint v = uint(a);
+  a = int((v + uint(1)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
@@ -19,7 +20,8 @@
 
 int b = 0;
 void uses_b() {
-  b = (b * 2);
+  uint v = uint(b);
+  b = int((v * uint(2)));
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
@@ -34,10 +36,12 @@
 int a = 0;
 int b = 0;
 void uses_a() {
-  a = (a + 1);
+  uint v = uint(a);
+  a = int((v + uint(1)));
 }
 void uses_b() {
-  b = (b * 2);
+  uint v_1 = uint(b);
+  b = int((v_1 * uint(2)));
 }
 void uses_a_and_b() {
   b = a;
diff --git a/test/tint/var/uses/private.wgsl.expected.spvasm b/test/tint/var/uses/private.wgsl.expected.spvasm
index ad1c8a7..33d5b74 100644
--- a/test/tint/var/uses/private.wgsl.expected.spvasm
+++ b/test/tint/var/uses/private.wgsl.expected.spvasm
@@ -4,7 +4,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 16
+; Bound: 20
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -19,19 +19,23 @@
           %a = OpVariable %_ptr_Private_int Private %4
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
      %int_42 = OpConstant %int 42
      %uses_a = OpFunction %void None %7
           %8 = OpLabel
           %9 = OpLoad %int %a None
-         %10 = OpIAdd %int %9 %int_1
-               OpStore %a %10 None
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_1
+         %14 = OpIAdd %uint %11 %12
+         %15 = OpBitcast %int %14
+               OpStore %a %15 None
                OpReturn
                OpFunctionEnd
       %main1 = OpFunction %void None %7
-         %13 = OpLabel
+         %17 = OpLabel
                OpStore %a %int_42 None
-         %15 = OpFunctionCall %void %uses_a
+         %19 = OpFunctionCall %void %uses_a
                OpReturn
                OpFunctionEnd
 ;
@@ -40,7 +44,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 16
+; Bound: 20
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -55,19 +59,23 @@
           %b = OpVariable %_ptr_Private_int Private %4
        %void = OpTypeVoid
           %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_2 = OpConstant %int 2
       %int_7 = OpConstant %int 7
      %uses_b = OpFunction %void None %7
           %8 = OpLabel
           %9 = OpLoad %int %b None
-         %10 = OpIMul %int %9 %int_2
-               OpStore %b %10 None
+         %11 = OpBitcast %uint %9
+         %12 = OpBitcast %uint %int_2
+         %14 = OpIMul %uint %11 %12
+         %15 = OpBitcast %int %14
+               OpStore %b %15 None
                OpReturn
                OpFunctionEnd
       %main2 = OpFunction %void None %7
-         %13 = OpLabel
+         %17 = OpLabel
                OpStore %b %int_7 None
-         %15 = OpFunctionCall %void %uses_b
+         %19 = OpFunctionCall %void %uses_b
                OpReturn
                OpFunctionEnd
 ;
@@ -76,7 +84,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 34
+; Bound: 41
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -97,46 +105,53 @@
           %b = OpVariable %_ptr_Private_int Private %4
        %void = OpTypeVoid
           %8 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
       %int_0 = OpConstant %int 0
      %uses_a = OpFunction %void None %8
           %9 = OpLabel
          %10 = OpLoad %int %a None
-         %11 = OpIAdd %int %10 %int_1
-               OpStore %a %11 None
+         %12 = OpBitcast %uint %10
+         %13 = OpBitcast %uint %int_1
+         %15 = OpIAdd %uint %12 %13
+         %16 = OpBitcast %int %15
+               OpStore %a %16 None
                OpReturn
                OpFunctionEnd
      %uses_b = OpFunction %void None %8
-         %14 = OpLabel
-         %15 = OpLoad %int %b None
-         %16 = OpIMul %int %15 %int_2
-               OpStore %b %16 None
+         %18 = OpLabel
+         %19 = OpLoad %int %b None
+         %20 = OpBitcast %uint %19
+         %21 = OpBitcast %uint %int_2
+         %23 = OpIMul %uint %20 %21
+         %24 = OpBitcast %int %23
+               OpStore %b %24 None
                OpReturn
                OpFunctionEnd
 %uses_a_and_b = OpFunction %void None %8
-         %19 = OpLabel
-         %20 = OpLoad %int %a None
-               OpStore %b %20 None
+         %26 = OpLabel
+         %27 = OpLoad %int %a None
+               OpStore %b %27 None
                OpReturn
                OpFunctionEnd
     %no_uses = OpFunction %void None %8
-         %22 = OpLabel
+         %29 = OpLabel
                OpReturn
                OpFunctionEnd
       %outer = OpFunction %void None %8
-         %24 = OpLabel
+         %31 = OpLabel
                OpStore %a %int_0 None
-         %26 = OpFunctionCall %void %uses_a
-         %27 = OpFunctionCall %void %uses_a_and_b
-         %28 = OpFunctionCall %void %uses_b
-         %29 = OpFunctionCall %void %no_uses
+         %33 = OpFunctionCall %void %uses_a
+         %34 = OpFunctionCall %void %uses_a_and_b
+         %35 = OpFunctionCall %void %uses_b
+         %36 = OpFunctionCall %void %no_uses
                OpReturn
                OpFunctionEnd
       %main3 = OpFunction %void None %8
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %outer
-         %33 = OpFunctionCall %void %no_uses
+         %38 = OpLabel
+         %39 = OpFunctionCall %void %outer
+         %40 = OpFunctionCall %void %no_uses
                OpReturn
                OpFunctionEnd
 ;
diff --git a/test/tint/var/uses/workgroup.wgsl.expected.glsl b/test/tint/var/uses/workgroup.wgsl.expected.glsl
index d487230..3a6e420 100644
--- a/test/tint/var/uses/workgroup.wgsl.expected.glsl
+++ b/test/tint/var/uses/workgroup.wgsl.expected.glsl
@@ -5,7 +5,8 @@
 
 shared int a;
 void uses_a() {
-  a = (a + 1);
+  uint v = uint(a);
+  a = int((v + uint(1)));
 }
 void main1_inner(uint tint_local_index) {
   if ((tint_local_index < 1u)) {
@@ -26,7 +27,8 @@
 
 shared int b;
 void uses_b() {
-  b = (b * 2);
+  uint v = uint(b);
+  b = int((v * uint(2)));
 }
 void main2_inner(uint tint_local_index) {
   if ((tint_local_index < 1u)) {
@@ -48,10 +50,12 @@
 shared int a;
 shared int b;
 void uses_a() {
-  a = (a + 1);
+  uint v = uint(a);
+  a = int((v + uint(1)));
 }
 void uses_b() {
-  b = (b * 2);
+  uint v_1 = uint(b);
+  b = int((v_1 * uint(2)));
 }
 void uses_a_and_b() {
   b = a;
diff --git a/test/tint/var/uses/workgroup.wgsl.expected.spvasm b/test/tint/var/uses/workgroup.wgsl.expected.spvasm
index 6d86d8b..aeee50d 100644
--- a/test/tint/var/uses/workgroup.wgsl.expected.spvasm
+++ b/test/tint/var/uses/workgroup.wgsl.expected.spvasm
@@ -4,7 +4,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 33
+; Bound: 36
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -26,7 +26,7 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
       %int_1 = OpConstant %int 1
-         %16 = OpTypeFunction %void %uint
+         %19 = OpTypeFunction %void %uint
      %uint_1 = OpConstant %uint 1
        %bool = OpTypeBool
      %uint_2 = OpConstant %uint 2
@@ -36,29 +36,32 @@
      %uses_a = OpFunction %void None %9
          %10 = OpLabel
          %11 = OpLoad %int %a None
-         %12 = OpIAdd %int %11 %int_1
-               OpStore %a %12 None
+         %12 = OpBitcast %uint %11
+         %13 = OpBitcast %uint %int_1
+         %15 = OpIAdd %uint %12 %13
+         %16 = OpBitcast %int %15
+               OpStore %a %16 None
                OpReturn
                OpFunctionEnd
-%main1_inner = OpFunction %void None %16
+%main1_inner = OpFunction %void None %19
 %tint_local_index = OpFunctionParameter %uint
-         %17 = OpLabel
-         %18 = OpULessThan %bool %tint_local_index %uint_1
-               OpSelectionMerge %21 None
-               OpBranchConditional %18 %22 %21
-         %22 = OpLabel
+         %20 = OpLabel
+         %21 = OpULessThan %bool %tint_local_index %uint_1
+               OpSelectionMerge %24 None
+               OpBranchConditional %21 %25 %24
+         %25 = OpLabel
                OpStore %a %int_0 None
-               OpBranch %21
-         %21 = OpLabel
+               OpBranch %24
+         %24 = OpLabel
                OpControlBarrier %uint_2 %uint_2 %uint_264
                OpStore %a %int_42 None
-         %27 = OpFunctionCall %void %uses_a
+         %30 = OpFunctionCall %void %uses_a
                OpReturn
                OpFunctionEnd
       %main1 = OpFunction %void None %9
-         %30 = OpLabel
-         %31 = OpLoad %uint %main1_local_invocation_index_Input None
-         %32 = OpFunctionCall %void %main1_inner %31
+         %33 = OpLabel
+         %34 = OpLoad %uint %main1_local_invocation_index_Input None
+         %35 = OpFunctionCall %void %main1_inner %34
                OpReturn
                OpFunctionEnd
 ;
@@ -67,7 +70,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 33
+; Bound: 36
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -89,7 +92,7 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
       %int_2 = OpConstant %int 2
-         %16 = OpTypeFunction %void %uint
+         %19 = OpTypeFunction %void %uint
      %uint_1 = OpConstant %uint 1
        %bool = OpTypeBool
      %uint_2 = OpConstant %uint 2
@@ -99,29 +102,32 @@
      %uses_b = OpFunction %void None %9
          %10 = OpLabel
          %11 = OpLoad %int %b None
-         %12 = OpIMul %int %11 %int_2
-               OpStore %b %12 None
+         %12 = OpBitcast %uint %11
+         %13 = OpBitcast %uint %int_2
+         %15 = OpIMul %uint %12 %13
+         %16 = OpBitcast %int %15
+               OpStore %b %16 None
                OpReturn
                OpFunctionEnd
-%main2_inner = OpFunction %void None %16
+%main2_inner = OpFunction %void None %19
 %tint_local_index = OpFunctionParameter %uint
-         %17 = OpLabel
-         %18 = OpULessThan %bool %tint_local_index %uint_1
-               OpSelectionMerge %21 None
-               OpBranchConditional %18 %22 %21
-         %22 = OpLabel
+         %20 = OpLabel
+         %21 = OpULessThan %bool %tint_local_index %uint_1
+               OpSelectionMerge %24 None
+               OpBranchConditional %21 %25 %24
+         %25 = OpLabel
                OpStore %b %int_0 None
-               OpBranch %21
-         %21 = OpLabel
+               OpBranch %24
+         %24 = OpLabel
                OpControlBarrier %uint_2 %uint_2 %uint_264
                OpStore %b %int_7 None
-         %27 = OpFunctionCall %void %uses_b
+         %30 = OpFunctionCall %void %uses_b
                OpReturn
                OpFunctionEnd
       %main2 = OpFunction %void None %9
-         %30 = OpLabel
-         %31 = OpLoad %uint %main2_local_invocation_index_Input None
-         %32 = OpFunctionCall %void %main2_inner %31
+         %33 = OpLabel
+         %34 = OpLoad %uint %main2_local_invocation_index_Input None
+         %35 = OpFunctionCall %void %main2_inner %34
                OpReturn
                OpFunctionEnd
 ;
@@ -130,7 +136,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 1
-; Bound: 50
+; Bound: 56
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -160,7 +166,7 @@
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
       %int_0 = OpConstant %int 0
-         %34 = OpTypeFunction %void %uint
+         %40 = OpTypeFunction %void %uint
      %uint_1 = OpConstant %uint 1
        %bool = OpTypeBool
      %uint_2 = OpConstant %uint 2
@@ -168,56 +174,62 @@
      %uses_a = OpFunction %void None %10
          %11 = OpLabel
          %12 = OpLoad %int %a None
-         %13 = OpIAdd %int %12 %int_1
-               OpStore %a %13 None
+         %13 = OpBitcast %uint %12
+         %14 = OpBitcast %uint %int_1
+         %16 = OpIAdd %uint %13 %14
+         %17 = OpBitcast %int %16
+               OpStore %a %17 None
                OpReturn
                OpFunctionEnd
      %uses_b = OpFunction %void None %10
-         %16 = OpLabel
-         %17 = OpLoad %int %b None
-         %18 = OpIMul %int %17 %int_2
-               OpStore %b %18 None
+         %19 = OpLabel
+         %20 = OpLoad %int %b None
+         %21 = OpBitcast %uint %20
+         %22 = OpBitcast %uint %int_2
+         %24 = OpIMul %uint %21 %22
+         %25 = OpBitcast %int %24
+               OpStore %b %25 None
                OpReturn
                OpFunctionEnd
 %uses_a_and_b = OpFunction %void None %10
-         %21 = OpLabel
-         %22 = OpLoad %int %a None
-               OpStore %b %22 None
+         %27 = OpLabel
+         %28 = OpLoad %int %a None
+               OpStore %b %28 None
                OpReturn
                OpFunctionEnd
     %no_uses = OpFunction %void None %10
-         %24 = OpLabel
+         %30 = OpLabel
                OpReturn
                OpFunctionEnd
       %outer = OpFunction %void None %10
-         %26 = OpLabel
+         %32 = OpLabel
                OpStore %a %int_0 None
-         %28 = OpFunctionCall %void %uses_a
-         %29 = OpFunctionCall %void %uses_a_and_b
-         %30 = OpFunctionCall %void %uses_b
-         %31 = OpFunctionCall %void %no_uses
+         %34 = OpFunctionCall %void %uses_a
+         %35 = OpFunctionCall %void %uses_a_and_b
+         %36 = OpFunctionCall %void %uses_b
+         %37 = OpFunctionCall %void %no_uses
                OpReturn
                OpFunctionEnd
-%main3_inner = OpFunction %void None %34
+%main3_inner = OpFunction %void None %40
 %tint_local_index = OpFunctionParameter %uint
-         %35 = OpLabel
-         %36 = OpULessThan %bool %tint_local_index %uint_1
-               OpSelectionMerge %39 None
-               OpBranchConditional %36 %40 %39
-         %40 = OpLabel
+         %41 = OpLabel
+         %42 = OpULessThan %bool %tint_local_index %uint_1
+               OpSelectionMerge %45 None
+               OpBranchConditional %42 %46 %45
+         %46 = OpLabel
                OpStore %a %int_0 None
                OpStore %b %int_0 None
-               OpBranch %39
-         %39 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
                OpControlBarrier %uint_2 %uint_2 %uint_264
-         %44 = OpFunctionCall %void %outer
-         %45 = OpFunctionCall %void %no_uses
+         %50 = OpFunctionCall %void %outer
+         %51 = OpFunctionCall %void %no_uses
                OpReturn
                OpFunctionEnd
       %main3 = OpFunction %void None %10
-         %47 = OpLabel
-         %48 = OpLoad %uint %main3_local_invocation_index_Input None
-         %49 = OpFunctionCall %void %main3_inner %48
+         %53 = OpLabel
+         %54 = OpLoad %uint %main3_local_invocation_index_Input None
+         %55 = OpFunctionCall %void %main3_inner %54
                OpReturn
                OpFunctionEnd
 ;