diff --git a/src/tint/lang/hlsl/writer/raise/BUILD.bazel b/src/tint/lang/hlsl/writer/raise/BUILD.bazel
index ba70b5f..46be924 100644
--- a/src/tint/lang/hlsl/writer/raise/BUILD.bazel
+++ b/src/tint/lang/hlsl/writer/raise/BUILD.bazel
@@ -47,6 +47,7 @@
     "localize_struct_array_assignment.cc",
     "promote_initializers.cc",
     "raise.cc",
+    "replace_non_indexable_mat_vec_stores.cc",
     "shader_io.cc",
   ],
   hdrs = [
@@ -58,6 +59,7 @@
     "localize_struct_array_assignment.h",
     "promote_initializers.h",
     "raise.h",
+    "replace_non_indexable_mat_vec_stores.h",
     "shader_io.h",
   ],
   deps = [
@@ -103,6 +105,7 @@
     "fxc_polyfill_test.cc",
     "localize_struct_array_assignment_test.cc",
     "promote_initializers_test.cc",
+    "replace_non_indexable_mat_vec_stores_test.cc",
     "shader_io_test.cc",
   ],
   deps = [
diff --git a/src/tint/lang/hlsl/writer/raise/BUILD.cmake b/src/tint/lang/hlsl/writer/raise/BUILD.cmake
index 814c9fe..9f2515b 100644
--- a/src/tint/lang/hlsl/writer/raise/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/raise/BUILD.cmake
@@ -55,6 +55,8 @@
   lang/hlsl/writer/raise/promote_initializers.h
   lang/hlsl/writer/raise/raise.cc
   lang/hlsl/writer/raise/raise.h
+  lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.cc
+  lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h
   lang/hlsl/writer/raise/shader_io.cc
   lang/hlsl/writer/raise/shader_io.h
 )
@@ -104,6 +106,7 @@
   lang/hlsl/writer/raise/fxc_polyfill_test.cc
   lang/hlsl/writer/raise/localize_struct_array_assignment_test.cc
   lang/hlsl/writer/raise/promote_initializers_test.cc
+  lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores_test.cc
   lang/hlsl/writer/raise/shader_io_test.cc
 )
 
diff --git a/src/tint/lang/hlsl/writer/raise/BUILD.gn b/src/tint/lang/hlsl/writer/raise/BUILD.gn
index 882d21f..48efb8d 100644
--- a/src/tint/lang/hlsl/writer/raise/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/raise/BUILD.gn
@@ -61,6 +61,8 @@
     "promote_initializers.h",
     "raise.cc",
     "raise.h",
+    "replace_non_indexable_mat_vec_stores.cc",
+    "replace_non_indexable_mat_vec_stores.h",
     "shader_io.cc",
     "shader_io.h",
   ]
@@ -104,6 +106,7 @@
       "fxc_polyfill_test.cc",
       "localize_struct_array_assignment_test.cc",
       "promote_initializers_test.cc",
+      "replace_non_indexable_mat_vec_stores_test.cc",
       "shader_io_test.cc",
     ]
     deps = [
diff --git a/src/tint/lang/hlsl/writer/raise/raise.cc b/src/tint/lang/hlsl/writer/raise/raise.cc
index feecca8..228d1e4 100644
--- a/src/tint/lang/hlsl/writer/raise/raise.cc
+++ b/src/tint/lang/hlsl/writer/raise/raise.cc
@@ -54,6 +54,7 @@
 #include "src/tint/lang/hlsl/writer/raise/fxc_polyfill.h"
 #include "src/tint/lang/hlsl/writer/raise/localize_struct_array_assignment.h"
 #include "src/tint/lang/hlsl/writer/raise/promote_initializers.h"
+#include "src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h"
 #include "src/tint/lang/hlsl/writer/raise/shader_io.h"
 #include "src/tint/utils/result/result.h"
 
@@ -138,6 +139,7 @@
     if (options.compiler == Options::Compiler::kFXC) {
         RUN_TRANSFORM(raise::FxcPolyfill, module);
         RUN_TRANSFORM(raise::LocalizeStructArrayAssignment, module);
+        RUN_TRANSFORM(raise::ReplaceNonIndexableMatVecStores, module);
     }
 
     if (!options.disable_robustness) {
diff --git a/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.cc b/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.cc
new file mode 100644
index 0000000..1cf3f3f
--- /dev/null
+++ b/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.cc
@@ -0,0 +1,300 @@
+// 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/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h"
+
+#include "src/tint/lang/core/ir/builder.h"
+#include "src/tint/lang/core/ir/validator.h"
+#include "src/tint/utils/result/result.h"
+
+namespace tint::hlsl::writer::raise {
+namespace {
+
+using namespace tint::core::fluent_types;     // NOLINT
+using namespace tint::core::number_suffixes;  // NOLINT
+
+/// 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()};
+
+    const core::type::Type* GetElementType(const core::type::Type* type,
+                                           const core::ir::Value* idx) {
+        if (auto* constant = idx->As<core::ir::Constant>()) {
+            auto i = constant->Value()->ValueAs<u32>();
+            return type->Element(i);
+        }
+        return type->Elements().type;
+    }
+
+    bool IsConstant(core::ir::Value* value) {
+        if (value->Is<core::ir::Constant>()) {
+            return true;
+        }
+        // Also check for lets to constant, which is a common use-case
+        if (auto* result = value->As<core::ir::InstructionResult>()) {
+            if (auto* let = result->Instruction()->As<core::ir::Let>()) {
+                if (let->Value()->Is<core::ir::Constant>()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    // If the input access chain is a dynamic index to a matrix, this function will replace the
+    // input store (either a Store or a StoreVectorElement) with a switch statement over the
+    // dynamic index, with a case for each column index used to index the matrix directly.
+    // Returns a vector of the new Store/StoreVectorElements that were created in each case block.
+    // NOTE: `store` may be destroyed
+    Vector<core::ir::Instruction*, 4> ProcessMatrixColumnAccess(core::ir::Instruction* store,
+                                                                core::ir::Access* const to_access) {
+        // Look for a dynamically indexed matrix through the access chain.
+        // This will always be the last index in the chain.
+
+        // The last index must be dynamic
+        if (IsConstant(to_access->Indices().Back())) {
+            return {};
+        }
+        // Get the root object type
+        const auto* object_ty = to_access->Object()->Type()->As<core::type::Pointer>()->StoreType();
+        const auto indicesButLast =
+            to_access->Indices().Truncate(to_access->Indices().Length() - 1);
+        for (auto* idx : indicesButLast) {
+            object_ty = GetElementType(object_ty, idx);
+        }
+        // It must be a matrix
+        const auto* mat_ty = object_ty->As<core::type::Matrix>();
+        if (!mat_ty) {
+            return {};
+        }
+
+        core::ir::Value* const to = Switch(
+            store,                                                     //
+            [&](core::ir::Store* s) { return s->To(); },               //
+            [&](core::ir::StoreVectorElement* s) { return s->To(); },  //
+            TINT_ICE_ON_NO_MATCH);
+
+        auto* const to_ptr = to->Type()->As<core::type::Pointer>();
+
+        // Instead of indexing the matrix dynamically, we want to replace it with a switch statement
+        // over the dynamic index, with each case in [0-3] emitting the store with a constant index.
+        Vector<core::ir::Instruction*, 4> new_stores;
+
+        b.InsertBefore(store, [&] {
+            // Create access to the matrix we're dynamically indexing
+            core::ir::Value* matrix = to_access->Object();
+            if (!indicesButLast.IsEmpty()) {
+                // Matrix is in a struct or array, for example
+                matrix = b.Access(ty.ptr(to_ptr->AddressSpace(), mat_ty), to_access->Object(),
+                                  ToVector<4>(indicesButLast))
+                             ->Result(0);
+            }
+            // Switch over dynamic index, emitting a case for all possible column indices
+            auto* switch_ = b.Switch(to_access->Indices().Back());
+            for (uint32_t i = 0; i < mat_ty->Columns(); ++i) {
+                b.Append(b.Case(switch_, {b.Constant(u32(i))}), [&] {
+                    auto* const vec_ty = to_ptr->StoreType();
+                    auto* access = b.Access(ty.ptr(to_ptr->AddressSpace(), vec_ty), matrix, u32(i));
+                    auto* new_store = Switch(
+                        store,
+                        [&](core::ir::Store* s) {  //
+                            return b.Store(access, s->From());
+                        },
+                        [&](core::ir::StoreVectorElement* s) {
+                            return b.StoreVectorElement(access, s->Index(), s->Value());
+                        },
+                        TINT_ICE_ON_NO_MATCH);
+                    new_stores.Push(new_store);
+                    b.ExitSwitch(switch_);
+                });
+            }
+            b.Append(b.DefaultCase(switch_), [&] { b.ExitSwitch(switch_); });
+
+            store->Destroy();
+        });
+        TINT_ASSERT(!new_stores.IsEmpty());
+        return new_stores;
+    }
+
+    // Process store to matrix column
+    void ProcessStore(core::ir::Store* store) {
+        // Must be storing to a shader-local variable
+        auto* to_ptr = store->To()->Type()->As<core::type::Pointer>();
+        if (to_ptr->AddressSpace() != core::AddressSpace::kFunction &&
+            to_ptr->AddressSpace() != core::AddressSpace::kPrivate) {
+            return;
+        }
+        // Must be storing a vector
+        if (!to_ptr->StoreType()->Is<core::type::Vector>()) {
+            return;
+        }
+        // Must be storing via an access
+        auto* to = store->To()->As<core::ir::InstructionResult>();
+        if (!to) {
+            return;
+        }
+        auto* to_access = to->Instruction()->As<core::ir::Access>();
+        if (!to_access) {
+            return;
+        }
+        ProcessMatrixColumnAccess(store, to_access);
+    }
+
+    // Replaces the vector element store with a full vector store that masks in the indexed
+    // value. Example HLSL: vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+    void ReplaceStoreVectorElement(core::ir::StoreVectorElement* store) {
+        TINT_ASSERT(!IsConstant(store->Index()));
+        auto* to_ptr = store->To()->Type()->As<core::type::Pointer>();
+        TINT_ASSERT(to_ptr);
+
+        b.InsertBefore(store, [&] {
+            auto* vec_param = store->Operands()[0];
+            auto* index_param = store->Operands()[1];
+            auto* value_param = store->Operands()[2];
+
+            auto* vec_ty = to_ptr->StoreType()->As<core::type::Vector>();
+
+            // e.g. "xxx" for vec3
+            Vector<uint32_t, 4> swizzle_indices;
+            swizzle_indices.Resize(vec_ty->Width(), 0);
+
+            // e.g. "0,1,2" for vec3
+            Vector<core::ir::Value*, 4> select_indices;
+            switch (vec_ty->Width()) {
+                case 2:
+                    select_indices = b.Values(0_i, 1_i);
+                    break;
+                case 3:
+                    select_indices = b.Values(0_i, 1_i, 2_i);
+                    break;
+                case 4:
+                    select_indices = b.Values(0_i, 1_i, 2_i, 3_i);
+                    break;
+            }
+
+            auto* false_val = b.Load(vec_param);
+            auto* true_val = b.Swizzle(vec_ty, value_param, swizzle_indices);
+
+            auto* lhs = b.Swizzle(vec_ty, index_param, swizzle_indices);
+            auto* rhs = b.Construct(vec_ty, select_indices);
+            auto* cond = b.Equal(ty.MatchWidth(ty.bool_(), vec_ty), lhs, rhs);
+
+            // NOTE: Using Select means we depend on BuiltinPolyfill to run after this transform. We
+            // could also just emit a Ternary instruction.
+            auto* result = b.Call(vec_ty, core::BuiltinFn::kSelect, false_val, true_val, cond);
+            b.Store(vec_param, result);
+
+            store->Destroy();
+        });
+    }
+
+    // Process store to vector element for both vector and matrix element stores
+    void ProcessStoreVectorElement(core::ir::StoreVectorElement* store) {
+        auto* to_ptr = store->To()->Type()->As<core::type::Pointer>();
+        if (to_ptr->AddressSpace() != core::AddressSpace::kFunction &&
+            to_ptr->AddressSpace() != core::AddressSpace::kPrivate) {
+            return;
+        }
+        auto* to = store->To()->As<core::ir::InstructionResult>();
+        if (!to) {
+            return;
+        }
+
+        const bool is_dynamic_index = !IsConstant(store->Index());
+
+        // This may be a vector store to a dynamically indexed matrix
+        if (auto* to_access = to->Instruction()->As<core::ir::Access>()) {
+            auto new_stores = ProcessMatrixColumnAccess(store, to_access);
+            if (!new_stores.IsEmpty() && is_dynamic_index) {
+                // The dynamic matrix index has been replaced by a switch with cases containing
+                // multiple StoreVectorElement copies of the input one to this function. If
+                // dynamically indexed, replace each of the new stores and return.
+                for (auto* s : new_stores) {
+                    ReplaceStoreVectorElement(s->As<core::ir::StoreVectorElement>());
+                }
+                return;
+            }
+        }
+
+        // If the index is dynamic, replace
+        if (is_dynamic_index) {
+            ReplaceStoreVectorElement(store);
+        }
+    }
+
+    /// Process the module.
+    void Process() {
+        // Collect stores before processing them
+        Vector<core::ir::Store*, 16> stores;
+        Vector<core::ir::StoreVectorElement*, 16> store_vec_elems;
+        for (auto* inst : ir.Instructions()) {
+            // Inline pointers
+            if (auto* l = inst->As<core::ir::Let>()) {
+                if (l->Result(0)->Type()->Is<core::type::Pointer>()) {
+                    l->Result(0)->ReplaceAllUsesWith(l->Value());
+                    l->Destroy();
+                }
+            }
+
+            if (auto* store = inst->As<core::ir::Store>()) {
+                stores.Push(store);
+            } else if (auto* vector_store = inst->As<core::ir::StoreVectorElement>()) {
+                store_vec_elems.Push(vector_store);
+            }
+        }
+
+        // Process the stores
+        for (auto* store : stores) {
+            ProcessStore(store);
+        }
+        for (auto* store : store_vec_elems) {
+            ProcessStoreVectorElement(store);
+        }
+    }
+};
+
+}  // namespace
+
+Result<SuccessType> ReplaceNonIndexableMatVecStores(core::ir::Module& ir) {
+    auto result = ValidateAndDumpIfNeeded(ir, "ReplaceNonIndexableMatVecStores transform");
+    if (result != Success) {
+        return result.Failure();
+    }
+
+    State{ir}.Process();
+
+    return Success;
+}
+
+}  // namespace tint::hlsl::writer::raise
diff --git a/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h b/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h
new file mode 100644
index 0000000..d109116
--- /dev/null
+++ b/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h
@@ -0,0 +1,57 @@
+// 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_HLSL_WRITER_RAISE_REPLACE_NON_INDEXABLE_MAT_VEC_STORES_H_
+#define SRC_TINT_LANG_HLSL_WRITER_RAISE_REPLACE_NON_INDEXABLE_MAT_VEC_STORES_H_
+
+#include "src/tint/utils/result/result.h"
+
+// Forward declarations.
+namespace tint::core::ir {
+class Module;
+}  // namespace tint::core::ir
+
+namespace tint::hlsl::writer::raise {
+
+/// This transform replaces element stores to dynamically-indexed shader-local matrices or vectors
+/// with full vector stores. This is done to work around FXC's inability to compile in these cases
+/// (see crbug.com/42250349 and crbug.com/42251617).
+///
+/// This transform is similar to LocalizeStructArrayAssignment, but for matrices and vectors. As
+/// with structs of arrays, FXC does not allocate indexable registers to shader-local matrix and
+/// vector variables. For dynamically indexed vectors, we replace the indexed element store with
+/// a full vector store using a selection mask. For dynamically indexed matrices, we replace the
+/// indexed matrix store with a switch over the index, and emit a case for each column that sets the
+/// matrix column by constant index.
+
+/// @param module the module to transform
+/// @returns success or failure
+Result<SuccessType> ReplaceNonIndexableMatVecStores(core::ir::Module& module);
+
+}  // namespace tint::hlsl::writer::raise
+
+#endif  // SRC_TINT_LANG_HLSL_WRITER_RAISE_REPLACE_NON_INDEXABLE_MAT_VEC_STORES_H_
diff --git a/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores_test.cc b/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores_test.cc
new file mode 100644
index 0000000..f77e48c
--- /dev/null
+++ b/src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores_test.cc
@@ -0,0 +1,2041 @@
+// 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/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h"
+
+#include <gtest/gtest.h>
+
+#include "src/tint/lang/core/fluent_types.h"
+#include "src/tint/lang/core/ir/function.h"
+#include "src/tint/lang/core/ir/transform/helper_test.h"
+#include "src/tint/lang/core/number.h"
+
+using namespace tint::core::fluent_types;     // NOLINT
+using namespace tint::core::number_suffixes;  // NOLINT
+
+namespace tint::hlsl::writer::raise {
+namespace {
+
+using HlslWriterReplaceNonIndexableMatVecStoresTest = core::ir::transform::TransformTest;
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, Vector) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.vec3<f32>()));
+        b.StoreVectorElement(v, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(v, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, vec3<f32>, read_write> = var
+    %5:u32 = load %dyn_index
+    store_vector_element %v, %5, 1.0f
+    store_vector_element %v, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, vec3<f32>, read_write> = var
+    %5:u32 = load %dyn_index
+    %6:vec3<f32> = load %v
+    %7:vec3<f32> = swizzle 1.0f, xxx
+    %8:vec3<f32> = swizzle %5, xxx
+    %9:vec3<f32> = construct 0i, 1i, 2i
+    %10:vec3<bool> = eq %8, %9
+    %11:vec3<f32> = select %6, %7, %10
+    store %v, %11
+    store_vector_element %v, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, VectorInStruct) {
+    auto* vec_ty = ty.vec3<f32>();
+    auto* struct_ty = ty.Struct(mod.symbols.New("S"), {{mod.symbols.New("v"), vec_ty}});
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(struct_ty));
+        auto* access = b.Access(ty.ptr<function>(vec_ty), v, 0_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+S = struct @align(16) {
+  v:vec3<f32> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec3<f32>, read_write> = access %v, 0u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+S = struct @align(16) {
+  v:vec3<f32> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec3<f32>, read_write> = access %v, 0u
+    %6:u32 = load %dyn_index
+    %7:vec3<f32> = load %5
+    %8:vec3<f32> = swizzle 1.0f, xxx
+    %9:vec3<f32> = swizzle %6, xxx
+    %10:vec3<f32> = construct 0i, 1i, 2i
+    %11:vec3<bool> = eq %9, %10
+    %12:vec3<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, VectorInArray) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* vec_ty = ty.vec3<f32>();
+        auto* v = b.Var("v", ty.ptr<function>(ty.array(vec_ty, 8)));
+        auto* access = b.Access(ty.ptr<function>(vec_ty), v, 0_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, array<vec3<f32>, 8>, read_write> = var
+    %5:ptr<function, vec3<f32>, read_write> = access %v, 0u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, array<vec3<f32>, 8>, read_write> = var
+    %5:ptr<function, vec3<f32>, read_write> = access %v, 0u
+    %6:u32 = load %dyn_index
+    %7:vec3<f32> = load %5
+    %8:vec3<f32> = swizzle 1.0f, xxx
+    %9:vec3<f32> = swizzle %6, xxx
+    %10:vec3<f32> = construct 0i, 1i, 2i
+    %11:vec3<bool> = eq %9, %10
+    %12:vec3<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, VectorInArrayInStruct) {
+    auto* vec_ty = ty.vec3<f32>();
+    auto* struct_ty =
+        ty.Struct(mod.symbols.New("S"), {{mod.symbols.New("v"), ty.array(vec_ty, 8)}});
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(struct_ty));
+        auto* access = b.Access(ty.ptr<function>(vec_ty), v, 0_u, 0_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+S = struct @align(16) {
+  v:array<vec3<f32>, 8> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec3<f32>, read_write> = access %v, 0u, 0u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+S = struct @align(16) {
+  v:array<vec3<f32>, 8> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec3<f32>, read_write> = access %v, 0u, 0u
+    %6:u32 = load %dyn_index
+    %7:vec3<f32> = load %5
+    %8:vec3<f32> = swizzle 1.0f, xxx
+    %9:vec3<f32> = swizzle %6, xxx
+    %10:vec3<f32> = construct 0i, 1i, 2i
+    %11:vec3<bool> = eq %9, %10
+    %12:vec3<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, VectorByFunc) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* get_dynamic = b.Function("get_dynamic", ty.u32());
+    b.Append(get_dynamic->Block(), [&] { b.Return(get_dynamic, b.Load(dyn_index)); });
+    auto* get_static = b.Function("get_static", ty.u32());
+    b.Append(get_static->Block(), [&] { b.Return(get_static, 0_u); });
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* v = b.Var("v", ty.ptr<function>(ty.vec3<f32>()));
+        b.StoreVectorElement(v, b.Call(get_dynamic), 1_f);
+        // Will be transformed because we assume functions return a dynamic value
+        b.StoreVectorElement(v, b.Call(get_static), 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%get_dynamic = func():u32 {
+  $B2: {
+    %3:u32 = load %dyn_index
+    ret %3
+  }
+}
+%get_static = func():u32 {
+  $B3: {
+    ret 0u
+  }
+}
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B4: {
+    %v:ptr<function, vec3<f32>, read_write> = var
+    %7:u32 = call %get_dynamic
+    store_vector_element %v, %7, 1.0f
+    %8:u32 = call %get_static
+    store_vector_element %v, %8, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%get_dynamic = func():u32 {
+  $B2: {
+    %3:u32 = load %dyn_index
+    ret %3
+  }
+}
+%get_static = func():u32 {
+  $B3: {
+    ret 0u
+  }
+}
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B4: {
+    %v:ptr<function, vec3<f32>, read_write> = var
+    %7:u32 = call %get_dynamic
+    %8:vec3<f32> = load %v
+    %9:vec3<f32> = swizzle 1.0f, xxx
+    %10:vec3<f32> = swizzle %7, xxx
+    %11:vec3<f32> = construct 0i, 1i, 2i
+    %12:vec3<bool> = eq %10, %11
+    %13:vec3<f32> = select %8, %9, %12
+    store %v, %13
+    %14:u32 = call %get_static
+    %15:vec3<f32> = load %v
+    %16:vec3<f32> = swizzle 1.0f, xxx
+    %17:vec3<f32> = swizzle %14, xxx
+    %18:vec3<f32> = construct 0i, 1i, 2i
+    %19:vec3<bool> = eq %17, %18
+    %20:vec3<f32> = select %15, %16, %19
+    store %v, %20
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, Vector_ViaPointer) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.vec3<f32>()));
+        auto* p = b.Let("p", v);
+        b.StoreVectorElement(p, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(p, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, vec3<f32>, read_write> = var
+    %p:ptr<function, vec3<f32>, read_write> = let %v
+    %6:u32 = load %dyn_index
+    store_vector_element %p, %6, 1.0f
+    store_vector_element %p, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, vec3<f32>, read_write> = var
+    %5:u32 = load %dyn_index
+    %6:vec3<f32> = load %v
+    %7:vec3<f32> = swizzle 1.0f, xxx
+    %8:vec3<f32> = swizzle %5, xxx
+    %9:vec3<f32> = construct 0i, 1i, 2i
+    %10:vec3<bool> = eq %8, %9
+    %11:vec3<f32> = select %6, %7, %10
+    store %v, %11
+    store_vector_element %v, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, Vector_PrivateVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<private_>(ty.vec3<f32>()));
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        b.StoreVectorElement(v, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(v, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<private, vec3<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:u32 = load %dyn_index
+    store_vector_element %v, %5, 1.0f
+    store_vector_element %v, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<private, vec3<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:u32 = load %dyn_index
+    %6:vec3<f32> = load %v
+    %7:vec3<f32> = swizzle 1.0f, xxx
+    %8:vec3<f32> = swizzle %5, xxx
+    %9:vec3<f32> = construct 0i, 1i, 2i
+    %10:vec3<bool> = eq %8, %9
+    %11:vec3<f32> = select %6, %7, %10
+    store %v, %11
+    store_vector_element %v, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, Vector_StorageVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<storage>(ty.vec3<f32>()));
+    v->SetBindingPoint(0, 1);
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        b.StoreVectorElement(v, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(v, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<storage, vec3<f32>, read_write> = var @binding_point(0, 1)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:u32 = load %dyn_index
+    store_vector_element %v, %5, 1.0f
+    store_vector_element %v, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, Vector_WorkgroupVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<workgroup>(ty.vec3<f32>()));
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        b.StoreVectorElement(v, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(v, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<workgroup, vec3<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:u32 = load %dyn_index
+    store_vector_element %v, %5, 1.0f
+    store_vector_element %v, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElement) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.mat2x4<f32>()));
+        auto* access = b.Access(ty.ptr<function, vec4<f32>>(), v, 1_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 1u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 1u
+    %6:u32 = load %dyn_index
+    %7:vec4<f32> = load %5
+    %8:vec4<f32> = swizzle 1.0f, xxxx
+    %9:vec4<f32> = swizzle %6, xxxx
+    %10:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %11:vec4<bool> = eq %9, %10
+    %12:vec4<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElementInStruct) {
+    auto* mat_ty = ty.mat2x4<f32>();
+    auto* struct_ty = ty.Struct(mod.symbols.New("S"), {{mod.symbols.New("v"), mat_ty}});
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(struct_ty));
+        auto* access = b.Access(ty.ptr<function, vec4<f32>>(), v, 0_u, 1_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+S = struct @align(16) {
+  v:mat2x4<f32> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 0u, 1u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+S = struct @align(16) {
+  v:mat2x4<f32> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 0u, 1u
+    %6:u32 = load %dyn_index
+    %7:vec4<f32> = load %5
+    %8:vec4<f32> = swizzle 1.0f, xxxx
+    %9:vec4<f32> = swizzle %6, xxxx
+    %10:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %11:vec4<bool> = eq %9, %10
+    %12:vec4<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElementInArray) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.array(ty.mat2x4<f32>(), 8)));
+        auto* access = b.Access(ty.ptr<function, vec4<f32>>(), v, 7_u, 1_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, array<mat2x4<f32>, 8>, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 7u, 1u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, array<mat2x4<f32>, 8>, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 7u, 1u
+    %6:u32 = load %dyn_index
+    %7:vec4<f32> = load %5
+    %8:vec4<f32> = swizzle 1.0f, xxxx
+    %9:vec4<f32> = swizzle %6, xxxx
+    %10:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %11:vec4<bool> = eq %9, %10
+    %12:vec4<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElementInArrayInStruct) {
+    auto* mat_ty = ty.mat2x4<f32>();
+    auto* struct_ty =
+        ty.Struct(mod.symbols.New("S"), {{mod.symbols.New("v"), ty.array(mat_ty, 8)}});
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(struct_ty));
+        auto* access = b.Access(ty.ptr<function, vec4<f32>>(), v, 0_u, 7_u, 1_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+S = struct @align(16) {
+  v:array<mat2x4<f32>, 8> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 0u, 7u, 1u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+S = struct @align(16) {
+  v:array<mat2x4<f32>, 8> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 0u, 7u, 1u
+    %6:u32 = load %dyn_index
+    %7:vec4<f32> = load %5
+    %8:vec4<f32> = swizzle 1.0f, xxxx
+    %9:vec4<f32> = swizzle %6, xxxx
+    %10:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %11:vec4<bool> = eq %9, %10
+    %12:vec4<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+// MatrixElementByFunc
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElementByFunc) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* get_dynamic = b.Function("get_dynamic", ty.u32());
+    b.Append(get_dynamic->Block(), [&] { b.Return(get_dynamic, b.Load(dyn_index)); });
+    auto* get_static = b.Function("get_static", ty.u32());
+    b.Append(get_static->Block(), [&] { b.Return(get_static, 0_u); });
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* v = b.Var("v", ty.ptr<function>(ty.mat2x4<f32>()));
+        auto* access = b.Access(ty.ptr<function, vec4<f32>>(), v, 1_u);
+        b.StoreVectorElement(access, b.Call(get_dynamic), 1_f);
+        // Will be transformed because we assume functions return a dynamic value
+        b.StoreVectorElement(access, b.Call(get_static), 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%get_dynamic = func():u32 {
+  $B2: {
+    %3:u32 = load %dyn_index
+    ret %3
+  }
+}
+%get_static = func():u32 {
+  $B3: {
+    ret 0u
+  }
+}
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B4: {
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 1u
+    %8:u32 = call %get_dynamic
+    store_vector_element %7, %8, 1.0f
+    %9:u32 = call %get_static
+    store_vector_element %7, %9, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%get_dynamic = func():u32 {
+  $B2: {
+    %3:u32 = load %dyn_index
+    ret %3
+  }
+}
+%get_static = func():u32 {
+  $B3: {
+    ret 0u
+  }
+}
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B4: {
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 1u
+    %8:u32 = call %get_dynamic
+    %9:vec4<f32> = load %7
+    %10:vec4<f32> = swizzle 1.0f, xxxx
+    %11:vec4<f32> = swizzle %8, xxxx
+    %12:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %13:vec4<bool> = eq %11, %12
+    %14:vec4<f32> = select %9, %10, %13
+    store %7, %14
+    %15:u32 = call %get_static
+    %16:vec4<f32> = load %7
+    %17:vec4<f32> = swizzle 1.0f, xxxx
+    %18:vec4<f32> = swizzle %15, xxxx
+    %19:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %20:vec4<bool> = eq %18, %19
+    %21:vec4<f32> = select %16, %17, %20
+    store %7, %21
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElement_ViaPointer) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.mat2x4<f32>()));
+        auto* access = b.Access(ty.ptr<function, vec4<f32>>(), v, 1_u);
+        auto* p = b.Let("p", access);
+        b.StoreVectorElement(p, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(p, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 1u
+    %p:ptr<function, vec4<f32>, read_write> = let %5
+    %7:u32 = load %dyn_index
+    store_vector_element %p, %7, 1.0f
+    store_vector_element %p, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:ptr<function, vec4<f32>, read_write> = access %v, 1u
+    %6:u32 = load %dyn_index
+    %7:vec4<f32> = load %5
+    %8:vec4<f32> = swizzle 1.0f, xxxx
+    %9:vec4<f32> = swizzle %6, xxxx
+    %10:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %11:vec4<bool> = eq %9, %10
+    %12:vec4<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElement_PrivateVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<private_>(ty.mat2x4<f32>()));
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* access = b.Access(ty.ptr<private_, vec4<f32>>(), v, 1_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<private, mat2x4<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:ptr<private, vec4<f32>, read_write> = access %v, 1u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<private, mat2x4<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:ptr<private, vec4<f32>, read_write> = access %v, 1u
+    %6:u32 = load %dyn_index
+    %7:vec4<f32> = load %5
+    %8:vec4<f32> = swizzle 1.0f, xxxx
+    %9:vec4<f32> = swizzle %6, xxxx
+    %10:vec4<f32> = construct 0i, 1i, 2i, 3i
+    %11:vec4<bool> = eq %9, %10
+    %12:vec4<f32> = select %7, %8, %11
+    store %5, %12
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElement_StorageVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<storage>(ty.mat2x4<f32>()));
+    v->SetBindingPoint(0, 1);
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* access = b.Access(ty.ptr<storage, vec4<f32>>(), v, 1_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<storage, mat2x4<f32>, read_write> = var @binding_point(0, 1)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:ptr<storage, vec4<f32>, read_write> = access %v, 1u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixElement_WorkgroupVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<workgroup>(ty.mat2x4<f32>()));
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* access = b.Access(ty.ptr<workgroup, vec4<f32>>(), v, 1_u);
+        b.StoreVectorElement(access, b.Load(dyn_index), 1_f);
+        b.StoreVectorElement(access, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<workgroup, mat2x4<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:ptr<workgroup, vec4<f32>, read_write> = access %v, 1u
+    %6:u32 = load %dyn_index
+    store_vector_element %5, %6, 1.0f
+    store_vector_element %5, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumn) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.mat2x4<f32>()));
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<function, vec4<f32>>(), v, b.Load(dyn_index));
+        b.Store(access0, vec);
+        auto* access1 = b.Access(ty.ptr<function, vec4<f32>>(), v, static_index);
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, %6
+    store %7, %5
+    %8:ptr<function, vec4<f32>, read_write> = access %v, %static_index
+    store %8, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, %6
+    switch %6 [c: (0u, $B3), c: (1u, $B4), c: (default, $B5)] {  # switch_1
+      $B3: {  # case
+        %8:ptr<function, vec4<f32>, read_write> = access %v, 0u
+        store %8, %5
+        exit_switch  # switch_1
+      }
+      $B4: {  # case
+        %9:ptr<function, vec4<f32>, read_write> = access %v, 1u
+        store %9, %5
+        exit_switch  # switch_1
+      }
+      $B5: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %10:ptr<function, vec4<f32>, read_write> = access %v, %static_index
+    store %10, %5
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumnInStruct) {
+    auto* mat_ty = ty.mat2x4<f32>();
+    auto* struct_ty = ty.Struct(mod.symbols.New("S"), {{mod.symbols.New("v"), mat_ty}});
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(struct_ty));
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<function, vec4<f32>>(), v, 0_u, b.Load(dyn_index));
+        b.Store(access0, vec);
+        auto* access1 = b.Access(ty.ptr<function, vec4<f32>>(), v, 0_u, static_index);
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+S = struct @align(16) {
+  v:mat2x4<f32> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 0u, %6
+    store %7, %5
+    %8:ptr<function, vec4<f32>, read_write> = access %v, 0u, %static_index
+    store %8, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+S = struct @align(16) {
+  v:mat2x4<f32> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 0u, %6
+    %8:ptr<function, mat2x4<f32>, read_write> = access %v, 0u
+    switch %6 [c: (0u, $B3), c: (1u, $B4), c: (default, $B5)] {  # switch_1
+      $B3: {  # case
+        %9:ptr<function, vec4<f32>, read_write> = access %8, 0u
+        store %9, %5
+        exit_switch  # switch_1
+      }
+      $B4: {  # case
+        %10:ptr<function, vec4<f32>, read_write> = access %8, 1u
+        store %10, %5
+        exit_switch  # switch_1
+      }
+      $B5: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %11:ptr<function, vec4<f32>, read_write> = access %v, 0u, %static_index
+    store %11, %5
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumnInArray) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.array(ty.mat2x4<f32>(), 8)));
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<function, vec4<f32>>(), v, 7_u, b.Load(dyn_index));
+        b.Store(access0, vec);
+        auto* access1 = b.Access(ty.ptr<function, vec4<f32>>(), v, 7_u, static_index);
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, array<mat2x4<f32>, 8>, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 7u, %6
+    store %7, %5
+    %8:ptr<function, vec4<f32>, read_write> = access %v, 7u, %static_index
+    store %8, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, array<mat2x4<f32>, 8>, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 7u, %6
+    %8:ptr<function, mat2x4<f32>, read_write> = access %v, 7u
+    switch %6 [c: (0u, $B3), c: (1u, $B4), c: (default, $B5)] {  # switch_1
+      $B3: {  # case
+        %9:ptr<function, vec4<f32>, read_write> = access %8, 0u
+        store %9, %5
+        exit_switch  # switch_1
+      }
+      $B4: {  # case
+        %10:ptr<function, vec4<f32>, read_write> = access %8, 1u
+        store %10, %5
+        exit_switch  # switch_1
+      }
+      $B5: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %11:ptr<function, vec4<f32>, read_write> = access %v, 7u, %static_index
+    store %11, %5
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumnInArrayInStruct) {
+    auto* mat_ty = ty.mat2x4<f32>();
+    auto* struct_ty =
+        ty.Struct(mod.symbols.New("S"), {{mod.symbols.New("v"), ty.array(mat_ty, 8)}});
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(struct_ty));
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<function, vec4<f32>>(), v, 0_u, 7_u, b.Load(dyn_index));
+        b.Store(access0, vec);
+        auto* access1 = b.Access(ty.ptr<function, vec4<f32>>(), v, 0_u, 7_u, static_index);
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+S = struct @align(16) {
+  v:array<mat2x4<f32>, 8> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 0u, 7u, %6
+    store %7, %5
+    %8:ptr<function, vec4<f32>, read_write> = access %v, 0u, 7u, %static_index
+    store %8, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+S = struct @align(16) {
+  v:array<mat2x4<f32>, 8> @offset(0)
+}
+
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, S, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, 0u, 7u, %6
+    %8:ptr<function, mat2x4<f32>, read_write> = access %v, 0u, 7u
+    switch %6 [c: (0u, $B3), c: (1u, $B4), c: (default, $B5)] {  # switch_1
+      $B3: {  # case
+        %9:ptr<function, vec4<f32>, read_write> = access %8, 0u
+        store %9, %5
+        exit_switch  # switch_1
+      }
+      $B4: {  # case
+        %10:ptr<function, vec4<f32>, read_write> = access %8, 1u
+        store %10, %5
+        exit_switch  # switch_1
+      }
+      $B5: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %11:ptr<function, vec4<f32>, read_write> = access %v, 0u, 7u, %static_index
+    store %11, %5
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumnByFunc) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* get_dynamic = b.Function("get_dynamic", ty.u32());
+    b.Append(get_dynamic->Block(), [&] { b.Return(get_dynamic, b.Load(dyn_index)); });
+    auto* get_static = b.Function("get_static", ty.u32());
+    b.Append(get_static->Block(), [&] { b.Return(get_static, 0_u); });
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* v = b.Var("v", ty.ptr<function>(ty.mat2x4<f32>()));
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<function, vec4<f32>>(), v, b.Call(get_dynamic));
+        b.Store(access0, vec);
+        // Will be transformed because we assume functions return a dynamic value
+        auto* access1 = b.Access(ty.ptr<function, vec4<f32>>(), v, b.Call(get_static));
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%get_dynamic = func():u32 {
+  $B2: {
+    %3:u32 = load %dyn_index
+    ret %3
+  }
+}
+%get_static = func():u32 {
+  $B3: {
+    ret 0u
+  }
+}
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B4: {
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %7:vec4<f32> = construct 0.0f
+    %8:u32 = call %get_dynamic
+    %9:ptr<function, vec4<f32>, read_write> = access %v, %8
+    store %9, %7
+    %10:u32 = call %get_static
+    %11:ptr<function, vec4<f32>, read_write> = access %v, %10
+    store %11, %7
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%get_dynamic = func():u32 {
+  $B2: {
+    %3:u32 = load %dyn_index
+    ret %3
+  }
+}
+%get_static = func():u32 {
+  $B3: {
+    ret 0u
+  }
+}
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B4: {
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %7:vec4<f32> = construct 0.0f
+    %8:u32 = call %get_dynamic
+    %9:ptr<function, vec4<f32>, read_write> = access %v, %8
+    switch %8 [c: (0u, $B5), c: (1u, $B6), c: (default, $B7)] {  # switch_1
+      $B5: {  # case
+        %10:ptr<function, vec4<f32>, read_write> = access %v, 0u
+        store %10, %7
+        exit_switch  # switch_1
+      }
+      $B6: {  # case
+        %11:ptr<function, vec4<f32>, read_write> = access %v, 1u
+        store %11, %7
+        exit_switch  # switch_1
+      }
+      $B7: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %12:u32 = call %get_static
+    %13:ptr<function, vec4<f32>, read_write> = access %v, %12
+    switch %12 [c: (0u, $B8), c: (1u, $B9), c: (default, $B10)] {  # switch_2
+      $B8: {  # case
+        %14:ptr<function, vec4<f32>, read_write> = access %v, 0u
+        store %14, %7
+        exit_switch  # switch_2
+      }
+      $B9: {  # case
+        %15:ptr<function, vec4<f32>, read_write> = access %v, 1u
+        store %15, %7
+        exit_switch  # switch_2
+      }
+      $B10: {  # case
+        exit_switch  # switch_2
+      }
+    }
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumn_ViaPointer) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.mat2x4<f32>()));
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<function, vec4<f32>>(), v, b.Load(dyn_index));
+        auto* p0 = b.Let("p0", access0);
+        b.Store(p0, vec);
+        auto* access1 = b.Access(ty.ptr<function, vec4<f32>>(), v, static_index);
+        auto* p1 = b.Let("p1", access1);
+        b.Store(p1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, %6
+    %p0:ptr<function, vec4<f32>, read_write> = let %7
+    store %p0, %5
+    %9:ptr<function, vec4<f32>, read_write> = access %v, %static_index
+    %p1:ptr<function, vec4<f32>, read_write> = let %9
+    store %p1, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<function, vec4<f32>, read_write> = access %v, %6
+    switch %6 [c: (0u, $B3), c: (1u, $B4), c: (default, $B5)] {  # switch_1
+      $B3: {  # case
+        %8:ptr<function, vec4<f32>, read_write> = access %v, 0u
+        store %8, %5
+        exit_switch  # switch_1
+      }
+      $B4: {  # case
+        %9:ptr<function, vec4<f32>, read_write> = access %v, 1u
+        store %9, %5
+        exit_switch  # switch_1
+      }
+      $B5: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %10:ptr<function, vec4<f32>, read_write> = access %v, %static_index
+    store %10, %5
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumn_PrivateVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<private_>(ty.mat2x4<f32>()));
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<private_, vec4<f32>>(), v, b.Load(dyn_index));
+        b.Store(access0, vec);
+        auto* access1 = b.Access(ty.ptr<private_, vec4<f32>>(), v, static_index);
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<private, mat2x4<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<private, vec4<f32>, read_write> = access %v, %6
+    store %7, %5
+    %8:ptr<private, vec4<f32>, read_write> = access %v, %static_index
+    store %8, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<private, mat2x4<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<private, vec4<f32>, read_write> = access %v, %6
+    switch %6 [c: (0u, $B3), c: (1u, $B4), c: (default, $B5)] {  # switch_1
+      $B3: {  # case
+        %8:ptr<private, vec4<f32>, read_write> = access %v, 0u
+        store %8, %5
+        exit_switch  # switch_1
+      }
+      $B4: {  # case
+        %9:ptr<private, vec4<f32>, read_write> = access %v, 1u
+        store %9, %5
+        exit_switch  # switch_1
+      }
+      $B5: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %10:ptr<private, vec4<f32>, read_write> = access %v, %static_index
+    store %10, %5
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumn_StorageVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<storage>(ty.mat2x4<f32>()));
+    v->SetBindingPoint(0, 1);
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<storage, vec4<f32>>(), v, b.Load(dyn_index));
+        b.Store(access0, vec);
+        auto* access1 = b.Access(ty.ptr<storage, vec4<f32>>(), v, static_index);
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<storage, mat2x4<f32>, read_write> = var @binding_point(0, 1)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<storage, vec4<f32>, read_write> = access %v, %6
+    store %7, %5
+    %8:ptr<storage, vec4<f32>, read_write> = access %v, %static_index
+    store %8, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumn_WorkgroupVar) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+    auto* v = b.Var("v", ty.ptr<workgroup>(ty.mat2x4<f32>()));
+    mod.root_block->Append(v);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* vec = b.Construct(ty.vec4<f32>(), 0_f);
+        auto* access0 = b.Access(ty.ptr<workgroup, vec4<f32>>(), v, b.Load(dyn_index));
+        b.Store(access0, vec);
+        auto* access1 = b.Access(ty.ptr<workgroup, vec4<f32>>(), v, static_index);
+        b.Store(access1, vec);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+  %v:ptr<workgroup, mat2x4<f32>, read_write> = var
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %5:vec4<f32> = construct 0.0f
+    %6:u32 = load %dyn_index
+    %7:ptr<workgroup, vec4<f32>, read_write> = access %v, %6
+    store %7, %5
+    %8:ptr<workgroup, vec4<f32>, read_write> = access %v, %static_index
+    store %8, %5
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterReplaceNonIndexableMatVecStoresTest, MatrixColumnAndElement) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* func = b.Function("main", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+    b.Append(func->Block(), [&] {
+        auto* static_index = b.Let("static_index", 0_u);
+        auto* v = b.Var("v", ty.ptr<function>(ty.mat2x4<f32>()));
+        auto* access0 = b.Access(ty.ptr<function, vec4<f32>>(), v, b.Load(dyn_index));
+        b.StoreVectorElement(access0, b.Load(dyn_index), 1_f);
+        auto* access1 = b.Access(ty.ptr<function, vec4<f32>>(), v, static_index);
+        b.StoreVectorElement(access1, static_index, 1_f);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:u32 = load %dyn_index
+    %6:ptr<function, vec4<f32>, read_write> = access %v, %5
+    %7:u32 = load %dyn_index
+    store_vector_element %6, %7, 1.0f
+    %8:ptr<function, vec4<f32>, read_write> = access %v, %static_index
+    store_vector_element %8, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    %static_index:u32 = let 0u
+    %v:ptr<function, mat2x4<f32>, read_write> = var
+    %5:u32 = load %dyn_index
+    %6:ptr<function, vec4<f32>, read_write> = access %v, %5
+    %7:u32 = load %dyn_index
+    switch %5 [c: (0u, $B3), c: (1u, $B4), c: (default, $B5)] {  # switch_1
+      $B3: {  # case
+        %8:ptr<function, vec4<f32>, read_write> = access %v, 0u
+        %9:vec4<f32> = load %8
+        %10:vec4<f32> = swizzle 1.0f, xxxx
+        %11:vec4<f32> = swizzle %7, xxxx
+        %12:vec4<f32> = construct 0i, 1i, 2i, 3i
+        %13:vec4<bool> = eq %11, %12
+        %14:vec4<f32> = select %9, %10, %13
+        store %8, %14
+        exit_switch  # switch_1
+      }
+      $B4: {  # case
+        %15:ptr<function, vec4<f32>, read_write> = access %v, 1u
+        %16:vec4<f32> = load %15
+        %17:vec4<f32> = swizzle 1.0f, xxxx
+        %18:vec4<f32> = swizzle %7, xxxx
+        %19:vec4<f32> = construct 0i, 1i, 2i, 3i
+        %20:vec4<bool> = eq %18, %19
+        %21:vec4<f32> = select %16, %17, %20
+        store %15, %21
+        exit_switch  # switch_1
+      }
+      $B5: {  # case
+        exit_switch  # switch_1
+      }
+    }
+    %22:ptr<function, vec4<f32>, read_write> = access %v, %static_index
+    store_vector_element %22, %static_index, 1.0f
+    ret
+  }
+}
+)";
+
+    Run(ReplaceNonIndexableMatVecStores);
+
+    EXPECT_EQ(expect, str());
+}
+
+}  // namespace
+}  // namespace tint::hlsl::writer::raise
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.ir.fxc.hlsl
index 90cc569..f87c5c2 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,22 @@
 [numthreads(1, 1, 1)]
 void main() {
   float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
-  m1[uniforms[0u].x][0] = 1.0f;
+  uint v = uniforms[0u].x;
+  switch(v) {
+    case 0u:
+    {
+      m1[0u][int(0)] = 1.0f;
+      break;
+    }
+    case 1u:
+    {
+      m1[1u][int(0)] = 1.0f;
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-20): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl
index b2d4f59..0751a3d 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,25 @@
 [numthreads(1, 1, 1)]
 void main() {
   float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
-  m1[uniforms[0u].x][uniforms[0u].y] = 1.0f;
+  uint v = uniforms[0u].x;
+  uint v_1 = uniforms[0u].y;
+  switch(v) {
+    case 0u:
+    {
+      float4 v_2 = m1[0u];
+      m1[0u] = (((v_1.xxxx == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_2));
+      break;
+    }
+    case 1u:
+    {
+      float4 v_3 = m1[1u];
+      m1[1u] = (((v_1.xxxx == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_3));
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-20): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.ir.fxc.hlsl
index f12523a..6fa43fc 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,8 @@
 static float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
 [numthreads(1, 1, 1)]
 void main() {
-  m1[0][uniforms[0u].y] = 1.0f;
+  float4 v = m1[int(0)];
+  float4 v_1 = uniforms[0u].y.xxxx;
+  m1[int(0)] = (((v_1 == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v));
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-23): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.ir.fxc.hlsl
index e10bf36..99effaf 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,22 @@
 [numthreads(1, 1, 1)]
 void main() {
   float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
-  m1[uniforms[0u].x] = (1.0f).xxxx;
+  uint v = uniforms[0u].x;
+  switch(v) {
+    case 0u:
+    {
+      m1[0u] = (1.0f).xxxx;
+      break;
+    }
+    case 1u:
+    {
+      m1[1u] = (1.0f).xxxx;
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-20): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.ir.fxc.hlsl
index 5f16a9d..3f4f699 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,22 @@
 static float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
 [numthreads(1, 1, 1)]
 void main() {
-  m1[uniforms[0u].x][0] = 1.0f;
+  uint v = uniforms[0u].x;
+  switch(v) {
+    case 0u:
+    {
+      m1[0u][int(0)] = 1.0f;
+      break;
+    }
+    case 1u:
+    {
+      m1[1u][int(0)] = 1.0f;
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-20): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl
index c91def8..fc07399 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,25 @@
 static float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
 [numthreads(1, 1, 1)]
 void main() {
-  m1[uniforms[0u].x][uniforms[0u].y] = 1.0f;
+  uint v = uniforms[0u].x;
+  uint v_1 = uniforms[0u].y;
+  switch(v) {
+    case 0u:
+    {
+      float4 v_2 = m1[0u];
+      m1[0u] = (((v_1.xxxx == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_2));
+      break;
+    }
+    case 1u:
+    {
+      float4 v_3 = m1[1u];
+      m1[1u] = (((v_1.xxxx == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_3));
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-20): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.ir.fxc.hlsl
index f12523a..6fa43fc 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,8 @@
 static float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
 [numthreads(1, 1, 1)]
 void main() {
-  m1[0][uniforms[0u].y] = 1.0f;
+  float4 v = m1[int(0)];
+  float4 v_1 = uniforms[0u].y.xxxx;
+  m1[int(0)] = (((v_1 == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v));
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-23): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.ir.fxc.hlsl
index b8f8b30..25208fe 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_uniforms : register(b4, space1) {
   uint4 uniforms[1];
@@ -7,11 +5,22 @@
 static float2x4 m1 = float2x4((0.0f).xxxx, (0.0f).xxxx);
 [numthreads(1, 1, 1)]
 void main() {
-  m1[uniforms[0u].x] = (1.0f).xxxx;
+  uint v = uniforms[0u].x;
+  switch(v) {
+    case 0u:
+    {
+      m1[0u] = (1.0f).xxxx;
+      break;
+    }
+    case 1u:
+    {
+      m1[1u] = (1.0f).xxxx;
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-20): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/vector_assignment_dynamic_index/function_var.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_dynamic_index/function_var.wgsl.expected.ir.fxc.hlsl
index a0e620d..78a74a4 100644
--- a/test/tint/bug/fxc/vector_assignment_dynamic_index/function_var.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_dynamic_index/function_var.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_i : register(b0) {
   uint4 i[1];
@@ -7,11 +5,8 @@
 [numthreads(1, 1, 1)]
 void main() {
   float3 v1 = (0.0f).xxx;
-  v1[i[0u].x] = 1.0f;
+  float3 v = v1;
+  float3 v_1 = i[0u].x.xxx;
+  v1 = (((v_1 == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v));
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-13): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/vector_assignment_dynamic_index/private_var.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_dynamic_index/private_var.wgsl.expected.ir.fxc.hlsl
index 4545f7c..b3df419 100644
--- a/test/tint/bug/fxc/vector_assignment_dynamic_index/private_var.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_dynamic_index/private_var.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 
 cbuffer cbuffer_i : register(b0) {
   uint4 i[1];
@@ -7,11 +5,8 @@
 static float3 v1 = (0.0f).xxx;
 [numthreads(1, 1, 1)]
 void main() {
-  v1[i[0u].x] = 1.0f;
+  float3 v = v1;
+  float3 v_1 = i[0u].x.xxx;
+  v1 = (((v_1 == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v));
 }
 
-FXC validation failure:
-<scrubbed_path>(8,3-13): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.ir.fxc.hlsl
index cc983da..75dba2e 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.ir.fxc.hlsl
@@ -11,10 +11,18 @@
       } else {
         break;
       }
-      v2f[i] = 1.0f;
-      v3i[i] = int(1);
-      v4u[i] = 1u;
-      v2b[i] = true;
+      float2 v = v2f;
+      float2 v_1 = i.xx;
+      v2f = (((v_1 == float2(int(0), int(1)))) ? (1.0f.xx) : (v));
+      int3 v_2 = v3i;
+      int3 v_3 = i.xxx;
+      v3i = (((v_3 == int3(int(0), int(1), int(2)))) ? (int(1).xxx) : (v_2));
+      uint4 v_4 = v4u;
+      uint4 v_5 = i.xxxx;
+      v4u = (((v_5 == uint4(int(0), int(1), int(2), int(3)))) ? (1u.xxxx) : (v_4));
+      bool2 v_6 = v2b;
+      bool2 v_7 = i.xx;
+      v2b = (((v_7 == bool2(int(0), int(1)))) ? (true.xx) : (v_6));
       {
         i = (i + int(1));
       }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.ir.fxc.hlsl
index efcfa31..de7c05e 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.ir.fxc.hlsl
@@ -5,10 +5,18 @@
 static bool2 v2b = (false).xx;
 void foo() {
   int i = int(0);
-  v2f[i] = 1.0f;
-  v3i[i] = int(1);
-  v4u[i] = 1u;
-  v2b[i] = true;
+  float2 v = v2f;
+  float2 v_1 = i.xx;
+  v2f = (((v_1 == float2(int(0), int(1)))) ? (1.0f.xx) : (v));
+  int3 v_2 = v3i;
+  int3 v_3 = i.xxx;
+  v3i = (((v_3 == int3(int(0), int(1), int(2)))) ? (int(1).xxx) : (v_2));
+  uint4 v_4 = v4u;
+  uint4 v_5 = i.xxxx;
+  v4u = (((v_5 == uint4(int(0), int(1), int(2), int(3)))) ? (1u.xxxx) : (v_4));
+  bool2 v_6 = v2b;
+  bool2 v_7 = i.xx;
+  v2b = (((v_7 == bool2(int(0), int(1)))) ? (true.xx) : (v_6));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.ir.fxc.hlsl
index a2633f2..d48859e 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.ir.fxc.hlsl
@@ -20,18 +20,42 @@
       } else {
         break;
       }
-      v2f[i] = 1.0f;
-      v3f[i] = 1.0f;
-      v4f[i] = 1.0f;
-      v2i[i] = int(1);
-      v3i[i] = int(1);
-      v4i[i] = int(1);
-      v2u[i] = 1u;
-      v3u[i] = 1u;
-      v4u[i] = 1u;
-      v2b[i] = true;
-      v3b[i] = true;
-      v4b[i] = true;
+      float2 v = v2f;
+      float2 v_1 = i.xx;
+      v2f = (((v_1 == float2(int(0), int(1)))) ? (1.0f.xx) : (v));
+      float3 v_2 = v3f;
+      float3 v_3 = i.xxx;
+      v3f = (((v_3 == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v_2));
+      float4 v_4 = v4f;
+      float4 v_5 = i.xxxx;
+      v4f = (((v_5 == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_4));
+      int2 v_6 = v2i;
+      int2 v_7 = i.xx;
+      v2i = (((v_7 == int2(int(0), int(1)))) ? (int(1).xx) : (v_6));
+      int3 v_8 = v3i;
+      int3 v_9 = i.xxx;
+      v3i = (((v_9 == int3(int(0), int(1), int(2)))) ? (int(1).xxx) : (v_8));
+      int4 v_10 = v4i;
+      int4 v_11 = i.xxxx;
+      v4i = (((v_11 == int4(int(0), int(1), int(2), int(3)))) ? (int(1).xxxx) : (v_10));
+      uint2 v_12 = v2u;
+      uint2 v_13 = i.xx;
+      v2u = (((v_13 == uint2(int(0), int(1)))) ? (1u.xx) : (v_12));
+      uint3 v_14 = v3u;
+      uint3 v_15 = i.xxx;
+      v3u = (((v_15 == uint3(int(0), int(1), int(2)))) ? (1u.xxx) : (v_14));
+      uint4 v_16 = v4u;
+      uint4 v_17 = i.xxxx;
+      v4u = (((v_17 == uint4(int(0), int(1), int(2), int(3)))) ? (1u.xxxx) : (v_16));
+      bool2 v_18 = v2b;
+      bool2 v_19 = i.xx;
+      v2b = (((v_19 == bool2(int(0), int(1)))) ? (true.xx) : (v_18));
+      bool3 v_20 = v3b;
+      bool3 v_21 = i.xxx;
+      v3b = (((v_21 == bool3(int(0), int(1), int(2)))) ? (true.xxx) : (v_20));
+      bool4 v_22 = v4b;
+      bool4 v_23 = i.xxxx;
+      v4b = (((v_23 == bool4(int(0), int(1), int(2), int(3)))) ? (true.xxxx) : (v_22));
       {
         i = (i + int(1));
       }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.ir.fxc.hlsl
index 3d27cfa..6df324f 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.ir.fxc.hlsl
@@ -16,14 +16,30 @@
       } else {
         break;
       }
-      v2f[i] = 1.0f;
-      v3i[i] = int(1);
-      v4u[i] = 1u;
-      v2b[i] = true;
-      v2f_2[i] = 1.0f;
-      v3i_2[i] = int(1);
-      v4u_2[i] = 1u;
-      v2b_2[i] = true;
+      float2 v = v2f;
+      float2 v_1 = i.xx;
+      v2f = (((v_1 == float2(int(0), int(1)))) ? (1.0f.xx) : (v));
+      int3 v_2 = v3i;
+      int3 v_3 = i.xxx;
+      v3i = (((v_3 == int3(int(0), int(1), int(2)))) ? (int(1).xxx) : (v_2));
+      uint4 v_4 = v4u;
+      uint4 v_5 = i.xxxx;
+      v4u = (((v_5 == uint4(int(0), int(1), int(2), int(3)))) ? (1u.xxxx) : (v_4));
+      bool2 v_6 = v2b;
+      bool2 v_7 = i.xx;
+      v2b = (((v_7 == bool2(int(0), int(1)))) ? (true.xx) : (v_6));
+      float2 v_8 = v2f_2;
+      float2 v_9 = i.xx;
+      v2f_2 = (((v_9 == float2(int(0), int(1)))) ? (1.0f.xx) : (v_8));
+      int3 v_10 = v3i_2;
+      int3 v_11 = i.xxx;
+      v3i_2 = (((v_11 == int3(int(0), int(1), int(2)))) ? (int(1).xxx) : (v_10));
+      uint4 v_12 = v4u_2;
+      uint4 v_13 = i.xxxx;
+      v4u_2 = (((v_13 == uint4(int(0), int(1), int(2), int(3)))) ? (1u.xxxx) : (v_12));
+      bool2 v_14 = v2b_2;
+      bool2 v_15 = i.xx;
+      v2b_2 = (((v_15 == bool2(int(0), int(1)))) ? (true.xx) : (v_14));
       {
         i = (i + int(1));
       }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.ir.fxc.hlsl
index 69fe60a..2876a60 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.ir.fxc.hlsl
@@ -20,10 +20,18 @@
       } else {
         break;
       }
-      v2f[i] = 1.0f;
-      v2i[i] = int(1);
-      v2u[i] = 1u;
-      v2b[i] = true;
+      float2 v = v2f;
+      float2 v_1 = i.xx;
+      v2f = (((v_1 == float2(int(0), int(1)))) ? (1.0f.xx) : (v));
+      int2 v_2 = v2i;
+      int2 v_3 = i.xx;
+      v2i = (((v_3 == int2(int(0), int(1)))) ? (int(1).xx) : (v_2));
+      uint2 v_4 = v2u;
+      uint2 v_5 = i.xx;
+      v2u = (((v_5 == uint2(int(0), int(1)))) ? (1u.xx) : (v_4));
+      bool2 v_6 = v2b;
+      bool2 v_7 = i.xx;
+      v2b = (((v_7 == bool2(int(0), int(1)))) ? (true.xx) : (v_6));
       {
         i = (i + int(1));
       }
@@ -31,13 +39,29 @@
     }
   }
   int i = int(0);
-  v3f[i] = 1.0f;
-  v4f[i] = 1.0f;
-  v3i[i] = int(1);
-  v4i[i] = int(1);
-  v3u[i] = 1u;
-  v4u[i] = 1u;
-  v3b[i] = true;
-  v4b[i] = true;
+  float3 v_8 = v3f;
+  float3 v_9 = i.xxx;
+  v3f = (((v_9 == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v_8));
+  float4 v_10 = v4f;
+  float4 v_11 = i.xxxx;
+  v4f = (((v_11 == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_10));
+  int3 v_12 = v3i;
+  int3 v_13 = i.xxx;
+  v3i = (((v_13 == int3(int(0), int(1), int(2)))) ? (int(1).xxx) : (v_12));
+  int4 v_14 = v4i;
+  int4 v_15 = i.xxxx;
+  v4i = (((v_15 == int4(int(0), int(1), int(2), int(3)))) ? (int(1).xxxx) : (v_14));
+  uint3 v_16 = v3u;
+  uint3 v_17 = i.xxx;
+  v3u = (((v_17 == uint3(int(0), int(1), int(2)))) ? (1u.xxx) : (v_16));
+  uint4 v_18 = v4u;
+  uint4 v_19 = i.xxxx;
+  v4u = (((v_19 == uint4(int(0), int(1), int(2), int(3)))) ? (1u.xxxx) : (v_18));
+  bool3 v_20 = v3b;
+  bool3 v_21 = i.xxx;
+  v3b = (((v_21 == bool3(int(0), int(1), int(2)))) ? (true.xxx) : (v_20));
+  bool4 v_22 = v4b;
+  bool4 v_23 = i.xxxx;
+  v4b = (((v_23 == bool4(int(0), int(1), int(2), int(3)))) ? (true.xxxx) : (v_22));
 }
 
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.ir.fxc.hlsl
index 7d6c6e4..0fc73a3 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.ir.fxc.hlsl
@@ -14,17 +14,41 @@
   bool3 v3b = (false).xxx;
   bool4 v4b = (false).xxxx;
   int i = int(0);
-  v2f[i] = 1.0f;
-  v3f[i] = 1.0f;
-  v4f[i] = 1.0f;
-  v2i[i] = int(1);
-  v3i[i] = int(1);
-  v4i[i] = int(1);
-  v2u[i] = 1u;
-  v3u[i] = 1u;
-  v4u[i] = 1u;
-  v2b[i] = true;
-  v3b[i] = true;
-  v4b[i] = true;
+  float2 v = v2f;
+  float2 v_1 = i.xx;
+  v2f = (((v_1 == float2(int(0), int(1)))) ? (1.0f.xx) : (v));
+  float3 v_2 = v3f;
+  float3 v_3 = i.xxx;
+  v3f = (((v_3 == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v_2));
+  float4 v_4 = v4f;
+  float4 v_5 = i.xxxx;
+  v4f = (((v_5 == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_4));
+  int2 v_6 = v2i;
+  int2 v_7 = i.xx;
+  v2i = (((v_7 == int2(int(0), int(1)))) ? (int(1).xx) : (v_6));
+  int3 v_8 = v3i;
+  int3 v_9 = i.xxx;
+  v3i = (((v_9 == int3(int(0), int(1), int(2)))) ? (int(1).xxx) : (v_8));
+  int4 v_10 = v4i;
+  int4 v_11 = i.xxxx;
+  v4i = (((v_11 == int4(int(0), int(1), int(2), int(3)))) ? (int(1).xxxx) : (v_10));
+  uint2 v_12 = v2u;
+  uint2 v_13 = i.xx;
+  v2u = (((v_13 == uint2(int(0), int(1)))) ? (1u.xx) : (v_12));
+  uint3 v_14 = v3u;
+  uint3 v_15 = i.xxx;
+  v3u = (((v_15 == uint3(int(0), int(1), int(2)))) ? (1u.xxx) : (v_14));
+  uint4 v_16 = v4u;
+  uint4 v_17 = i.xxxx;
+  v4u = (((v_17 == uint4(int(0), int(1), int(2), int(3)))) ? (1u.xxxx) : (v_16));
+  bool2 v_18 = v2b;
+  bool2 v_19 = i.xx;
+  v2b = (((v_19 == bool2(int(0), int(1)))) ? (true.xx) : (v_18));
+  bool3 v_20 = v3b;
+  bool3 v_21 = i.xxx;
+  v3b = (((v_21 == bool3(int(0), int(1), int(2)))) ? (true.xxx) : (v_20));
+  bool4 v_22 = v4b;
+  bool4 v_23 = i.xxxx;
+  v4b = (((v_23 == bool4(int(0), int(1), int(2), int(3)))) ? (true.xxxx) : (v_22));
 }
 
diff --git a/test/tint/bug/tint/2059.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/tint/2059.wgsl.expected.ir.fxc.hlsl
index 0fd28a0..10d187e 100644
--- a/test/tint/bug/tint/2059.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/tint/2059.wgsl.expected.ir.fxc.hlsl
@@ -231,7 +231,28 @@
       uint v_41 = c;
       float v_42 = float(((c * 3u) + 1u));
       float v_43 = float(((c * 3u) + 2u));
-      m[v_41] = float3(v_42, v_43, float(((c * 3u) + 3u)));
+      float3 v_44 = float3(v_42, v_43, float(((c * 3u) + 3u)));
+      switch(v_41) {
+        case 0u:
+        {
+          m[0u] = v_44;
+          break;
+        }
+        case 1u:
+        {
+          m[1u] = v_44;
+          break;
+        }
+        case 2u:
+        {
+          m[2u] = v_44;
+          break;
+        }
+        default:
+        {
+          break;
+        }
+      }
       {
         c = (c + 1u);
       }
@@ -240,33 +261,33 @@
   }
   float3x3 a = m;
   v_40(0u, a);
-  S v_44 = {m};
-  S a_1 = v_44;
+  S v_45 = {m};
+  S a_1 = v_45;
   v_39(0u, a_1);
-  float3x3 v_45[1] = (float3x3[1])0;
-  S2 v_46 = {v_45};
-  S2 a_2 = v_46;
+  float3x3 v_46[1] = (float3x3[1])0;
+  S2 v_47 = {v_46};
+  S2 a_2 = v_47;
   v_36(0u, a_2);
-  S v_47 = {m};
-  S3 v_48 = {v_47};
-  S3 a_3 = v_48;
+  S v_48 = {m};
+  S3 v_49 = {v_48};
+  S3 a_3 = v_49;
   v_30(0u, a_3);
-  S v_49 = {m};
-  S v_50[1] = (S[1])0;
-  S4 v_51 = {v_50};
-  S4 a_4 = v_51;
+  S v_50 = {m};
+  S v_51[1] = (S[1])0;
+  S4 v_52 = {v_51};
+  S4 a_4 = v_52;
   v_26(0u, a_4);
-  float3x3 v_52[1] = (float3x3[1])0;
-  float3x3 a_5[1] = v_52;
+  float3x3 v_53[1] = (float3x3[1])0;
+  float3x3 a_5[1] = v_53;
   v_17(0u, a_5);
-  S v_53 = {m};
-  S v_54[1] = (S[1])0;
-  S a_6[1] = v_54;
+  S v_54 = {m};
+  S v_55[1] = (S[1])0;
+  S a_6[1] = v_55;
   v_12(0u, a_6);
-  float3x3 v_55[1] = (float3x3[1])0;
-  S2 v_56 = {v_55};
-  S2 v_57[1] = (S2[1])0;
-  S2 a_7[1] = v_57;
+  float3x3 v_56[1] = (float3x3[1])0;
+  S2 v_57 = {v_56};
+  S2 v_58[1] = (S2[1])0;
+  S2 a_7[1] = v_58;
   v_6(0u, a_7);
 }
 
diff --git a/test/tint/bug/tint/534.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/tint/534.wgsl.expected.ir.fxc.hlsl
index 83f7d28..040f13e 100644
--- a/test/tint/bug/tint/534.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/tint/534.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 struct main_inputs {
   uint3 GlobalInvocationID : SV_DispatchThreadID;
 };
@@ -28,12 +26,10 @@
   if ((uniforms[0u].x == 1u)) {
     srcTexCoord[1u] = ((size.y - dstTexCoord.y) - 1u);
   }
-  Texture2D<float4> v_1 = src;
-  int2 v_2 = int2(srcTexCoord);
-  float4 srcColor = float4(v_1.Load(int3(v_2, int(0))));
-  Texture2D<float4> v_3 = tint_symbol;
-  int2 v_4 = int2(dstTexCoord);
-  float4 dstColor = float4(v_3.Load(int3(v_4, int(0))));
+  int2 v_1 = int2(srcTexCoord);
+  float4 srcColor = float4(src.Load(int3(v_1, int(int(0)))));
+  int2 v_2 = int2(dstTexCoord);
+  float4 dstColor = float4(tint_symbol.Load(int3(v_2, int(int(0)))));
   bool success = true;
   uint4 srcColorBits = (0u).xxxx;
   uint4 dstColorBits = tint_v4f32_to_v4u32(dstColor);
@@ -44,8 +40,10 @@
       } else {
         break;
       }
-      uint v_5 = i;
-      srcColorBits[v_5] = ConvertToFp16FloatValue(srcColor[i]);
+      uint v_3 = i;
+      uint v_4 = ConvertToFp16FloatValue(srcColor[i]);
+      uint4 v_5 = srcColorBits;
+      srcColorBits = (((v_3.xxxx == uint4(int(0), int(1), int(2), int(3)))) ? (v_4.xxxx) : (v_5));
       bool v_6 = false;
       if (success) {
         v_6 = (srcColorBits[i] == dstColorBits[i]);
@@ -72,8 +70,3 @@
   main_inner(inputs.GlobalInvocationID);
 }
 
-FXC validation failure:
-<scrubbed_path>(40,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/bug/tint/980.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/tint/980.wgsl.expected.ir.fxc.hlsl
index d60f572..e5d0c5d 100644
--- a/test/tint/bug/tint/980.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/tint/980.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 struct main_inputs {
   uint idx : SV_GroupIndex;
 };
@@ -8,13 +6,15 @@
 RWByteAddressBuffer io : register(u0);
 float3 Bad(uint index, float3 rd) {
   float3 normal = (0.0f).xxx;
-  normal[index] = -(float(sign(rd[index])));
+  float v_1 = -(float(sign(rd[index])));
+  float3 v_2 = normal;
+  normal = (((index.xxx == float3(int(0), int(1), int(2)))) ? (v_1.xxx) : (v_2));
   return normalize(normal);
 }
 
 void main_inner(uint idx) {
-  uint v_1 = io.Load(12u);
-  io.Store3(0u, asuint(Bad(v_1, asfloat(io.Load3(0u)))));
+  uint v_3 = io.Load(12u);
+  io.Store3(0u, asuint(Bad(v_3, asfloat(io.Load3(0u)))));
 }
 
 [numthreads(1, 1, 1)]
@@ -22,8 +22,3 @@
   main_inner(inputs.idx);
 }
 
-FXC validation failure:
-<scrubbed_path>(9,3-15): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.ir.fxc.hlsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.ir.fxc.hlsl
index a6d2f00..0595fe8 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 struct OuterS {
   float2x4 m1;
 };
@@ -11,12 +9,42 @@
 [numthreads(1, 1, 1)]
 void main() {
   OuterS s1 = (OuterS)0;
-  s1.m1[uniforms[0u].x] = (1.0f).xxxx;
-  s1.m1[uniforms[0u].x][uniforms[0u].x] = 1.0f;
+  uint v = uniforms[0u].x;
+  switch(v) {
+    case 0u:
+    {
+      s1.m1[0u] = (1.0f).xxxx;
+      break;
+    }
+    case 1u:
+    {
+      s1.m1[1u] = (1.0f).xxxx;
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
+  uint v_1 = uniforms[0u].x;
+  uint v_2 = uniforms[0u].x;
+  switch(v_1) {
+    case 0u:
+    {
+      float4 v_3 = s1.m1[0u];
+      s1.m1[0u] = (((v_2.xxxx == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_3));
+      break;
+    }
+    case 1u:
+    {
+      float4 v_4 = s1.m1[1u];
+      s1.m1[1u] = (((v_2.xxxx == float4(int(0), int(1), int(2), int(3)))) ? (1.0f.xxxx) : (v_4));
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
 }
 
-FXC validation failure:
-<scrubbed_path>(12,3-23): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.ir.fxc.hlsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.ir.fxc.hlsl
index 26172b0..1b0ff6b 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.ir.fxc.hlsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 struct OuterS {
   float3 v1;
 };
@@ -11,11 +9,8 @@
 [numthreads(1, 1, 1)]
 void main() {
   OuterS s1 = (OuterS)0;
-  s1.v1[uniforms[0u].x] = 1.0f;
+  float3 v = s1.v1;
+  float3 v_1 = uniforms[0u].x.xxx;
+  s1.v1 = (((v_1 == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v));
 }
 
-FXC validation failure:
-<scrubbed_path>(12,3-23): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.ir.fxc.hlsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.ir.fxc.hlsl
index c380d42..5a7f3d5 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.ir.fxc.hlsl
@@ -15,8 +15,12 @@
   OuterS s1 = (OuterS)0;
   float3 v = (0.0f).xxx;
   uint v_1 = uniforms[0u].x;
-  v[s1.a1[v_1]] = 1.0f;
-  uint v_2 = uniforms[0u].x;
-  v[f(s1.a1[v_2])] = 1.0f;
+  float3 v_2 = v;
+  float3 v_3 = s1.a1[v_1].xxx;
+  v = (((v_3 == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v_2));
+  uint v_4 = uniforms[0u].x;
+  uint v_5 = f(s1.a1[v_4]);
+  float3 v_6 = v;
+  v = (((v_5.xxx == float3(int(0), int(1), int(2)))) ? (1.0f.xxx) : (v_6));
 }
 
diff --git a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.ir.fxc.hlsl b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.ir.fxc.hlsl
index b99a5f0..d5f7a21 100644
--- a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.ir.fxc.hlsl
@@ -18,7 +18,9 @@
   S x = (S)0;
   int v = foo();
   int v_1 = bar();
-  x.a[v][v_1] = (x.a[v][v_1] + int(5));
+  int4 v_2 = x.a[v];
+  int4 v_3 = (x.a[v][v_1] + int(5)).xxxx;
+  x.a[v] = (((v_1.xxxx == int4(int(0), int(1), int(2), int(3)))) ? (v_3) : (v_2));
 }
 
 [numthreads(1, 1, 1)]
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 90e9bef..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,3 +0,0 @@
-SKIP: FAILED
-
-test timed out after 2m0s
\ No newline at end of file
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 90e9bef..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,3 +0,0 @@
-SKIP: FAILED
-
-test timed out after 2m0s
\ No newline at end of file
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index dd6a20e..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,177 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-static float4 gl_FragCoord = (0.0f).xxxx;
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 c = (0.0f).xxxx;
-  int a = 0;
-  int i1 = 0;
-  int i2 = 0;
-  int i3 = 0;
-  int i4 = 0;
-  int i5 = 0;
-  int i6 = 0;
-  int i7 = 0;
-  int i8_1 = 0;
-  c = float4(0.0f, 0.0f, 0.0f, 1.0f);
-  a = 0;
-  {
-    while(true) {
-      {
-        while(true) {
-          int x_46 = a;
-          c[x_46] = 1.0f;
-          i1 = 0;
-          {
-            while(true) {
-              if ((i1 < 1)) {
-              } else {
-                break;
-              }
-              i2 = 0;
-              {
-                while(true) {
-                  if ((i2 < 1)) {
-                  } else {
-                    break;
-                  }
-                  i3 = 0;
-                  {
-                    while(true) {
-                      if ((i3 < 1)) {
-                      } else {
-                        break;
-                      }
-                      i4 = 0;
-                      {
-                        while(true) {
-                          if ((i4 < 1)) {
-                          } else {
-                            break;
-                          }
-                          i5 = 0;
-                          {
-                            while(true) {
-                              if ((i5 < 1)) {
-                              } else {
-                                break;
-                              }
-                              i6 = 0;
-                              {
-                                while(true) {
-                                  if ((i6 < 1)) {
-                                  } else {
-                                    break;
-                                  }
-                                  i7 = 0;
-                                  {
-                                    while(true) {
-                                      if ((i7 < 1)) {
-                                      } else {
-                                        break;
-                                      }
-                                      i8_1 = 0;
-                                      {
-                                        while(true) {
-                                          if ((i8_1 < 17)) {
-                                          } else {
-                                            break;
-                                          }
-                                          a = (a + 1);
-                                          {
-                                            i8_1 = (i8_1 + 1);
-                                          }
-                                          continue;
-                                        }
-                                      }
-                                      {
-                                        i7 = (i7 + 1);
-                                      }
-                                      continue;
-                                    }
-                                  }
-                                  {
-                                    i6 = (i6 + 1);
-                                  }
-                                  continue;
-                                }
-                              }
-                              {
-                                i5 = (i5 + 1);
-                              }
-                              continue;
-                            }
-                          }
-                          {
-                            i4 = (i4 + 1);
-                          }
-                          continue;
-                        }
-                      }
-                      {
-                        i3 = (i3 + 1);
-                      }
-                      continue;
-                    }
-                  }
-                  {
-                    i2 = (i2 + 1);
-                  }
-                  continue;
-                }
-              }
-              {
-                i1 = (i1 + 1);
-              }
-              continue;
-            }
-          }
-          {
-            float x_123 = gl_FragCoord.x;
-            if (!((x_123 < -1.0f))) { break; }
-          }
-          continue;
-        }
-      }
-      {
-        float x_126 = gl_FragCoord.y;
-        if (!((x_126 < -1.0f))) { break; }
-      }
-      continue;
-    }
-  }
-  x_GLF_color = c;
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v = {x_GLF_color};
-  return v;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_1 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_2 = {v_1.x_GLF_color_1};
-  return v_2;
-}
-
-FXC validation failure:
-<scrubbed_path>(32,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(30,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 5effb80..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,195 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-static float4 gl_FragCoord = (0.0f).xxxx;
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 c = (0.0f).xxxx;
-  int a = 0;
-  int i1 = 0;
-  int i2 = 0;
-  int i3 = 0;
-  int i4 = 0;
-  int i5 = 0;
-  int i6 = 0;
-  int i7 = 0;
-  int i8_1 = 0;
-  c = float4(0.0f, 0.0f, 0.0f, 1.0f);
-  a = 0;
-  {
-    while(true) {
-      {
-        while(true) {
-          int x_46 = a;
-          c[x_46] = 1.0f;
-          i1 = 0;
-          {
-            while(true) {
-              int x_52 = i1;
-              if ((x_52 < 1)) {
-              } else {
-                break;
-              }
-              i2 = 0;
-              {
-                while(true) {
-                  int x_59 = i2;
-                  if ((x_59 < 1)) {
-                  } else {
-                    break;
-                  }
-                  i3 = 0;
-                  {
-                    while(true) {
-                      int x_66 = i3;
-                      if ((x_66 < 1)) {
-                      } else {
-                        break;
-                      }
-                      i4 = 0;
-                      {
-                        while(true) {
-                          int x_73 = i4;
-                          if ((x_73 < 1)) {
-                          } else {
-                            break;
-                          }
-                          i5 = 0;
-                          {
-                            while(true) {
-                              int x_80 = i5;
-                              if ((x_80 < 1)) {
-                              } else {
-                                break;
-                              }
-                              i6 = 0;
-                              {
-                                while(true) {
-                                  int x_87 = i6;
-                                  if ((x_87 < 1)) {
-                                  } else {
-                                    break;
-                                  }
-                                  i7 = 0;
-                                  {
-                                    while(true) {
-                                      int x_94 = i7;
-                                      if ((x_94 < 1)) {
-                                      } else {
-                                        break;
-                                      }
-                                      i8_1 = 0;
-                                      {
-                                        while(true) {
-                                          int x_101 = i8_1;
-                                          if ((x_101 < 17)) {
-                                          } else {
-                                            break;
-                                          }
-                                          int x_104 = a;
-                                          a = (x_104 + 1);
-                                          {
-                                            int x_106 = i8_1;
-                                            i8_1 = (x_106 + 1);
-                                          }
-                                          continue;
-                                        }
-                                      }
-                                      {
-                                        int x_108 = i7;
-                                        i7 = (x_108 + 1);
-                                      }
-                                      continue;
-                                    }
-                                  }
-                                  {
-                                    int x_110 = i6;
-                                    i6 = (x_110 + 1);
-                                  }
-                                  continue;
-                                }
-                              }
-                              {
-                                int x_112 = i5;
-                                i5 = (x_112 + 1);
-                              }
-                              continue;
-                            }
-                          }
-                          {
-                            int x_114 = i4;
-                            i4 = (x_114 + 1);
-                          }
-                          continue;
-                        }
-                      }
-                      {
-                        int x_116 = i3;
-                        i3 = (x_116 + 1);
-                      }
-                      continue;
-                    }
-                  }
-                  {
-                    int x_118 = i2;
-                    i2 = (x_118 + 1);
-                  }
-                  continue;
-                }
-              }
-              {
-                int x_120 = i1;
-                i1 = (x_120 + 1);
-              }
-              continue;
-            }
-          }
-          {
-            float x_123 = gl_FragCoord.x;
-            if (!((x_123 < -1.0f))) { break; }
-          }
-          continue;
-        }
-      }
-      {
-        float x_126 = gl_FragCoord.y;
-        if (!((x_126 < -1.0f))) { break; }
-      }
-      continue;
-    }
-  }
-  float4 x_128 = c;
-  x_GLF_color = x_128;
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v = {x_GLF_color};
-  return v;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_1 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_2 = {v_1.x_GLF_color_1};
-  return v_2;
-}
-
-FXC validation failure:
-<scrubbed_path>(32,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(30,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 3185918..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,80 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b1) {
-  uint4 x_6[5];
-};
-cbuffer cbuffer_x_9 : register(b0) {
-  uint4 x_9[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 v = (0.0f).xxxx;
-  int i = 0;
-  float v_1 = float(asint(x_6[1u].x));
-  float v_2 = float(asint(x_6[2u].x));
-  float v_3 = float(asint(x_6[3u].x));
-  v = float4(v_1, v_2, v_3, float(asint(x_6[0u].x)));
-  i = asint(x_6[4u].x);
-  {
-    while(true) {
-      int v_4 = i;
-      if ((v_4 < asint(x_6[0u].x))) {
-      } else {
-        break;
-      }
-      float4 v_5 = float4(v.x, v.y, v.z, v.w);
-      float4 v_6 = float4(v.x, v.y, v.z, v.w);
-      float4 v_7 = float4(v.x, v.y, v.z, v.w);
-      float4x4 v_8 = float4x4(v_5, v_6, v_7, float4(v.x, v.y, v.z, v.w));
-      float v_9 = v_8[0u][i];
-      if ((v_9 > asfloat(x_9[0u].x))) {
-        int x_96 = i;
-        float4 v_10 = v;
-        float4 v_11 = float4((asfloat(x_9[1u].x)).xxxx);
-        float4 v_12 = clamp(v_10, v_11, float4((asfloat(x_9[0u].x)).xxxx));
-        v[x_96] = v_12[asint(x_6[1u].x)];
-      }
-      {
-        i = (i + 1);
-      }
-      continue;
-    }
-  }
-  float4 v_13 = v;
-  if (all((v_13 == float4((float(asint(x_6[1u].x))).xxxx)))) {
-    float v_14 = float(asint(x_6[1u].x));
-    float v_15 = float(asint(x_6[4u].x));
-    float v_16 = float(asint(x_6[4u].x));
-    x_GLF_color = float4(v_14, v_15, v_16, float(asint(x_6[1u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_6[4u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_17 = {x_GLF_color};
-  return v_17;
-}
-
-main_outputs main() {
-  main_out v_18 = main_inner();
-  main_outputs v_19 = {v_18.x_GLF_color_1};
-  return v_19;
-}
-
-FXC validation failure:
-<scrubbed_path>(42,9-15): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(26,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index de9f7f8..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,101 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b1) {
-  uint4 x_6[5];
-};
-cbuffer cbuffer_x_9 : register(b0) {
-  uint4 x_9[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 v = (0.0f).xxxx;
-  int i = 0;
-  int x_40 = asint(x_6[1u].x);
-  int x_43 = asint(x_6[2u].x);
-  int x_46 = asint(x_6[3u].x);
-  int x_49 = asint(x_6[0u].x);
-  float v_1 = float(x_40);
-  float v_2 = float(x_43);
-  float v_3 = float(x_46);
-  v = float4(v_1, v_2, v_3, float(x_49));
-  int x_53 = asint(x_6[4u].x);
-  i = x_53;
-  {
-    while(true) {
-      int x_58 = i;
-      int x_60 = asint(x_6[0u].x);
-      if ((x_58 < x_60)) {
-      } else {
-        break;
-      }
-      float4 x_63 = v;
-      float4 x_64 = v;
-      float4 x_65 = v;
-      float4 x_66 = v;
-      int x_88 = i;
-      float x_92 = asfloat(x_9[0u].x);
-      float4 v_4 = float4(x_63[0u], x_63[1u], x_63[2u], x_63[3u]);
-      float4 v_5 = float4(x_64[0u], x_64[1u], x_64[2u], x_64[3u]);
-      float4 v_6 = float4(x_65[0u], x_65[1u], x_65[2u], x_65[3u]);
-      if ((float4x4(v_4, v_5, v_6, float4(x_66[0u], x_66[1u], x_66[2u], x_66[3u]))[0u][x_88] > x_92)) {
-        int x_96 = i;
-        float4 x_97 = v;
-        float x_99 = asfloat(x_9[1u].x);
-        float x_102 = asfloat(x_9[0u].x);
-        int x_106 = asint(x_6[1u].x);
-        float4 v_7 = float4(x_99, x_99, x_99, x_99);
-        v[x_96] = clamp(x_97, v_7, float4(x_102, x_102, x_102, x_102))[x_106];
-      }
-      {
-        int x_109 = i;
-        i = (x_109 + 1);
-      }
-      continue;
-    }
-  }
-  float4 x_111 = v;
-  int x_113 = asint(x_6[1u].x);
-  float x_114 = float(x_113);
-  if (all((x_111 == float4(x_114, x_114, x_114, x_114)))) {
-    int x_122 = asint(x_6[1u].x);
-    int x_125 = asint(x_6[4u].x);
-    int x_128 = asint(x_6[4u].x);
-    int x_131 = asint(x_6[1u].x);
-    float v_8 = float(x_122);
-    float v_9 = float(x_125);
-    float v_10 = float(x_128);
-    x_GLF_color = float4(v_8, v_9, v_10, float(x_131));
-  } else {
-    int x_135 = asint(x_6[4u].x);
-    float x_136 = float(x_135);
-    x_GLF_color = float4(x_136, x_136, x_136, x_136);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_11 = {x_GLF_color};
-  return v_11;
-}
-
-main_outputs main() {
-  main_out v_12 = main_inner();
-  main_outputs v_13 = {v_12.x_GLF_color_1};
-  return v_13;
-}
-
-FXC validation failure:
-<scrubbed_path>(54,9-15): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(31,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index dcdc528..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,67 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 v = (0.0f).xxxx;
-  int i = 0;
-  v = float4((float(asint(x_6[3u].x))).xxxx);
-  i = asint(x_6[0u].x);
-  {
-    while(true) {
-      int v_1 = i;
-      if ((v_1 < asint(x_6[3u].x))) {
-      } else {
-        break;
-      }
-      int x_50 = i;
-      v[uint3(0u, 1u, 2u)[x_50]] = float(i);
-      {
-        i = (i + 1);
-      }
-      continue;
-    }
-  }
-  float4 v_2 = v;
-  float v_3 = float(asint(x_6[0u].x));
-  float v_4 = float(asint(x_6[1u].x));
-  float v_5 = float(asint(x_6[2u].x));
-  if (all((v_2 == float4(v_3, v_4, v_5, float(asint(x_6[3u].x)))))) {
-    float v_6 = float(asint(x_6[1u].x));
-    float v_7 = float(asint(x_6[0u].x));
-    float v_8 = float(asint(x_6[0u].x));
-    x_GLF_color = float4(v_6, v_7, v_8, float(asint(x_6[1u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_6[0u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_9 = {x_GLF_color};
-  return v_9;
-}
-
-main_outputs main() {
-  main_out v_10 = main_inner();
-  main_outputs v_11 = {v_10.x_GLF_color_1};
-  return v_11;
-}
-
-FXC validation failure:
-<scrubbed_path>(27,7-32): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(20,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 138ce89..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,83 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 v = (0.0f).xxxx;
-  int i = 0;
-  int x_36 = asint(x_6[3u].x);
-  float x_37 = float(x_36);
-  v = float4(x_37, x_37, x_37, x_37);
-  int x_40 = asint(x_6[0u].x);
-  i = x_40;
-  {
-    while(true) {
-      int x_45 = i;
-      int x_47 = asint(x_6[3u].x);
-      if ((x_45 < x_47)) {
-      } else {
-        break;
-      }
-      int x_50 = i;
-      int x_51 = i;
-      v[uint3(0u, 1u, 2u)[x_50]] = float(x_51);
-      {
-        int x_55 = i;
-        i = (x_55 + 1);
-      }
-      continue;
-    }
-  }
-  float4 x_57 = v;
-  int x_59 = asint(x_6[0u].x);
-  int x_62 = asint(x_6[1u].x);
-  int x_65 = asint(x_6[2u].x);
-  int x_68 = asint(x_6[3u].x);
-  float v_1 = float(x_59);
-  float v_2 = float(x_62);
-  float v_3 = float(x_65);
-  if (all((x_57 == float4(v_1, v_2, v_3, float(x_68))))) {
-    int x_77 = asint(x_6[1u].x);
-    int x_80 = asint(x_6[0u].x);
-    int x_83 = asint(x_6[0u].x);
-    int x_86 = asint(x_6[1u].x);
-    float v_4 = float(x_77);
-    float v_5 = float(x_80);
-    float v_6 = float(x_83);
-    x_GLF_color = float4(v_4, v_5, v_6, float(x_86));
-  } else {
-    int x_90 = asint(x_6[0u].x);
-    float x_91 = float(x_90);
-    x_GLF_color = float4(x_91, x_91, x_91, x_91);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_7 = {x_GLF_color};
-  return v_7;
-}
-
-main_outputs main() {
-  main_out v_8 = main_inner();
-  main_outputs v_9 = {v_8.x_GLF_color_1};
-  return v_9;
-}
-
-FXC validation failure:
-<scrubbed_path>(32,7-32): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(23,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index b262d9c..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,131 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-static int x_GLF_global_loop_count = 0;
-cbuffer cbuffer_x_7 : register(b1) {
-  uint4 x_7[18];
-};
-cbuffer cbuffer_x_12 : register(b0) {
-  uint4 x_12[4];
-};
-cbuffer cbuffer_x_15 : register(b2) {
-  uint4 x_15[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-static bool continue_execution = true;
-void main_1() {
-  float4x4 m = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  float4 v = (0.0f).xxxx;
-  float f = 0.0f;
-  int a = 0;
-  int b = 0;
-  float zero = 0.0f;
-  x_GLF_global_loop_count = 0;
-  float v_1 = asfloat(x_7[1u].x);
-  float v_2 = asfloat(x_7[2u].x);
-  float v_3 = asfloat(x_7[3u].x);
-  float4 v_4 = float4(v_1, v_2, v_3, asfloat(x_7[4u].x));
-  float v_5 = asfloat(x_7[5u].x);
-  float v_6 = asfloat(x_7[6u].x);
-  float v_7 = asfloat(x_7[7u].x);
-  float4 v_8 = float4(v_5, v_6, v_7, asfloat(x_7[8u].x));
-  float v_9 = asfloat(x_7[9u].x);
-  float v_10 = asfloat(x_7[10u].x);
-  float v_11 = asfloat(x_7[11u].x);
-  float4 v_12 = float4(v_9, v_10, v_11, asfloat(x_7[12u].x));
-  float v_13 = asfloat(x_7[13u].x);
-  float v_14 = asfloat(x_7[14u].x);
-  float v_15 = asfloat(x_7[15u].x);
-  m = float4x4(v_4, v_8, v_12, float4(v_13, v_14, v_15, asfloat(x_7[16u].x)));
-  float v_16 = asfloat(x_7[1u].x);
-  float v_17 = asfloat(x_7[2u].x);
-  float v_18 = asfloat(x_7[3u].x);
-  v = float4(v_16, v_17, v_18, asfloat(x_7[4u].x));
-  f = asfloat(x_7[1u].x);
-  a = asint(x_12[0u].x);
-  {
-    while(true) {
-      if ((x_GLF_global_loop_count < 10)) {
-      } else {
-        break;
-      }
-      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
-      int x_121 = min(max(a, 0), 3);
-      float v_19 = v[x_121];
-      v[x_121] = (v_19 + asfloat(x_7[1u].x));
-      b = asint(x_12[2u].x);
-      {
-        while(true) {
-          if ((x_GLF_global_loop_count < 10)) {
-          } else {
-            break;
-          }
-          x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
-          float v_20 = f;
-          float v_21 = v[min(max(b, 0), 3)];
-          float4 v_22 = m[min(max(b, 0), 3)];
-          f = (v_20 + (v_21 * v_22[a]));
-          {
-            b = (b - 1);
-          }
-          continue;
-        }
-      }
-      int x_153 = a;
-      int v_23 = min(max(x_153, 0), 3);
-      m[1][v_23] = asfloat(x_7[1u].x);
-      int v_24 = asint(x_15[0u].x);
-      if ((v_24 == asint(x_12[0u].x))) {
-        continue_execution = false;
-      }
-      int v_25 = asint(x_15[0u].x);
-      if ((v_25 == asint(x_12[1u].x))) {
-        continue_execution = false;
-      }
-      {
-        a = (a + 1);
-      }
-      continue;
-    }
-  }
-  zero = asfloat(x_7[0u].x);
-  float v_26 = f;
-  if (!((v_26 == asfloat(x_7[17u].x)))) {
-    zero = asfloat(x_7[1u].x);
-  }
-  float v_27 = f;
-  float v_28 = zero;
-  float v_29 = float(asint(x_12[0u].x));
-  x_GLF_color = float4(v_27, v_28, v_29, f);
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_30 = {x_GLF_color};
-  return v_30;
-}
-
-main_outputs main() {
-  main_out v_31 = main_inner();
-  main_outputs v_32 = {v_31.x_GLF_color_1};
-  if (!(continue_execution)) {
-    discard;
-  }
-  main_outputs v_33 = v_32;
-  return v_33;
-}
-
-FXC validation failure:
-<scrubbed_path>(61,7-14): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(53,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index fc6d64e..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,156 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-static int x_GLF_global_loop_count = 0;
-cbuffer cbuffer_x_7 : register(b1) {
-  uint4 x_7[18];
-};
-cbuffer cbuffer_x_12 : register(b0) {
-  uint4 x_12[4];
-};
-cbuffer cbuffer_x_15 : register(b2) {
-  uint4 x_15[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-static bool continue_execution = true;
-void main_1() {
-  float4x4 m = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  float4 v = (0.0f).xxxx;
-  float f = 0.0f;
-  int a = 0;
-  int b = 0;
-  float zero = 0.0f;
-  x_GLF_global_loop_count = 0;
-  float x_62 = asfloat(x_7[1u].x);
-  float x_64 = asfloat(x_7[2u].x);
-  float x_66 = asfloat(x_7[3u].x);
-  float x_68 = asfloat(x_7[4u].x);
-  float x_70 = asfloat(x_7[5u].x);
-  float x_72 = asfloat(x_7[6u].x);
-  float x_74 = asfloat(x_7[7u].x);
-  float x_76 = asfloat(x_7[8u].x);
-  float x_78 = asfloat(x_7[9u].x);
-  float x_80 = asfloat(x_7[10u].x);
-  float x_82 = asfloat(x_7[11u].x);
-  float x_84 = asfloat(x_7[12u].x);
-  float x_86 = asfloat(x_7[13u].x);
-  float x_88 = asfloat(x_7[14u].x);
-  float x_90 = asfloat(x_7[15u].x);
-  float x_92 = asfloat(x_7[16u].x);
-  float4 v_1 = float4(x_62, x_64, x_66, x_68);
-  float4 v_2 = float4(x_70, x_72, x_74, x_76);
-  float4 v_3 = float4(x_78, x_80, x_82, x_84);
-  m = float4x4(v_1, v_2, v_3, float4(x_86, x_88, x_90, x_92));
-  float x_99 = asfloat(x_7[1u].x);
-  float x_101 = asfloat(x_7[2u].x);
-  float x_103 = asfloat(x_7[3u].x);
-  float x_105 = asfloat(x_7[4u].x);
-  v = float4(x_99, x_101, x_103, x_105);
-  float x_108 = asfloat(x_7[1u].x);
-  f = x_108;
-  int x_110 = asint(x_12[0u].x);
-  a = x_110;
-  {
-    while(true) {
-      int x_115 = x_GLF_global_loop_count;
-      if ((x_115 < 10)) {
-      } else {
-        break;
-      }
-      int x_118 = x_GLF_global_loop_count;
-      x_GLF_global_loop_count = (x_118 + 1);
-      int x_120 = a;
-      int x_121 = min(max(x_120, 0), 3);
-      float x_123 = asfloat(x_7[1u].x);
-      float x_125 = v[x_121];
-      v[x_121] = (x_125 + x_123);
-      int x_129 = asint(x_12[2u].x);
-      b = x_129;
-      {
-        while(true) {
-          int x_134 = x_GLF_global_loop_count;
-          if ((x_134 < 10)) {
-          } else {
-            break;
-          }
-          int x_137 = x_GLF_global_loop_count;
-          x_GLF_global_loop_count = (x_137 + 1);
-          int x_139 = b;
-          float x_142 = v[min(max(x_139, 0), 3)];
-          int x_143 = b;
-          int x_145 = a;
-          float x_147 = m[min(max(x_143, 0), 3)][x_145];
-          float x_149 = f;
-          f = (x_149 + (x_142 * x_147));
-          {
-            int x_151 = b;
-            b = (x_151 - 1);
-          }
-          continue;
-        }
-      }
-      int x_153 = a;
-      float x_156 = asfloat(x_7[1u].x);
-      m[1][min(max(x_153, 0), 3)] = x_156;
-      int x_159 = asint(x_15[0u].x);
-      int x_161 = asint(x_12[0u].x);
-      if ((x_159 == x_161)) {
-        continue_execution = false;
-      }
-      int x_166 = asint(x_15[0u].x);
-      int x_168 = asint(x_12[1u].x);
-      if ((x_166 == x_168)) {
-        continue_execution = false;
-      }
-      {
-        int x_172 = a;
-        a = (x_172 + 1);
-      }
-      continue;
-    }
-  }
-  float x_175 = asfloat(x_7[0u].x);
-  zero = x_175;
-  float x_176 = f;
-  float x_178 = asfloat(x_7[17u].x);
-  if (!((x_176 == x_178))) {
-    float x_183 = asfloat(x_7[1u].x);
-    zero = x_183;
-  }
-  float x_184 = f;
-  float x_185 = zero;
-  int x_187 = asint(x_12[0u].x);
-  float x_189 = f;
-  x_GLF_color = float4(x_184, x_185, float(x_187), x_189);
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_4 = {x_GLF_color};
-  return v_4;
-}
-
-main_outputs main() {
-  main_out v_5 = main_inner();
-  main_outputs v_6 = {v_5.x_GLF_color_1};
-  if (!(continue_execution)) {
-    discard;
-  }
-  main_outputs v_7 = v_6;
-  return v_7;
-}
-
-FXC validation failure:
-<scrubbed_path>(72,7-14): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(60,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 11faf9e..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,65 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[4];
-};
-cbuffer cbuffer_x_9 : register(b1) {
-  uint4 x_9[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float3x3 m = float3x3((0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
-  int a = 0;
-  float3 arr[2] = (float3[2])0;
-  float3 v = (0.0f).xxx;
-  float x_46 = float(asint(x_6[0u].x));
-  float3 v_1 = float3(x_46, 0.0f, 0.0f);
-  float3 v_2 = float3(0.0f, x_46, 0.0f);
-  m = float3x3(v_1, v_2, float3(0.0f, 0.0f, x_46));
-  a = asint(x_6[0u].x);
-  int x_53 = a;
-  int x_54 = a;
-  m[x_53][x_54] = asfloat(x_9[0u].x);
-  float3 v_3[2] = {m[1], m[1]};
-  arr = v_3;
-  v = float3((asfloat(x_9[1u].x)).xxx);
-  v = (v + arr[a]);
-  float3 v_4 = v;
-  float v_5 = float(asint(x_6[1u].x));
-  float v_6 = float(asint(x_6[2u].x));
-  if (all((v_4 == float3(v_5, v_6, float(asint(x_6[1u].x)))))) {
-    float v_7 = float(asint(x_6[0u].x));
-    float v_8 = float(asint(x_6[3u].x));
-    float v_9 = float(asint(x_6[3u].x));
-    x_GLF_color = float4(v_7, v_8, v_9, float(asint(x_6[0u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_6[3u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_10 = {x_GLF_color};
-  return v_10;
-}
-
-main_outputs main() {
-  main_out v_11 = main_inner();
-  main_outputs v_12 = {v_11.x_GLF_color_1};
-  return v_12;
-}
-
-FXC validation failure:
-<scrubbed_path>(29,3-9): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 84639a6..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,83 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[4];
-};
-cbuffer cbuffer_x_9 : register(b1) {
-  uint4 x_9[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float3x3 m = float3x3((0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
-  int a = 0;
-  float3 arr[2] = (float3[2])0;
-  float3 v = (0.0f).xxx;
-  int x_45 = asint(x_6[0u].x);
-  float x_46 = float(x_45);
-  float3 v_1 = float3(x_46, 0.0f, 0.0f);
-  float3 v_2 = float3(0.0f, x_46, 0.0f);
-  m = float3x3(v_1, v_2, float3(0.0f, 0.0f, x_46));
-  int x_52 = asint(x_6[0u].x);
-  a = x_52;
-  int x_53 = a;
-  int x_54 = a;
-  float x_56 = asfloat(x_9[0u].x);
-  m[x_53][x_54] = x_56;
-  float3 x_59 = m[1];
-  float3 x_61 = m[1];
-  float3 v_3[2] = {x_59, x_61};
-  arr = v_3;
-  float x_64 = asfloat(x_9[1u].x);
-  v = float3(x_64, x_64, x_64);
-  int x_66 = a;
-  float3 x_68 = arr[x_66];
-  float3 x_69 = v;
-  v = (x_69 + x_68);
-  float3 x_71 = v;
-  int x_73 = asint(x_6[1u].x);
-  int x_76 = asint(x_6[2u].x);
-  int x_79 = asint(x_6[1u].x);
-  float v_4 = float(x_73);
-  float v_5 = float(x_76);
-  if (all((x_71 == float3(v_4, v_5, float(x_79))))) {
-    int x_88 = asint(x_6[0u].x);
-    int x_91 = asint(x_6[3u].x);
-    int x_94 = asint(x_6[3u].x);
-    int x_97 = asint(x_6[0u].x);
-    float v_6 = float(x_88);
-    float v_7 = float(x_91);
-    float v_8 = float(x_94);
-    x_GLF_color = float4(v_6, v_7, v_8, float(x_97));
-  } else {
-    int x_101 = asint(x_6[3u].x);
-    float x_102 = float(x_101);
-    x_GLF_color = float4(x_102, x_102, x_102, x_102);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_9 = {x_GLF_color};
-  return v_9;
-}
-
-main_outputs main() {
-  main_out v_10 = main_inner();
-  main_outputs v_11 = {v_10.x_GLF_color_1};
-  return v_11;
-}
-
-FXC validation failure:
-<scrubbed_path>(32,3-9): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 8ece67a..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,67 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_9 : register(b1) {
-  uint4 x_9[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int a = 0;
-  float4 v = (0.0f).xxxx;
-  float3x4 m = float3x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  float4x4 indexable = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  a = asint(x_6[0u].x);
-  v = float4((asfloat(x_9[2u].x)).xxxx);
-  float x_49 = asfloat(x_9[3u].x);
-  float4 v_1 = float4(x_49, 0.0f, 0.0f, 0.0f);
-  float4 v_2 = float4(0.0f, x_49, 0.0f, 0.0f);
-  m = float3x4(v_1, v_2, float4(0.0f, 0.0f, x_49, 0.0f));
-  int x_54 = a;
-  int x_55 = a;
-  m[x_54][x_55] = asfloat(x_9[0u].x);
-  int x_59 = a;
-  int x_78 = a;
-  int x_79 = a;
-  float4 v_3 = float4(m[0u].x, m[0u].y, m[0u].z, m[0u].w);
-  float4 v_4 = float4(m[1u].x, m[1u].y, m[1u].z, m[1u].w);
-  indexable = float4x4(v_3, v_4, float4(m[2u].x, m[2u].y, m[2u].z, m[2u].w), float4(0.0f, 0.0f, 0.0f, 1.0f));
-  v[x_59] = (v[x_59] + indexable[x_78][x_79]);
-  float v_5 = v.y;
-  if ((v_5 == asfloat(x_9[1u].x))) {
-    float v_6 = float(asint(x_6[0u].x));
-    float v_7 = float(asint(x_6[1u].x));
-    float v_8 = float(asint(x_6[1u].x));
-    x_GLF_color = float4(v_6, v_7, v_8, float(asint(x_6[0u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_6[1u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_9 = {x_GLF_color};
-  return v_9;
-}
-
-main_outputs main() {
-  main_out v_10 = main_inner();
-  main_outputs v_11 = {v_10.x_GLF_color_1};
-  return v_11;
-}
-
-FXC validation failure:
-<scrubbed_path>(30,3-9): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index e33b357..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,80 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_9 : register(b1) {
-  uint4 x_9[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int a = 0;
-  float4 v = (0.0f).xxxx;
-  float3x4 m = float3x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  float4x4 indexable = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  int x_44 = asint(x_6[0u].x);
-  a = x_44;
-  float x_46 = asfloat(x_9[2u].x);
-  v = float4(x_46, x_46, x_46, x_46);
-  float x_49 = asfloat(x_9[3u].x);
-  float4 v_1 = float4(x_49, 0.0f, 0.0f, 0.0f);
-  float4 v_2 = float4(0.0f, x_49, 0.0f, 0.0f);
-  m = float3x4(v_1, v_2, float4(0.0f, 0.0f, x_49, 0.0f));
-  int x_54 = a;
-  int x_55 = a;
-  float x_57 = asfloat(x_9[0u].x);
-  m[x_54][x_55] = x_57;
-  int x_59 = a;
-  float3x4 x_60 = m;
-  int x_78 = a;
-  int x_79 = a;
-  float4 v_3 = float4(x_60[0u][0u], x_60[0u][1u], x_60[0u][2u], x_60[0u][3u]);
-  float4 v_4 = float4(x_60[1u][0u], x_60[1u][1u], x_60[1u][2u], x_60[1u][3u]);
-  indexable = float4x4(v_3, v_4, float4(x_60[2u][0u], x_60[2u][1u], x_60[2u][2u], x_60[2u][3u]), float4(0.0f, 0.0f, 0.0f, 1.0f));
-  float x_81 = indexable[x_78][x_79];
-  float x_83 = v[x_59];
-  v[x_59] = (x_83 + x_81);
-  float x_87 = v.y;
-  float x_89 = asfloat(x_9[1u].x);
-  if ((x_87 == x_89)) {
-    int x_95 = asint(x_6[0u].x);
-    int x_98 = asint(x_6[1u].x);
-    int x_101 = asint(x_6[1u].x);
-    int x_104 = asint(x_6[0u].x);
-    float v_5 = float(x_95);
-    float v_6 = float(x_98);
-    float v_7 = float(x_101);
-    x_GLF_color = float4(v_5, v_6, v_7, float(x_104));
-  } else {
-    int x_108 = asint(x_6[1u].x);
-    float x_109 = float(x_108);
-    x_GLF_color = float4(x_109, x_109, x_109, x_109);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_8 = {x_GLF_color};
-  return v_8;
-}
-
-main_outputs main() {
-  main_out v_9 = main_inner();
-  main_outputs v_10 = {v_9.x_GLF_color_1};
-  return v_10;
-}
-
-FXC validation failure:
-<scrubbed_path>(33,3-9): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 7277d76..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,57 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_8 : register(b1) {
-  uint4 x_8[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 color = (0.0f).xxxx;
-  float v = asfloat(x_6[0u].x);
-  float v_1 = asfloat(x_6[0u].x);
-  float v_2 = asfloat(x_6[0u].x);
-  color = float4(v, v_1, v_2, asfloat(x_6[1u].x));
-  int x_38 = asint(x_8[1u].x);
-  switch(((1 | x_38) ^ 1)) {
-    case 0:
-    {
-      int x_44 = asint(x_8[0u].x);
-      color[x_44] = asfloat(x_6[1u].x);
-      break;
-    }
-    default:
-    {
-      break;
-    }
-  }
-  x_GLF_color = color;
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_3 = {x_GLF_color};
-  return v_3;
-}
-
-main_outputs main() {
-  main_out v_4 = main_inner();
-  main_outputs v_5 = {v_4.x_GLF_color_1};
-  return v_5;
-}
-
-FXC validation failure:
-internal error: compilation aborted unexpectedly
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index d2172f3..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,60 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_8 : register(b1) {
-  uint4 x_8[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 color = (0.0f).xxxx;
-  float x_29 = asfloat(x_6[0u].x);
-  float x_31 = asfloat(x_6[0u].x);
-  float x_33 = asfloat(x_6[0u].x);
-  float x_35 = asfloat(x_6[1u].x);
-  color = float4(x_29, x_31, x_33, x_35);
-  int x_38 = asint(x_8[1u].x);
-  switch(((1 | x_38) ^ 1)) {
-    case 0:
-    {
-      int x_44 = asint(x_8[0u].x);
-      float x_46 = asfloat(x_6[1u].x);
-      color[x_44] = x_46;
-      break;
-    }
-    default:
-    {
-      break;
-    }
-  }
-  float4 x_48 = color;
-  x_GLF_color = x_48;
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v = {x_GLF_color};
-  return v;
-}
-
-main_outputs main() {
-  main_out v_1 = main_inner();
-  main_outputs v_2 = {v_1.x_GLF_color_1};
-  return v_2;
-}
-
-FXC validation failure:
-internal error: compilation aborted unexpectedly
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 3399f32..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,52 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_8 : register(b1) {
-  uint4 x_8[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float2 v1 = (0.0f).xx;
-  float x_35 = asfloat(x_6[0u].x);
-  v1 = float2((x_35).xx);
-  int x_38 = asint(x_8[0u].x);
-  v1[x_38] = ldexp(v1.y, -256);
-  float2 v = v1;
-  float2 v_1 = float2(x_35, 0.0f);
-  if ((mul(float2x2(v_1, float2(0.0f, x_35)), v)[0u] == x_35)) {
-    float x_53 = float(x_38);
-    float x_56 = float(asint(x_8[1u].x));
-    x_GLF_color = float4(x_53, x_56, x_56, x_53);
-  } else {
-    x_GLF_color = float4((float(asint(x_8[1u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_2 = {x_GLF_color};
-  return v_2;
-}
-
-main_outputs main() {
-  main_out v_3 = main_inner();
-  main_outputs v_4 = {v_3.x_GLF_color_1};
-  return v_4;
-}
-
-FXC validation failure:
-<scrubbed_path>(22,3-10): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 256e059..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,56 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_8 : register(b1) {
-  uint4 x_8[2];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float2 v1 = (0.0f).xx;
-  float x_35 = asfloat(x_6[0u].x);
-  v1 = float2(x_35, x_35);
-  int x_38 = asint(x_8[0u].x);
-  float x_40 = v1.y;
-  v1[x_38] = ldexp(x_40, -256);
-  float2 x_43 = v1;
-  float2 v = float2(x_35, 0.0f);
-  if ((mul(float2x2(v, float2(0.0f, x_35)), x_43)[0u] == x_35)) {
-    float x_53 = float(x_38);
-    int x_55 = asint(x_8[1u].x);
-    float x_56 = float(x_55);
-    x_GLF_color = float4(x_53, x_56, x_56, x_53);
-  } else {
-    int x_59 = asint(x_8[1u].x);
-    float x_60 = float(x_59);
-    x_GLF_color = float4(x_60, x_60, x_60, x_60);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_1 = {x_GLF_color};
-  return v_1;
-}
-
-main_outputs main() {
-  main_out v_2 = main_inner();
-  main_outputs v_3 = {v_2.x_GLF_color_1};
-  return v_3;
-}
-
-FXC validation failure:
-<scrubbed_path>(23,3-10): error X3500: array reference cannot be used as an l-value; not natively addressable
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 718e3cc..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,96 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-cbuffer cbuffer_x_7 : register(b1) {
-  uint4 x_7[2];
-};
-cbuffer cbuffer_x_10 : register(b0) {
-  uint4 x_10[4];
-};
-static float4 gl_FragCoord = (0.0f).xxxx;
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float2x3 m23 = float2x3((0.0f).xxx, (0.0f).xxx);
-  int i = 0;
-  float x_46 = asfloat(x_7[1u].x);
-  float3 v = float3(x_46, 0.0f, 0.0f);
-  m23 = float2x3(v, float3(0.0f, x_46, 0.0f));
-  i = 1;
-  {
-    while(true) {
-      bool x_80 = false;
-      bool x_81 = false;
-      int v_1 = i;
-      if ((v_1 < asint(x_10[3u].x))) {
-      } else {
-        break;
-      }
-      int x_60 = asint(x_10[0u].x);
-      int x_62 = asint(x_10[2u].x);
-      float v_2 = m23[x_60][x_62];
-      m23[x_60][x_62] = (v_2 + asfloat(x_7[0u].x));
-      float v_3 = gl_FragCoord.y;
-      if ((v_3 < asfloat(x_7[0u].x))) {
-      }
-      x_81 = true;
-      if (true) {
-        x_80 = (gl_FragCoord.x < 0.0f);
-        x_81 = x_80;
-      }
-      if (!(x_81)) {
-        break;
-      }
-      {
-        i = (i + 1);
-      }
-      continue;
-    }
-  }
-  float v_4 = float(asint(x_10[1u].x));
-  float v_5 = float(asint(x_10[1u].x));
-  float3 v_6 = float3(v_4, v_5, float(asint(x_10[1u].x)));
-  float v_7 = float(asint(x_10[1u].x));
-  float v_8 = float(asint(x_10[1u].x));
-  float2x3 x_108 = float2x3(v_6, float3(v_7, v_8, float(asint(x_10[0u].x))));
-  bool v_9 = all((m23[0u] == x_108[0u]));
-  if ((v_9 & all((m23[1u] == x_108[1u])))) {
-    float v_10 = float(asint(x_10[0u].x));
-    float v_11 = float(asint(x_10[1u].x));
-    float v_12 = float(asint(x_10[1u].x));
-    x_GLF_color = float4(v_10, v_11, v_12, float(asint(x_10[0u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_10[1u].x))).xxxx);
-  }
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v_13 = {x_GLF_color};
-  return v_13;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_14 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_15 = {v_14.x_GLF_color_1};
-  return v_15;
-}
-
-FXC validation failure:
-<scrubbed_path>(41,7-15): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(30,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index c71e57a..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,115 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-cbuffer cbuffer_x_7 : register(b1) {
-  uint4 x_7[2];
-};
-cbuffer cbuffer_x_10 : register(b0) {
-  uint4 x_10[4];
-};
-static float4 gl_FragCoord = (0.0f).xxxx;
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float2x3 m23 = float2x3((0.0f).xxx, (0.0f).xxx);
-  int i = 0;
-  float x_46 = asfloat(x_7[1u].x);
-  float3 v = float3(x_46, 0.0f, 0.0f);
-  m23 = float2x3(v, float3(0.0f, x_46, 0.0f));
-  i = 1;
-  {
-    while(true) {
-      bool x_80 = false;
-      bool x_81_phi = false;
-      int x_54 = i;
-      int x_56 = asint(x_10[3u].x);
-      if ((x_54 < x_56)) {
-      } else {
-        break;
-      }
-      int x_60 = asint(x_10[0u].x);
-      int x_62 = asint(x_10[2u].x);
-      float x_64 = asfloat(x_7[0u].x);
-      float x_66 = m23[x_60][x_62];
-      m23[x_60][x_62] = (x_66 + x_64);
-      float x_70 = gl_FragCoord.y;
-      float x_72 = asfloat(x_7[0u].x);
-      if ((x_70 < x_72)) {
-      }
-      x_81_phi = true;
-      if (true) {
-        float x_79 = gl_FragCoord.x;
-        x_80 = (x_79 < 0.0f);
-        x_81_phi = x_80;
-      }
-      bool x_81 = x_81_phi;
-      if (!(x_81)) {
-        break;
-      }
-      {
-        int x_85 = i;
-        i = (x_85 + 1);
-      }
-      continue;
-    }
-  }
-  float2x3 x_87 = m23;
-  int x_89 = asint(x_10[1u].x);
-  int x_92 = asint(x_10[1u].x);
-  int x_95 = asint(x_10[1u].x);
-  int x_98 = asint(x_10[1u].x);
-  int x_101 = asint(x_10[1u].x);
-  int x_104 = asint(x_10[0u].x);
-  float v_1 = float(x_89);
-  float v_2 = float(x_92);
-  float3 v_3 = float3(v_1, v_2, float(x_95));
-  float v_4 = float(x_98);
-  float v_5 = float(x_101);
-  float2x3 x_108 = float2x3(v_3, float3(v_4, v_5, float(x_104)));
-  bool v_6 = all((x_87[0u] == x_108[0u]));
-  if ((v_6 & all((x_87[1u] == x_108[1u])))) {
-    int x_122 = asint(x_10[0u].x);
-    int x_125 = asint(x_10[1u].x);
-    int x_128 = asint(x_10[1u].x);
-    int x_131 = asint(x_10[0u].x);
-    float v_7 = float(x_122);
-    float v_8 = float(x_125);
-    float v_9 = float(x_128);
-    x_GLF_color = float4(v_7, v_8, v_9, float(x_131));
-  } else {
-    int x_135 = asint(x_10[1u].x);
-    float x_136 = float(x_135);
-    x_GLF_color = float4(x_136, x_136, x_136, x_136);
-  }
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v_10 = {x_GLF_color};
-  return v_10;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_11 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_12 = {v_11.x_GLF_color_1};
-  return v_12;
-}
-
-FXC validation failure:
-<scrubbed_path>(43,7-15): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(30,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 03fccdf..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,95 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_10 : register(b1) {
-  uint4 x_10[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 v0 = (0.0f).xxxx;
-  float4 v1 = (0.0f).xxxx;
-  int a = 0;
-  int c = 0;
-  v0 = float4((asfloat(x_6[1u].x)).xxxx);
-  v1 = float4((asfloat(x_6[0u].x)).xxxx);
-  a = asint(x_10[1u].x);
-  {
-    while(true) {
-      int v = a;
-      if ((v < asint(x_10[0u].x))) {
-      } else {
-        break;
-      }
-      c = asint(x_10[3u].x);
-      {
-        while(true) {
-          int v_1 = c;
-          if ((v_1 < asint(x_10[2u].x))) {
-          } else {
-            break;
-          }
-          int x_69 = min(max(c, 0), 3);
-          float v_2 = v0[x_69];
-          v0[x_69] = (v_2 - asfloat(x_6[1u].x));
-          int v_3 = asint(x_10[1u].x);
-          if ((v_3 == asint(x_10[3u].x))) {
-            int x_83 = a;
-            float v_4 = asfloat(x_6[1u].x);
-            float v_5 = asfloat(x_6[1u].x);
-            float4 v_6 = float4(v_4, v_5, asfloat(x_6[1u].x), 3.0f);
-            float4 v_7 = smoothstep(v_6, (1.0f).xxxx, v0);
-            v1[x_83] = v_7[a];
-          }
-          {
-            c = (c + 1);
-          }
-          continue;
-        }
-      }
-      {
-        a = (a + 1);
-      }
-      continue;
-    }
-  }
-  float v_8 = v1.x;
-  if ((v_8 == asfloat(x_6[0u].x))) {
-    float v_9 = float(asint(x_10[1u].x));
-    float v_10 = float(asint(x_10[3u].x));
-    float v_11 = float(asint(x_10[3u].x));
-    x_GLF_color = float4(v_9, v_10, v_11, float(asint(x_10[1u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_10[3u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_12 = {x_GLF_color};
-  return v_12;
-}
-
-main_outputs main() {
-  main_out v_13 = main_inner();
-  main_outputs v_14 = {v_13.x_GLF_color_1};
-  return v_14;
-}
-
-FXC validation failure:
-<scrubbed_path>(42,11-18): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(34,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(26,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index fe1be4e..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,114 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b0) {
-  uint4 x_6[2];
-};
-cbuffer cbuffer_x_10 : register(b1) {
-  uint4 x_10[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 v0 = (0.0f).xxxx;
-  float4 v1 = (0.0f).xxxx;
-  int a = 0;
-  int c = 0;
-  float x_41 = asfloat(x_6[1u].x);
-  v0 = float4(x_41, x_41, x_41, x_41);
-  float x_44 = asfloat(x_6[0u].x);
-  v1 = float4(x_44, x_44, x_44, x_44);
-  int x_47 = asint(x_10[1u].x);
-  a = x_47;
-  {
-    while(true) {
-      int x_52 = a;
-      int x_54 = asint(x_10[0u].x);
-      if ((x_52 < x_54)) {
-      } else {
-        break;
-      }
-      int x_58 = asint(x_10[3u].x);
-      c = x_58;
-      {
-        while(true) {
-          int x_63 = c;
-          int x_65 = asint(x_10[2u].x);
-          if ((x_63 < x_65)) {
-          } else {
-            break;
-          }
-          int x_68 = c;
-          int x_69 = min(max(x_68, 0), 3);
-          float x_71 = asfloat(x_6[1u].x);
-          float x_73 = v0[x_69];
-          v0[x_69] = (x_73 - x_71);
-          int x_77 = asint(x_10[1u].x);
-          int x_79 = asint(x_10[3u].x);
-          if ((x_77 == x_79)) {
-            int x_83 = a;
-            float x_85 = asfloat(x_6[1u].x);
-            float x_87 = asfloat(x_6[1u].x);
-            float x_89 = asfloat(x_6[1u].x);
-            float4 x_91 = v0;
-            int x_93 = a;
-            v1[x_83] = smoothstep(float4(x_85, x_87, x_89, 3.0f), (1.0f).xxxx, x_91)[x_93];
-          }
-          {
-            int x_96 = c;
-            c = (x_96 + 1);
-          }
-          continue;
-        }
-      }
-      {
-        int x_98 = a;
-        a = (x_98 + 1);
-      }
-      continue;
-    }
-  }
-  float x_101 = v1.x;
-  float x_103 = asfloat(x_6[0u].x);
-  if ((x_101 == x_103)) {
-    int x_109 = asint(x_10[1u].x);
-    int x_112 = asint(x_10[3u].x);
-    int x_115 = asint(x_10[3u].x);
-    int x_118 = asint(x_10[1u].x);
-    float v = float(x_109);
-    float v_1 = float(x_112);
-    float v_2 = float(x_115);
-    x_GLF_color = float4(v, v_1, v_2, float(x_118));
-  } else {
-    int x_122 = asint(x_10[3u].x);
-    float x_123 = float(x_122);
-    x_GLF_color = float4(x_123, x_123, x_123, x_123);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_3 = {x_GLF_color};
-  return v_3;
-}
-
-main_outputs main() {
-  main_out v_4 = main_inner();
-  main_outputs v_5 = {v_4.x_GLF_color_1};
-  return v_5;
-}
-
-FXC validation failure:
-<scrubbed_path>(50,11-18): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(39,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(29,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index e812c4c..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,91 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_5 : register(b0) {
-  uint4 x_5[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float2x2 m = float2x2((0.0f).xx, (0.0f).xx);
-  float f = 0.0f;
-  int i = 0;
-  int j = 0;
-  if ((asint(x_5[1u].x) == 1)) {
-    float2 v = float2(f, 0.0f);
-    m = float2x2(v, float2(0.0f, f));
-  }
-  i = asint(x_5[1u].x);
-  {
-    while(true) {
-      int v_1 = i;
-      if ((v_1 < asint(x_5[0u].x))) {
-      } else {
-        break;
-      }
-      j = asint(x_5[1u].x);
-      {
-        while(true) {
-          int v_2 = j;
-          if ((v_2 < asint(x_5[0u].x))) {
-          } else {
-            break;
-          }
-          int x_66 = i;
-          int x_67 = j;
-          int v_3 = i;
-          int v_4 = (v_3 * asint(x_5[0u].x));
-          m[x_66][x_67] = float((v_4 + j));
-          {
-            j = (j + 1);
-          }
-          continue;
-        }
-      }
-      {
-        i = (i + 1);
-      }
-      continue;
-    }
-  }
-  float v_5 = float(asint(x_5[1u].x));
-  float2 v_6 = float2(v_5, float(asint(x_5[2u].x)));
-  float v_7 = float(asint(x_5[0u].x));
-  float2x2 x_95 = float2x2(v_6, float2(v_7, float(asint(x_5[3u].x))));
-  bool v_8 = all((m[0u] == x_95[0u]));
-  if ((v_8 & all((m[1u] == x_95[1u])))) {
-    float v_9 = float(asint(x_5[2u].x));
-    float v_10 = float(asint(x_5[1u].x));
-    float v_11 = float(asint(x_5[1u].x));
-    x_GLF_color = float4(v_9, v_10, v_11, float(asint(x_5[2u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_5[1u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_12 = {x_GLF_color};
-  return v_12;
-}
-
-main_outputs main() {
-  main_out v_13 = main_inner();
-  main_outputs v_14 = {v_13.x_GLF_color_1};
-  return v_14;
-}
-
-FXC validation failure:
-<scrubbed_path>(43,11-17): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(33,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(25,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index c1d51cb..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,111 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_5 : register(b0) {
-  uint4 x_5[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float2x2 m = float2x2((0.0f).xx, (0.0f).xx);
-  float f = 0.0f;
-  int i = 0;
-  int j = 0;
-  int x_36 = asint(x_5[1u].x);
-  if ((x_36 == 1)) {
-    float x_40 = f;
-    float2 v = float2(x_40, 0.0f);
-    m = float2x2(v, float2(0.0f, x_40));
-  }
-  int x_45 = asint(x_5[1u].x);
-  i = x_45;
-  {
-    while(true) {
-      int x_50 = i;
-      int x_52 = asint(x_5[0u].x);
-      if ((x_50 < x_52)) {
-      } else {
-        break;
-      }
-      int x_56 = asint(x_5[1u].x);
-      j = x_56;
-      {
-        while(true) {
-          int x_61 = j;
-          int x_63 = asint(x_5[0u].x);
-          if ((x_61 < x_63)) {
-          } else {
-            break;
-          }
-          int x_66 = i;
-          int x_67 = j;
-          int x_68 = i;
-          int x_70 = asint(x_5[0u].x);
-          int x_72 = j;
-          m[x_66][x_67] = float(((x_68 * x_70) + x_72));
-          {
-            int x_76 = j;
-            j = (x_76 + 1);
-          }
-          continue;
-        }
-      }
-      {
-        int x_78 = i;
-        i = (x_78 + 1);
-      }
-      continue;
-    }
-  }
-  float2x2 x_80 = m;
-  int x_82 = asint(x_5[1u].x);
-  int x_85 = asint(x_5[2u].x);
-  int x_88 = asint(x_5[0u].x);
-  int x_91 = asint(x_5[3u].x);
-  float v_1 = float(x_82);
-  float2 v_2 = float2(v_1, float(x_85));
-  float v_3 = float(x_88);
-  float2x2 x_95 = float2x2(v_2, float2(v_3, float(x_91)));
-  bool v_4 = all((x_80[0u] == x_95[0u]));
-  if ((v_4 & all((x_80[1u] == x_95[1u])))) {
-    int x_109 = asint(x_5[2u].x);
-    int x_112 = asint(x_5[1u].x);
-    int x_115 = asint(x_5[1u].x);
-    int x_118 = asint(x_5[2u].x);
-    float v_5 = float(x_109);
-    float v_6 = float(x_112);
-    float v_7 = float(x_115);
-    x_GLF_color = float4(v_5, v_6, v_7, float(x_118));
-  } else {
-    int x_122 = asint(x_5[1u].x);
-    float x_123 = float(x_122);
-    x_GLF_color = float4(x_123, x_123, x_123, x_123);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_8 = {x_GLF_color};
-  return v_8;
-}
-
-main_outputs main() {
-  main_out v_9 = main_inner();
-  main_outputs v_10 = {v_9.x_GLF_color_1};
-  return v_10;
-}
-
-FXC validation failure:
-<scrubbed_path>(50,11-17): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(38,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(28,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 590f760..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,70 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_7 : register(b0) {
-  uint4 x_7[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int4 a = (0).xxxx;
-  int i = 0;
-  int sum = 0;
-  a = (0).xxxx;
-  i = 0;
-  {
-    while(true) {
-      int v = i;
-      if ((v < (asint(x_7[0u].w) + 1))) {
-      } else {
-        break;
-      }
-      int v_1 = i;
-      int v_2 = asint(x_7[0u].x);
-      int v_3 = i;
-      uint v_4 = (uint(min(max(v_1, v_2), v_3)) * 4u);
-      if ((asint(x_7[(v_4 / 16u)][((v_4 % 16u) / 4u)]) == 1)) {
-        int x_57 = i;
-        a[x_57] = 5;
-      } else {
-        int x_59 = i;
-        a[x_59] = i;
-      }
-      {
-        i = (i + 1);
-      }
-      continue;
-    }
-  }
-  sum = (((a.x + a.y) + a.z) + a.w);
-  if ((sum == 10)) {
-    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = (0.0f).xxxx;
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_5 = {x_GLF_color};
-  return v_5;
-}
-
-main_outputs main() {
-  main_out v_6 = main_inner();
-  main_outputs v_7 = {v_6.x_GLF_color_1};
-  return v_7;
-}
-
-FXC validation failure:
-<scrubbed_path>(21,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 0c15cfa..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,79 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_7 : register(b0) {
-  uint4 x_7[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int4 a = (0).xxxx;
-  int i = 0;
-  int sum = 0;
-  a = (0).xxxx;
-  i = 0;
-  {
-    while(true) {
-      int x_40 = i;
-      int x_42 = asint(x_7[0u].w);
-      if ((x_40 < (x_42 + 1))) {
-      } else {
-        break;
-      }
-      int x_46 = i;
-      int x_48 = asint(x_7[0u].x);
-      int x_49 = i;
-      uint v = (uint(min(max(x_46, x_48), x_49)) * 4u);
-      int x_52 = asint(x_7[(v / 16u)][((v % 16u) / 4u)]);
-      if ((x_52 == 1)) {
-        int x_57 = i;
-        a[x_57] = 5;
-      } else {
-        int x_59 = i;
-        int x_60 = i;
-        a[x_59] = x_60;
-      }
-      {
-        int x_62 = i;
-        i = (x_62 + 1);
-      }
-      continue;
-    }
-  }
-  int x_65 = a.x;
-  int x_67 = a.y;
-  int x_70 = a.z;
-  int x_73 = a.w;
-  sum = (((x_65 + x_67) + x_70) + x_73);
-  int x_75 = sum;
-  if ((x_75 == 10)) {
-    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = (0.0f).xxxx;
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_1 = {x_GLF_color};
-  return v_1;
-}
-
-main_outputs main() {
-  main_out v_2 = main_inner();
-  main_outputs v_3 = {v_2.x_GLF_color_1};
-  return v_3;
-}
-
-FXC validation failure:
-<scrubbed_path>(21,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 3c75f33..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,105 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_7 : register(b0) {
-  uint4 x_7[2];
-};
-cbuffer cbuffer_x_11 : register(b1) {
-  uint4 x_11[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 color = (0.0f).xxxx;
-  int i = 0;
-  int j = 0;
-  int k = 0;
-  color = (1.0f).xxxx;
-  i = asint(x_7[0u].x);
-  {
-    while(true) {
-      int v = i;
-      if ((v < asint(x_7[1u].x))) {
-      } else {
-        break;
-      }
-      int x_47 = i;
-      switch(x_47) {
-        case 2:
-        {
-          int x_83 = i;
-          color[x_83] = asfloat(x_11[0u].x);
-          break;
-        }
-        case 1:
-        {
-          j = asint(x_7[0u].x);
-          {
-            while(true) {
-              if ((i > i)) {
-              } else {
-                break;
-              }
-              k = asint(x_7[0u].x);
-              {
-                while(true) {
-                  if ((k < i)) {
-                  } else {
-                    break;
-                  }
-                  int x_71 = k;
-                  color[x_71] = asfloat(x_11[0u].x);
-                  {
-                    k = (k + 1);
-                  }
-                  continue;
-                }
-              }
-              {
-                j = (j + 1);
-              }
-              continue;
-            }
-          }
-          int x_79 = i;
-          color[x_79] = asfloat(x_11[0u].x);
-          break;
-        }
-        default:
-        {
-          break;
-        }
-      }
-      {
-        i = (i + 1);
-      }
-      continue;
-    }
-  }
-  x_GLF_color = color;
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_1 = {x_GLF_color};
-  return v_1;
-}
-
-main_outputs main() {
-  main_out v_2 = main_inner();
-  main_outputs v_3 = {v_2.x_GLF_color_1};
-  return v_3;
-}
-
-FXC validation failure:
-<scrubbed_path>(25,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index d4c544a..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,120 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_7 : register(b0) {
-  uint4 x_7[2];
-};
-cbuffer cbuffer_x_11 : register(b1) {
-  uint4 x_11[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4 color = (0.0f).xxxx;
-  int i = 0;
-  int j = 0;
-  int k = 0;
-  color = (1.0f).xxxx;
-  int x_37 = asint(x_7[0u].x);
-  i = x_37;
-  {
-    while(true) {
-      int x_42 = i;
-      int x_44 = asint(x_7[1u].x);
-      if ((x_42 < x_44)) {
-      } else {
-        break;
-      }
-      int x_47 = i;
-      switch(x_47) {
-        case 2:
-        {
-          int x_83 = i;
-          float x_85 = asfloat(x_11[0u].x);
-          color[x_83] = x_85;
-          break;
-        }
-        case 1:
-        {
-          int x_52 = asint(x_7[0u].x);
-          j = x_52;
-          {
-            while(true) {
-              int x_57 = i;
-              int x_58 = i;
-              if ((x_57 > x_58)) {
-              } else {
-                break;
-              }
-              int x_62 = asint(x_7[0u].x);
-              k = x_62;
-              {
-                while(true) {
-                  int x_67 = k;
-                  int x_68 = i;
-                  if ((x_67 < x_68)) {
-                  } else {
-                    break;
-                  }
-                  int x_71 = k;
-                  float x_73 = asfloat(x_11[0u].x);
-                  color[x_71] = x_73;
-                  {
-                    int x_75 = k;
-                    k = (x_75 + 1);
-                  }
-                  continue;
-                }
-              }
-              {
-                int x_77 = j;
-                j = (x_77 + 1);
-              }
-              continue;
-            }
-          }
-          int x_79 = i;
-          float x_81 = asfloat(x_11[0u].x);
-          color[x_79] = x_81;
-          break;
-        }
-        default:
-        {
-          break;
-        }
-      }
-      {
-        int x_87 = i;
-        i = (x_87 + 1);
-      }
-      continue;
-    }
-  }
-  float4 x_89 = color;
-  x_GLF_color = x_89;
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v = {x_GLF_color};
-  return v;
-}
-
-main_outputs main() {
-  main_out v_1 = main_inner();
-  main_outputs v_2 = {v_1.x_GLF_color_1};
-  return v_2;
-}
-
-FXC validation failure:
-<scrubbed_path>(26,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 69df49a..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,105 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b1) {
-  uint4 x_6[4];
-};
-cbuffer cbuffer_x_10 : register(b0) {
-  uint4 x_10[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-int tint_mod_i32(int lhs, int rhs) {
-  int v = ((((rhs == 0) | ((lhs == -2147483648) & (rhs == -1)))) ? (1) : (rhs));
-  return (lhs - ((lhs / v) * v));
-}
-
-void main_1() {
-  float4x4 m0 = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  int c = 0;
-  float4x4 m1 = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  float x_41 = float(asint(x_6[1u].x));
-  float4 v_1 = float4(x_41, 0.0f, 0.0f, 0.0f);
-  float4 v_2 = float4(0.0f, x_41, 0.0f, 0.0f);
-  float4 v_3 = float4(0.0f, 0.0f, x_41, 0.0f);
-  m0 = float4x4(v_1, v_2, v_3, float4(0.0f, 0.0f, 0.0f, x_41));
-  c = asint(x_6[2u].x);
-  {
-    while(true) {
-      int v_4 = c;
-      if ((v_4 < asint(x_6[0u].x))) {
-      } else {
-        break;
-      }
-      m1 = m0;
-      int x_59 = c;
-      int x_61 = asint(x_6[3u].x);
-      int x_64 = asint(x_6[2u].x);
-      float4 v_5 = m1[tint_mod_i32(x_59, x_61)];
-      v_5[x_64] = asfloat(x_10[0u].x);
-      int x_68 = c;
-      int x_70 = asint(x_6[3u].x);
-      int x_73 = asint(x_6[2u].x);
-      float4 v_6 = m0[tint_mod_i32(x_68, x_70)];
-      v_6[x_73] = asfloat(x_10[0u].x);
-      {
-        c = (c + 1);
-      }
-      continue;
-    }
-  }
-  float v_7 = float(asint(x_6[1u].x));
-  float v_8 = float(asint(x_6[2u].x));
-  float v_9 = float(asint(x_6[1u].x));
-  float4 v_10 = float4(v_7, v_8, v_9, float(asint(x_6[1u].x)));
-  float v_11 = float(asint(x_6[1u].x));
-  float v_12 = float(asint(x_6[2u].x));
-  float v_13 = float(asint(x_6[1u].x));
-  float4 v_14 = float4(v_11, v_12, v_13, float(asint(x_6[1u].x)));
-  float v_15 = float(asint(x_6[1u].x));
-  float v_16 = float(asint(x_6[2u].x));
-  float v_17 = float(asint(x_6[1u].x));
-  float4 v_18 = float4(v_15, v_16, v_17, float(asint(x_6[1u].x)));
-  float v_19 = float(asint(x_6[1u].x));
-  float v_20 = float(asint(x_6[2u].x));
-  float v_21 = float(asint(x_6[1u].x));
-  float4x4 x_132 = float4x4(v_10, v_14, v_18, float4(v_19, v_20, v_21, float(asint(x_6[1u].x))));
-  bool v_22 = all((m0[0u] == x_132[0u]));
-  bool v_23 = (v_22 & all((m0[1u] == x_132[1u])));
-  bool v_24 = (v_23 & all((m0[2u] == x_132[2u])));
-  if ((v_24 & all((m0[3u] == x_132[3u])))) {
-    float v_25 = float(asint(x_6[2u].x));
-    float v_26 = float(asint(x_6[1u].x));
-    float v_27 = float(asint(x_6[1u].x));
-    x_GLF_color = float4(v_25, v_26, v_27, float(asint(x_6[2u].x)));
-  } else {
-    x_GLF_color = float4((float(asint(x_6[1u].x))).xxxx);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_28 = {x_GLF_color};
-  return v_28;
-}
-
-main_outputs main() {
-  main_out v_29 = main_inner();
-  main_outputs v_30 = {v_29.x_GLF_color_1};
-  return v_30;
-}
-
-FXC validation failure:
-<scrubbed_path>(19,19-25): warning X3556: integer divides may be much slower, try using uints if possible.
-<scrubbed_path>(44,7-15): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(33,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 1c59b70..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,133 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_6 : register(b1) {
-  uint4 x_6[4];
-};
-cbuffer cbuffer_x_10 : register(b0) {
-  uint4 x_10[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-int tint_mod_i32(int lhs, int rhs) {
-  int v = ((((rhs == 0) | ((lhs == -2147483648) & (rhs == -1)))) ? (1) : (rhs));
-  return (lhs - ((lhs / v) * v));
-}
-
-void main_1() {
-  float4x4 m0 = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  int c = 0;
-  float4x4 m1 = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  int x_40 = asint(x_6[1u].x);
-  float x_41 = float(x_40);
-  float4 v_1 = float4(x_41, 0.0f, 0.0f, 0.0f);
-  float4 v_2 = float4(0.0f, x_41, 0.0f, 0.0f);
-  float4 v_3 = float4(0.0f, 0.0f, x_41, 0.0f);
-  m0 = float4x4(v_1, v_2, v_3, float4(0.0f, 0.0f, 0.0f, x_41));
-  int x_48 = asint(x_6[2u].x);
-  c = x_48;
-  {
-    while(true) {
-      int x_53 = c;
-      int x_55 = asint(x_6[0u].x);
-      if ((x_53 < x_55)) {
-      } else {
-        break;
-      }
-      float4x4 x_58 = m0;
-      m1 = x_58;
-      int x_59 = c;
-      int x_61 = asint(x_6[3u].x);
-      int x_64 = asint(x_6[2u].x);
-      float x_66 = asfloat(x_10[0u].x);
-      m1[tint_mod_i32(x_59, x_61)][x_64] = x_66;
-      int x_68 = c;
-      int x_70 = asint(x_6[3u].x);
-      int x_73 = asint(x_6[2u].x);
-      float x_75 = asfloat(x_10[0u].x);
-      m0[tint_mod_i32(x_68, x_70)][x_73] = x_75;
-      {
-        int x_77 = c;
-        c = (x_77 + 1);
-      }
-      continue;
-    }
-  }
-  float4x4 x_79 = m0;
-  int x_81 = asint(x_6[1u].x);
-  int x_84 = asint(x_6[2u].x);
-  int x_87 = asint(x_6[1u].x);
-  int x_90 = asint(x_6[1u].x);
-  int x_93 = asint(x_6[1u].x);
-  int x_96 = asint(x_6[2u].x);
-  int x_99 = asint(x_6[1u].x);
-  int x_102 = asint(x_6[1u].x);
-  int x_105 = asint(x_6[1u].x);
-  int x_108 = asint(x_6[2u].x);
-  int x_111 = asint(x_6[1u].x);
-  int x_114 = asint(x_6[1u].x);
-  int x_117 = asint(x_6[1u].x);
-  int x_120 = asint(x_6[2u].x);
-  int x_123 = asint(x_6[1u].x);
-  int x_126 = asint(x_6[1u].x);
-  float v_4 = float(x_81);
-  float v_5 = float(x_84);
-  float v_6 = float(x_87);
-  float4 v_7 = float4(v_4, v_5, v_6, float(x_90));
-  float v_8 = float(x_93);
-  float v_9 = float(x_96);
-  float v_10 = float(x_99);
-  float4 v_11 = float4(v_8, v_9, v_10, float(x_102));
-  float v_12 = float(x_105);
-  float v_13 = float(x_108);
-  float v_14 = float(x_111);
-  float4 v_15 = float4(v_12, v_13, v_14, float(x_114));
-  float v_16 = float(x_117);
-  float v_17 = float(x_120);
-  float v_18 = float(x_123);
-  float4x4 x_132 = float4x4(v_7, v_11, v_15, float4(v_16, v_17, v_18, float(x_126)));
-  bool v_19 = all((x_79[0u] == x_132[0u]));
-  bool v_20 = (v_19 & all((x_79[1u] == x_132[1u])));
-  bool v_21 = (v_20 & all((x_79[2u] == x_132[2u])));
-  if ((v_21 & all((x_79[3u] == x_132[3u])))) {
-    int x_156 = asint(x_6[2u].x);
-    int x_159 = asint(x_6[1u].x);
-    int x_162 = asint(x_6[1u].x);
-    int x_165 = asint(x_6[2u].x);
-    float v_22 = float(x_156);
-    float v_23 = float(x_159);
-    float v_24 = float(x_162);
-    x_GLF_color = float4(v_22, v_23, v_24, float(x_165));
-  } else {
-    int x_169 = asint(x_6[1u].x);
-    float x_170 = float(x_169);
-    x_GLF_color = float4(x_170, x_170, x_170, x_170);
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_25 = {x_GLF_color};
-  return v_25;
-}
-
-main_outputs main() {
-  main_out v_26 = main_inner();
-  main_outputs v_27 = {v_26.x_GLF_color_1};
-  return v_27;
-}
-
-FXC validation failure:
-<scrubbed_path>(19,19-25): warning X3556: integer divides may be much slower, try using uints if possible.
-<scrubbed_path>(48,7-34): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(35,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index 0673328..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,114 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-cbuffer cbuffer_x_9 : register(b0) {
-  uint4 x_9[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-static float4 gl_FragCoord = (0.0f).xxxx;
-static bool continue_execution = true;
-int tint_f32_to_i32(float value) {
-  return (((value <= 2147483520.0f)) ? ((((value >= -2147483648.0f)) ? (int(value)) : (-2147483648))) : (2147483647));
-}
-
-void main_1() {
-  float2 v = (0.0f).xx;
-  float floats[9] = (float[9])0;
-  int one = 0;
-  int i = 0;
-  bool alwaysFalse = false;
-  v = (0.0f).xx;
-  floats[1] = 0.0f;
-  one = tint_f32_to_i32(asfloat(x_9[0u].y));
-  {
-    while(true) {
-      i = 0;
-      {
-        while(true) {
-          if ((i < one)) {
-          } else {
-            break;
-          }
-          if ((i == 0)) {
-            float v_1 = asfloat(x_9[0u].x);
-            alwaysFalse = (v_1 > asfloat(x_9[0u].y));
-            if (!(alwaysFalse)) {
-              int x_73 = one;
-              floats[x_73] = 1.0f;
-              x_GLF_color = float4(1.0f, 1.0f, 0.0f, 1.0f);
-            }
-            int x_75 = one;
-            v[x_75] = 1.0f;
-            if (alwaysFalse) {
-              continue_execution = false;
-            }
-            if ((asfloat(x_9[0u].y) < 0.0f)) {
-              x_GLF_color = float4(0.0f, 1.0f, 0.0f, 1.0f);
-            }
-          }
-          {
-            i = (i + 1);
-          }
-          continue;
-        }
-      }
-      {
-        int x_87 = one;
-        if (!((x_87 < 0))) { break; }
-      }
-      continue;
-    }
-  }
-  bool x_102 = false;
-  bool x_103 = false;
-  if ((gl_FragCoord.y >= 0.0f)) {
-    bool x_97 = (v.y == 1.0f);
-    x_103 = x_97;
-    if (x_97) {
-      x_102 = (floats[1] == 1.0f);
-      x_103 = x_102;
-    }
-    if (x_103) {
-      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-    }
-  } else {
-    x_GLF_color = (0.0f).xxxx;
-  }
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v_2 = {x_GLF_color};
-  return v_2;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_3 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_4 = {v_3.x_GLF_color_1};
-  if (!(continue_execution)) {
-    discard;
-  }
-  main_outputs v_5 = v_4;
-  return v_5;
-}
-
-FXC validation failure:
-<scrubbed_path>(51,13-19): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(37,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(34,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index f2c5dab..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,127 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-cbuffer cbuffer_x_9 : register(b0) {
-  uint4 x_9[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-static float4 gl_FragCoord = (0.0f).xxxx;
-static bool continue_execution = true;
-int tint_f32_to_i32(float value) {
-  return (((value <= 2147483520.0f)) ? ((((value >= -2147483648.0f)) ? (int(value)) : (-2147483648))) : (2147483647));
-}
-
-void main_1() {
-  float2 v = (0.0f).xx;
-  float floats[9] = (float[9])0;
-  int one = 0;
-  int i = 0;
-  bool alwaysFalse = false;
-  v = (0.0f).xx;
-  floats[1] = 0.0f;
-  float x_46 = asfloat(x_9[0u].y);
-  one = tint_f32_to_i32(x_46);
-  {
-    while(true) {
-      i = 0;
-      {
-        while(true) {
-          int x_56 = i;
-          int x_57 = one;
-          if ((x_56 < x_57)) {
-          } else {
-            break;
-          }
-          int x_60 = i;
-          if ((x_60 == 0)) {
-            float x_65 = asfloat(x_9[0u].x);
-            float x_67 = asfloat(x_9[0u].y);
-            alwaysFalse = (x_65 > x_67);
-            bool x_69 = alwaysFalse;
-            if (!(x_69)) {
-              int x_73 = one;
-              floats[x_73] = 1.0f;
-              x_GLF_color = float4(1.0f, 1.0f, 0.0f, 1.0f);
-            }
-            int x_75 = one;
-            v[x_75] = 1.0f;
-            bool x_77 = alwaysFalse;
-            if (x_77) {
-              continue_execution = false;
-            }
-            float x_81 = asfloat(x_9[0u].y);
-            if ((x_81 < 0.0f)) {
-              x_GLF_color = float4(0.0f, 1.0f, 0.0f, 1.0f);
-            }
-          }
-          {
-            int x_85 = i;
-            i = (x_85 + 1);
-          }
-          continue;
-        }
-      }
-      {
-        int x_87 = one;
-        if (!((x_87 < 0))) { break; }
-      }
-      continue;
-    }
-  }
-  bool x_102 = false;
-  bool x_103_phi = false;
-  float x_90 = gl_FragCoord.y;
-  if ((x_90 >= 0.0f)) {
-    float x_96 = v.y;
-    bool x_97 = (x_96 == 1.0f);
-    x_103_phi = x_97;
-    if (x_97) {
-      float x_101 = floats[1];
-      x_102 = (x_101 == 1.0f);
-      x_103_phi = x_102;
-    }
-    bool x_103 = x_103_phi;
-    if (x_103) {
-      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-    }
-  } else {
-    x_GLF_color = (0.0f).xxxx;
-  }
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v_1 = {x_GLF_color};
-  return v_1;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_2 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_3 = {v_2.x_GLF_color_1};
-  if (!(continue_execution)) {
-    discard;
-  }
-  main_outputs v_4 = v_3;
-  return v_4;
-}
-
-FXC validation failure:
-<scrubbed_path>(57,13-19): error X3500: array reference cannot be used as an l-value; not natively addressable
-<scrubbed_path>(38,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(35,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index ac5ea90..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,90 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-static float4 gl_FragCoord = (0.0f).xxxx;
-cbuffer cbuffer_x_7 : register(b0) {
-  uint4 x_7[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4x4 m44 = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  int x_10 = 0;
-  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
-  x_10 = 0;
-  {
-    while(true) {
-      int x_11 = 0;
-      int x_9 = 0;
-      if ((x_10 < 4)) {
-      } else {
-        break;
-      }
-      if ((gl_FragCoord.y < 0.0f)) {
-        break;
-      }
-      x_11 = 0;
-      {
-        while(true) {
-          int x_8 = 0;
-          if ((x_11 < 4)) {
-          } else {
-            break;
-          }
-          {
-            float4 v = m44[x_10];
-            int v_1 = x_11;
-            float v_2 = m44[x_10][x_11];
-            v[v_1] = (v_2 + asfloat(x_7[0u].x));
-            x_8 = (x_11 + 1);
-            x_11 = x_8;
-          }
-          continue;
-        }
-      }
-      {
-        x_9 = (x_10 + 1);
-        x_10 = x_9;
-      }
-      continue;
-    }
-  }
-  float x_77 = m44[1].y;
-  float4 x_79_1 = (0.0f).xxxx;
-  x_79_1[0u] = (x_77 - 6.0f);
-  float4 x_79 = x_79_1;
-  float x_81 = m44[2].z;
-  float4 x_83_1 = x_79;
-  x_83_1[3u] = (x_81 - 11.0f);
-  x_GLF_color = x_83_1;
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v_3 = {x_GLF_color};
-  return v_3;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_4 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_5 = {v_4.x_GLF_color_1};
-  return v_5;
-}
-
-FXC validation failure:
-<scrubbed_path>(25,5-15): error X3511: unable to unroll loop, loop does not appear to terminate in a timely manner (435 iterations) or unrolled loop is too large, use the [unroll(n)] attribute to force an exact higher number
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 123414e..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-static float4 gl_FragCoord = (0.0f).xxxx;
-cbuffer cbuffer_x_7 : register(b0) {
-  uint4 x_7[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  float4x4 m44 = float4x4((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-  int x_10_phi = 0;
-  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
-  x_10_phi = 0;
-  {
-    while(true) {
-      int x_9 = 0;
-      int x_11_phi = 0;
-      int x_10 = x_10_phi;
-      if ((x_10 < 4)) {
-      } else {
-        break;
-      }
-      float x_63 = gl_FragCoord.y;
-      if ((x_63 < 0.0f)) {
-        break;
-      }
-      x_11_phi = 0;
-      {
-        while(true) {
-          int x_8 = 0;
-          int x_11 = x_11_phi;
-          if ((x_11 < 4)) {
-          } else {
-            break;
-          }
-          {
-            float x_72 = asfloat(x_7[0u].x);
-            float x_74 = m44[x_10][x_11];
-            m44[x_10][x_11] = (x_74 + x_72);
-            x_8 = (x_11 + 1);
-            x_11_phi = x_8;
-          }
-          continue;
-        }
-      }
-      {
-        x_9 = (x_10 + 1);
-        x_10_phi = x_9;
-      }
-      continue;
-    }
-  }
-  float x_77 = m44[1].y;
-  float4 x_79_1 = (0.0f).xxxx;
-  x_79_1[0u] = (x_77 - 6.0f);
-  float4 x_79 = x_79_1;
-  float x_81 = m44[2].z;
-  float4 x_83_1 = x_79;
-  x_83_1[3u] = (x_81 - 11.0f);
-  float4 x_83 = x_83_1;
-  x_GLF_color = x_83;
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v = {x_GLF_color};
-  return v;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_1 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_2 = {v_1.x_GLF_color_1};
-  return v_2;
-}
-
-FXC validation failure:
-<scrubbed_path>(25,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index c73e49a..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,127 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-cbuffer cbuffer_x_13 : register(b0) {
-  uint4 x_13[1];
-};
-static float4 gl_FragCoord = (0.0f).xxxx;
-static float4 x_GLF_color = (0.0f).xxxx;
-int tint_mod_i32(int lhs, int rhs) {
-  int v = ((((rhs == 0) | ((lhs == -2147483648) & (rhs == -1)))) ? (1) : (rhs));
-  return (lhs - ((lhs / v) * v));
-}
-
-float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
-  float result = 0.0f;
-  int i = 0;
-  result = -0.5f;
-  i = 1;
-  {
-    while(true) {
-      if ((i < 800)) {
-      } else {
-        break;
-      }
-      if ((tint_mod_i32(i, 32) == 0)) {
-        result = (result + 0.40000000596046447754f);
-      } else {
-        float x_149 = thirty_two;
-        float v_1 = float(i);
-        float v_2 = round(x_149);
-        float v_3 = float(i);
-        if (((v_1 - (v_2 * floor((v_3 / round(x_149))))) <= 0.00999999977648258209f)) {
-          result = (result + 100.0f);
-        }
-      }
-      float v_4 = float(i);
-      if ((v_4 >= limit)) {
-        float x_163 = result;
-        return x_163;
-      }
-      {
-        i = (i + 1);
-      }
-      continue;
-    }
-  }
-  float x_166 = result;
-  return x_166;
-}
-
-void main_1() {
-  float3 c = (0.0f).xxx;
-  float thirty_two_1 = 0.0f;
-  float param = 0.0f;
-  float param_1 = 0.0f;
-  float param_2 = 0.0f;
-  float param_3 = 0.0f;
-  int i_1 = 0;
-  c = float3(7.0f, 8.0f, 9.0f);
-  thirty_two_1 = round((asfloat(x_13[0u].x) / 8.0f));
-  param = gl_FragCoord.x;
-  param_1 = thirty_two_1;
-  float x_69 = compute_value_f1_f1_(param, param_1);
-  c[0u] = x_69;
-  param_2 = gl_FragCoord.y;
-  param_3 = thirty_two_1;
-  float x_74 = compute_value_f1_f1_(param_2, param_3);
-  c[1u] = x_74;
-  float2 v_5 = float2(c.x, c.y);
-  float4x2 x_87 = float4x2(v_5, float2(c.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
-  float v_6 = mul(float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)), c)[0u];
-  c[2u] = (v_6 + float3(x_87[0u][0u], x_87[0u][1u], x_87[1u][0u])[1u]);
-  i_1 = 0;
-  {
-    while(true) {
-      if ((i_1 < 3)) {
-      } else {
-        break;
-      }
-      if ((c[i_1] >= 1.0f)) {
-        int x_108 = i_1;
-        c[x_108] = (c[i_1] * c[i_1]);
-        if ((gl_FragCoord.y < 0.0f)) {
-          break;
-        }
-      }
-      {
-        i_1 = (i_1 + 1);
-      }
-      continue;
-    }
-  }
-  float3 x_126 = normalize(abs(c));
-  x_GLF_color = float4(x_126[0u], x_126[1u], x_126[2u], 1.0f);
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v_7 = {x_GLF_color};
-  return v_7;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_8 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_9 = {v_8.x_GLF_color_1};
-  return v_9;
-}
-
-FXC validation failure:
-<scrubbed_path>(21,19-25): warning X3556: integer divides may be much slower, try using uints if possible.
-<scrubbed_path>(85,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 6757463..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,151 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-struct main_inputs {
-  float4 gl_FragCoord_param : SV_Position;
-};
-
-
-cbuffer cbuffer_x_13 : register(b0) {
-  uint4 x_13[1];
-};
-static float4 gl_FragCoord = (0.0f).xxxx;
-static float4 x_GLF_color = (0.0f).xxxx;
-int tint_mod_i32(int lhs, int rhs) {
-  int v = ((((rhs == 0) | ((lhs == -2147483648) & (rhs == -1)))) ? (1) : (rhs));
-  return (lhs - ((lhs / v) * v));
-}
-
-float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
-  float result = 0.0f;
-  int i = 0;
-  result = -0.5f;
-  i = 1;
-  {
-    while(true) {
-      int x_136 = i;
-      if ((x_136 < 800)) {
-      } else {
-        break;
-      }
-      int x_139 = i;
-      if ((tint_mod_i32(x_139, 32) == 0)) {
-        float x_145 = result;
-        result = (x_145 + 0.40000000596046447754f);
-      } else {
-        int x_147 = i;
-        float x_149 = thirty_two;
-        float v_1 = float(x_147);
-        float v_2 = round(x_149);
-        float v_3 = float(x_147);
-        if (((v_1 - (v_2 * floor((v_3 / round(x_149))))) <= 0.00999999977648258209f)) {
-          float x_155 = result;
-          result = (x_155 + 100.0f);
-        }
-      }
-      int x_157 = i;
-      float x_159 = limit;
-      if ((float(x_157) >= x_159)) {
-        float x_163 = result;
-        return x_163;
-      }
-      {
-        int x_164 = i;
-        i = (x_164 + 1);
-      }
-      continue;
-    }
-  }
-  float x_166 = result;
-  return x_166;
-}
-
-void main_1() {
-  float3 c = (0.0f).xxx;
-  float thirty_two_1 = 0.0f;
-  float param = 0.0f;
-  float param_1 = 0.0f;
-  float param_2 = 0.0f;
-  float param_3 = 0.0f;
-  int i_1 = 0;
-  c = float3(7.0f, 8.0f, 9.0f);
-  float x_63 = asfloat(x_13[0u].x);
-  thirty_two_1 = round((x_63 / 8.0f));
-  float x_67 = gl_FragCoord.x;
-  param = x_67;
-  float x_68 = thirty_two_1;
-  param_1 = x_68;
-  float x_69 = compute_value_f1_f1_(param, param_1);
-  c[0u] = x_69;
-  float x_72 = gl_FragCoord.y;
-  param_2 = x_72;
-  float x_73 = thirty_two_1;
-  param_3 = x_73;
-  float x_74 = compute_value_f1_f1_(param_2, param_3);
-  c[1u] = x_74;
-  float3 x_76 = c;
-  float3 x_79 = c;
-  float2 v_4 = float2(x_79[0u], x_79[1u]);
-  float4x2 x_87 = float4x2(v_4, float2(x_79[2u], 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
-  float v_5 = mul(float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)), x_76)[0u];
-  c[2u] = (v_5 + float3(x_87[0u][0u], x_87[0u][1u], x_87[1u][0u])[1u]);
-  i_1 = 0;
-  {
-    while(true) {
-      int x_99 = i_1;
-      if ((x_99 < 3)) {
-      } else {
-        break;
-      }
-      int x_102 = i_1;
-      float x_104 = c[x_102];
-      if ((x_104 >= 1.0f)) {
-        int x_108 = i_1;
-        int x_109 = i_1;
-        float x_111 = c[x_109];
-        int x_112 = i_1;
-        float x_114 = c[x_112];
-        c[x_108] = (x_111 * x_114);
-        float x_118 = gl_FragCoord.y;
-        if ((x_118 < 0.0f)) {
-          break;
-        }
-      }
-      {
-        int x_122 = i_1;
-        i_1 = (x_122 + 1);
-      }
-      continue;
-    }
-  }
-  float3 x_124 = c;
-  float3 x_126 = normalize(abs(x_124));
-  x_GLF_color = float4(x_126[0u], x_126[1u], x_126[2u], 1.0f);
-}
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  main_out v_6 = {x_GLF_color};
-  return v_6;
-}
-
-main_outputs main(main_inputs inputs) {
-  main_out v_7 = main_inner(float4(inputs.gl_FragCoord_param.xyz, (1.0f / inputs.gl_FragCoord_param[3u])));
-  main_outputs v_8 = {v_7.x_GLF_color_1};
-  return v_8;
-}
-
-FXC validation failure:
-<scrubbed_path>(21,19-25): warning X3556: integer divides may be much slower, try using uints if possible.
-<scrubbed_path>(99,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index eaa6d46..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,77 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_8 : register(b0) {
-  uint4 x_8[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int x = 0;
-  float4 matrix_u = (0.0f).xxxx;
-  int b = 0;
-  float4 matrix_b = (0.0f).xxxx;
-  float4 x_42 = (0.0f).xxxx;
-  x = 4;
-  {
-    while(true) {
-      if ((x >= 1)) {
-      } else {
-        break;
-      }
-      int x_11 = x;
-      matrix_u[x_11] = 1.0f;
-      {
-        x = (x - 1);
-      }
-      continue;
-    }
-  }
-  b = 4;
-  {
-    while(true) {
-      if ((asfloat(x_8[0u].x) < -1.0f)) {
-      } else {
-        break;
-      }
-      int x_14 = b;
-      if ((b > 1)) {
-        x_42 = min(matrix_b, matrix_b);
-      } else {
-        x_42 = matrix_u;
-      }
-      matrix_b[x_14] = x_42.y;
-      {
-        b = (b - 1);
-      }
-      continue;
-    }
-  }
-  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v = {x_GLF_color};
-  return v;
-}
-
-main_outputs main() {
-  main_out v_1 = main_inner();
-  main_outputs v_2 = {v_1.x_GLF_color_1};
-  return v_2;
-}
-
-FXC validation failure:
-<scrubbed_path>(28,7-20): error X3504: literal loop terminated early due to out of bounds array access
-<scrubbed_path>(22,5-15): warning X3557: loop only executes for 0 iteration(s), forcing loop to unroll
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 5aa7d2e..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,86 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_8 : register(b0) {
-  uint4 x_8[4];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int x = 0;
-  float4 matrix_u = (0.0f).xxxx;
-  int b = 0;
-  float4 matrix_b = (0.0f).xxxx;
-  float4 x_42 = (0.0f).xxxx;
-  x = 4;
-  {
-    while(true) {
-      int x_10 = x;
-      if ((x_10 >= 1)) {
-      } else {
-        break;
-      }
-      int x_11 = x;
-      matrix_u[x_11] = 1.0f;
-      {
-        int x_12 = x;
-        x = (x_12 - 1);
-      }
-      continue;
-    }
-  }
-  b = 4;
-  {
-    while(true) {
-      float x_55 = asfloat(x_8[0u].x);
-      if ((x_55 < -1.0f)) {
-      } else {
-        break;
-      }
-      int x_14 = b;
-      int x_15 = b;
-      if ((x_15 > 1)) {
-        float4 x_62 = matrix_b;
-        float4 x_63 = matrix_b;
-        x_42 = min(x_62, x_63);
-      } else {
-        float4 x_65 = matrix_u;
-        x_42 = x_65;
-      }
-      float x_67 = x_42.y;
-      matrix_b[x_14] = x_67;
-      {
-        int x_16 = b;
-        b = (x_16 - 1);
-      }
-      continue;
-    }
-  }
-  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v = {x_GLF_color};
-  return v;
-}
-
-main_outputs main() {
-  main_out v_1 = main_inner();
-  main_outputs v_2 = {v_1.x_GLF_color_1};
-  return v_2;
-}
-
-FXC validation failure:
-<scrubbed_path>(29,7-20): error X3504: literal loop terminated early due to out of bounds array access
-<scrubbed_path>(22,5-15): warning X3557: loop only executes for 0 iteration(s), forcing loop to unroll
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.ir.fxc.hlsl
deleted file mode 100644
index da28904..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,115 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_9 : register(b0) {
-  uint4 x_9[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int idx = int(0);
-  float4x3 m43 = float4x3((0.0f).xxx, (0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
-  int ll_1 = int(0);
-  int GLF_live6rows = int(0);
-  int z = int(0);
-  int ll_2 = int(0);
-  int ctr = int(0);
-  float4x3 tempm43 = float4x3((0.0f).xxx, (0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
-  int ll_3 = int(0);
-  int c = int(0);
-  int d = int(0);
-  float GLF_live6sums[9] = (float[9])0;
-  idx = int(0);
-  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), (0.0f).xxx);
-  ll_1 = int(0);
-  GLF_live6rows = int(2);
-  {
-    while(true) {
-      int v = ll_1;
-      if ((v >= asint(x_9[0u].x))) {
-        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-        break;
-      }
-      ll_1 = (ll_1 + int(1));
-      z = asint(x_9[0u].x);
-      ll_2 = int(0);
-      ctr = int(0);
-      {
-        while(true) {
-          if ((ctr < int(1))) {
-          } else {
-            break;
-          }
-          int v_1 = ll_2;
-          if ((v_1 >= asint(x_9[0u].x))) {
-            break;
-          }
-          ll_2 = (ll_2 + int(1));
-          tempm43 = m43;
-          ll_3 = int(0);
-          c = int(0);
-          {
-            while(true) {
-              if ((int(1) < z)) {
-              } else {
-                break;
-              }
-              d = int(0);
-              int x_29 = c;
-              int x_30 = c;
-              int x_31 = c;
-              int x_32 = d;
-              int x_33 = d;
-              int x_34 = d;
-              int v_2 = ((((x_29 >= int(0)) & (x_30 < int(4)))) ? (x_31) : (int(0)));
-              tempm43[v_2][((((x_32 >= int(0)) & (x_33 < int(3)))) ? (x_34) : (int(0)))] = 1.0f;
-              {
-                c = (c + int(1));
-              }
-              continue;
-            }
-          }
-          int x_117 = ((((idx >= int(0)) & (idx < int(9)))) ? (idx) : (int(0)));
-          float v_3 = GLF_live6sums[x_117];
-          int v_4 = ctr;
-          GLF_live6sums[x_117] = (v_3 + m43[v_4].y);
-          {
-            ctr = (ctr + int(1));
-          }
-          continue;
-        }
-      }
-      idx = (idx + int(1));
-      {
-      }
-      continue;
-    }
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_5 = {x_GLF_color};
-  return v_5;
-}
-
-main_outputs main() {
-  main_out v_6 = main_inner();
-  main_outputs v_7 = {v_6.x_GLF_color_1};
-  return v_7;
-}
-
-FXC validation failure:
-<scrubbed_path>(57,13-23): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(43,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(32,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.ir.fxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.ir.fxc.hlsl
deleted file mode 100644
index 034fa8d..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.ir.fxc.hlsl
+++ /dev/null
@@ -1,130 +0,0 @@
-SKIP: FAILED
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-
-struct main_outputs {
-  float4 main_out_x_GLF_color_1 : SV_Target0;
-};
-
-
-cbuffer cbuffer_x_9 : register(b0) {
-  uint4 x_9[1];
-};
-static float4 x_GLF_color = (0.0f).xxxx;
-void main_1() {
-  int idx = int(0);
-  float4x3 m43 = float4x3((0.0f).xxx, (0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
-  int ll_1 = int(0);
-  int GLF_live6rows = int(0);
-  int z = int(0);
-  int ll_2 = int(0);
-  int ctr = int(0);
-  float4x3 tempm43 = float4x3((0.0f).xxx, (0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
-  int ll_3 = int(0);
-  int c = int(0);
-  int d = int(0);
-  float GLF_live6sums[9] = (float[9])0;
-  idx = int(0);
-  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), (0.0f).xxx);
-  ll_1 = int(0);
-  GLF_live6rows = int(2);
-  {
-    while(true) {
-      int x_18 = ll_1;
-      int x_19 = asint(x_9[0u].x);
-      if ((x_18 >= x_19)) {
-        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-        break;
-      }
-      int x_20 = ll_1;
-      ll_1 = (x_20 + int(1));
-      int x_22 = asint(x_9[0u].x);
-      z = x_22;
-      ll_2 = int(0);
-      ctr = int(0);
-      {
-        while(true) {
-          int x_23 = ctr;
-          if ((x_23 < int(1))) {
-          } else {
-            break;
-          }
-          int x_24 = ll_2;
-          int x_25 = asint(x_9[0u].x);
-          if ((x_24 >= x_25)) {
-            break;
-          }
-          int x_26 = ll_2;
-          ll_2 = (x_26 + int(1));
-          float4x3 x_98 = m43;
-          tempm43 = x_98;
-          ll_3 = int(0);
-          c = int(0);
-          {
-            while(true) {
-              int x_28 = z;
-              if ((int(1) < x_28)) {
-              } else {
-                break;
-              }
-              d = int(0);
-              int x_29 = c;
-              int x_30 = c;
-              int x_31 = c;
-              int x_32 = d;
-              int x_33 = d;
-              int x_34 = d;
-              int v = ((((x_29 >= int(0)) & (x_30 < int(4)))) ? (x_31) : (int(0)));
-              tempm43[v][((((x_32 >= int(0)) & (x_33 < int(3)))) ? (x_34) : (int(0)))] = 1.0f;
-              {
-                int x_35 = c;
-                c = (x_35 + int(1));
-              }
-              continue;
-            }
-          }
-          int x_37 = idx;
-          int x_38 = idx;
-          int x_39 = idx;
-          int x_117 = ((((x_37 >= int(0)) & (x_38 < int(9)))) ? (x_39) : (int(0)));
-          int x_40 = ctr;
-          float x_119 = m43[x_40].y;
-          float x_121 = GLF_live6sums[x_117];
-          GLF_live6sums[x_117] = (x_121 + x_119);
-          {
-            int x_41 = ctr;
-            ctr = (x_41 + int(1));
-          }
-          continue;
-        }
-      }
-      int x_43 = idx;
-      idx = (x_43 + int(1));
-      {
-      }
-      continue;
-    }
-  }
-}
-
-main_out main_inner() {
-  main_1();
-  main_out v_1 = {x_GLF_color};
-  return v_1;
-}
-
-main_outputs main() {
-  main_out v_2 = main_inner();
-  main_outputs v_3 = {v_2.x_GLF_color_1};
-  return v_3;
-}
-
-FXC validation failure:
-<scrubbed_path>(64,13-23): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(46,9-19): error X3511: forced to unroll loop, but unrolling failed.
-<scrubbed_path>(32,5-15): error X3511: forced to unroll loop, but unrolling failed.
-
-
-tint executable returned error: exit status 1
