diff --git a/src/BUILD.gn b/src/BUILD.gn
index f88173b..1003f27 100644
--- a/src/BUILD.gn
+++ b/src/BUILD.gn
@@ -451,6 +451,8 @@
     "transform/fold_trivial_single_use_lets.h",
     "transform/for_loop_to_loop.cc",
     "transform/for_loop_to_loop.h",
+    "transform/localize_struct_array_assignment.cc",
+    "transform/localize_struct_array_assignment.h",
     "transform/loop_to_for_loop.cc",
     "transform/loop_to_for_loop.h",
     "transform/manager.cc",
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3994fed..10aeea6 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -312,6 +312,8 @@
   transform/fold_constants.h
   transform/fold_trivial_single_use_lets.cc
   transform/fold_trivial_single_use_lets.h
+  transform/localize_struct_array_assignment.cc
+  transform/localize_struct_array_assignment.h
   transform/for_loop_to_loop.cc
   transform/for_loop_to_loop.h
   transform/glsl.cc
@@ -971,6 +973,7 @@
       transform/fold_constants_test.cc
       transform/fold_trivial_single_use_lets_test.cc
       transform/for_loop_to_loop_test.cc
+      transform/localize_struct_array_assignment_test.cc
       transform/loop_to_for_loop_test.cc
       transform/module_scope_var_to_entry_point_param_test.cc
       transform/multiplanar_external_texture_test.cc
diff --git a/src/program_builder.h b/src/program_builder.h
index e440474..53929af 100644
--- a/src/program_builder.h
+++ b/src/program_builder.h
@@ -2468,6 +2468,15 @@
     }
   }
 
+  /// Unmarks that the given transform `T` has been applied to this program.
+  template <typename T>
+  void UnsetTransformApplied() {
+    auto it = transforms_applied_.find(&TypeInfo::Of<T>());
+    if (it != transforms_applied_.end()) {
+      transforms_applied_.erase(it);
+    }
+  }
+
   /// @returns true if the transform of type `T` was applied.
   template <typename T>
   bool HasTransformApplied() {
diff --git a/src/transform/localize_struct_array_assignment.cc b/src/transform/localize_struct_array_assignment.cc
new file mode 100644
index 0000000..6d73ec9
--- /dev/null
+++ b/src/transform/localize_struct_array_assignment.cc
@@ -0,0 +1,230 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "src/transform/localize_struct_array_assignment.h"
+
+#include <unordered_map>
+#include <utility>
+
+#include "src/ast/assignment_statement.h"
+#include "src/ast/traverse_expressions.h"
+#include "src/program_builder.h"
+#include "src/sem/expression.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/reference_type.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
+#include "src/transform/simplify_pointers.h"
+#include "src/utils/scoped_assignment.h"
+
+TINT_INSTANTIATE_TYPEINFO(tint::transform::LocalizeStructArrayAssignment);
+
+namespace tint {
+namespace transform {
+
+/// Private implementation of LocalizeStructArrayAssignment transform
+class LocalizeStructArrayAssignment::State {
+ private:
+  CloneContext& ctx;
+  ProgramBuilder& b;
+
+  /// Returns true if `expr` contains an index accessor expression to a
+  /// structure member of array type.
+  bool ContainsStructArrayIndex(const ast::Expression* expr) {
+    bool result = false;
+    ast::TraverseExpressions(
+        expr, b.Diagnostics(), [&](const ast::IndexAccessorExpression* ia) {
+          // Indexing using a runtime value?
+          auto* idx_sem = ctx.src->Sem().Get(ia->index);
+          if (!idx_sem->ConstantValue().IsValid()) {
+            // Indexing a member access expr?
+            if (auto* ma = ia->object->As<ast::MemberAccessorExpression>()) {
+              // That accesses an array?
+              if (ctx.src->TypeOf(ma)->UnwrapRef()->Is<sem::Array>()) {
+                result = true;
+                return ast::TraverseAction::Stop;
+              }
+            }
+          }
+          return ast::TraverseAction::Descend;
+        });
+
+    return result;
+  }
+
+  // Returns the type and storage class of the originating variable of the lhs
+  // of the assignment statement.
+  // See https://www.w3.org/TR/WGSL/#originating-variable-section
+  std::pair<const sem::Type*, ast::StorageClass>
+  GetOriginatingTypeAndStorageClass(
+      const ast::AssignmentStatement* assign_stmt) {
+    // Get first IdentifierExpr from lhs of assignment, which should resolve to
+    // the pointer or reference of the originating variable of the assignment.
+    // TraverseExpressions traverses left to right, and this code depends on the
+    // fact that for an assignment statement, the variable will be the left-most
+    // expression.
+    // TODO(crbug.com/tint/1341): do this in the Resolver, setting the
+    // originating variable on sem::Expression.
+    const ast::IdentifierExpression* ident = nullptr;
+    ast::TraverseExpressions(assign_stmt->lhs, b.Diagnostics(),
+                             [&](const ast::IdentifierExpression* id) {
+                               ident = id;
+                               return ast::TraverseAction::Stop;
+                             });
+    auto* sem_var_user = ctx.src->Sem().Get<sem::VariableUser>(ident);
+    if (!sem_var_user) {
+      TINT_ICE(Transform, b.Diagnostics())
+          << "Expected to find variable of lhs of assignment statement";
+      return {};
+    }
+
+    auto* var = sem_var_user->Variable();
+    if (auto* ptr = var->Type()->As<sem::Pointer>()) {
+      return {ptr->StoreType(), ptr->StorageClass()};
+    }
+
+    auto* ref = var->Type()->As<sem::Reference>();
+    if (!ref) {
+      TINT_ICE(Transform, b.Diagnostics())
+          << "Expecting to find variable of type pointer or reference on lhs "
+             "of assignment statement";
+      return {};
+    }
+
+    return {ref->StoreType(), ref->StorageClass()};
+  }
+
+ public:
+  /// Constructor
+  /// @param ctx_in the CloneContext primed with the input program and
+  /// ProgramBuilder
+  explicit State(CloneContext& ctx_in) : ctx(ctx_in), b(*ctx_in.dst) {}
+
+  /// Runs the transform
+  void Run() {
+    struct Shared {
+      bool process_nested_nodes = false;
+      ast::StatementList insert_before_stmts;
+      ast::StatementList insert_after_stmts;
+    } s;
+
+    ctx.ReplaceAll([&](const ast::AssignmentStatement* assign_stmt)
+                       -> const ast::Statement* {
+      // Process if it's an assignment statement to a dynamically indexed array
+      // within a struct on a function or private storage variable. This
+      // specific use-case is what FXC fails to compile with:
+      // error X3500: array reference cannot be used as an l-value; not natively
+      // addressable
+      if (!ContainsStructArrayIndex(assign_stmt->lhs)) {
+        return nullptr;
+      }
+      auto og = GetOriginatingTypeAndStorageClass(assign_stmt);
+      if (!(og.first->Is<sem::Struct>() &&
+            (og.second == ast::StorageClass::kFunction ||
+             og.second == ast::StorageClass::kPrivate))) {
+        return nullptr;
+      }
+
+      // Reset shared state for this assignment statement
+      s = Shared{};
+
+      const ast::Expression* new_lhs = nullptr;
+      {
+        TINT_SCOPED_ASSIGNMENT(s.process_nested_nodes, true);
+        new_lhs = ctx.Clone(assign_stmt->lhs);
+      }
+
+      auto* new_assign_stmt = b.Assign(new_lhs, ctx.Clone(assign_stmt->rhs));
+
+      // Combine insert_before_stmts + new_assign_stmt + insert_after_stmts into
+      // a block and return it
+      ast::StatementList stmts = std::move(s.insert_before_stmts);
+      stmts.reserve(1 + s.insert_after_stmts.size());
+      stmts.emplace_back(new_assign_stmt);
+      stmts.insert(stmts.end(), s.insert_after_stmts.begin(),
+                   s.insert_after_stmts.end());
+
+      return b.Block(std::move(stmts));
+    });
+
+    ctx.ReplaceAll([&](const ast::IndexAccessorExpression* index_access)
+                       -> const ast::Expression* {
+      if (!s.process_nested_nodes) {
+        return nullptr;
+      }
+
+      // Indexing a member access expr?
+      auto* mem_access =
+          index_access->object->As<ast::MemberAccessorExpression>();
+      if (!mem_access) {
+        return nullptr;
+      }
+
+      // Process any nested IndexAccessorExpressions
+      mem_access = ctx.Clone(mem_access);
+
+      // Store the address of the member access into a let as we need to read
+      // the value twice e.g. let tint_symbol = &(s.a1);
+      auto mem_access_ptr = b.Sym();
+      s.insert_before_stmts.push_back(
+          b.Decl(b.Const(mem_access_ptr, nullptr, b.AddressOf(mem_access))));
+
+      // Disable further transforms when cloning
+      TINT_SCOPED_ASSIGNMENT(s.process_nested_nodes, false);
+
+      // Copy entire array out of struct into local temp var
+      // e.g. var tint_symbol_1 = *(tint_symbol);
+      auto tmp_var = b.Sym();
+      s.insert_before_stmts.push_back(
+          b.Decl(b.Var(tmp_var, nullptr, b.Deref(mem_access_ptr))));
+
+      // Replace input index_access with a clone of itself, but with its
+      // .object replaced by the new temp var. This is returned from this
+      // function to modify the original assignment statement. e.g.
+      // tint_symbol_1[uniforms.i]
+      auto* new_index_access =
+          b.IndexAccessor(tmp_var, ctx.Clone(index_access->index));
+
+      // Assign temp var back to array
+      // e.g. *(tint_symbol) = tint_symbol_1;
+      auto* assign_rhs_to_temp = b.Assign(b.Deref(mem_access_ptr), tmp_var);
+      s.insert_after_stmts.insert(s.insert_after_stmts.begin(),
+                                  assign_rhs_to_temp);  // push_front
+
+      return new_index_access;
+    });
+
+    ctx.Clone();
+  }
+};
+
+LocalizeStructArrayAssignment::LocalizeStructArrayAssignment() = default;
+
+LocalizeStructArrayAssignment::~LocalizeStructArrayAssignment() = default;
+
+void LocalizeStructArrayAssignment::Run(CloneContext& ctx,
+                                        const DataMap&,
+                                        DataMap&) {
+  if (!Requires<SimplifyPointers>(ctx)) {
+    return;
+  }
+
+  State state(ctx);
+  state.Run();
+
+  // This transform may introduce pointers
+  ctx.dst->UnsetTransformApplied<transform::SimplifyPointers>();
+}
+}  // namespace transform
+}  // namespace tint
diff --git a/src/transform/localize_struct_array_assignment.h b/src/transform/localize_struct_array_assignment.h
new file mode 100644
index 0000000..ce56e14
--- /dev/null
+++ b/src/transform/localize_struct_array_assignment.h
@@ -0,0 +1,53 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef SRC_TRANSFORM_LOCALIZE_STRUCT_ARRAY_ASSIGNMENT_H_
+#define SRC_TRANSFORM_LOCALIZE_STRUCT_ARRAY_ASSIGNMENT_H_
+
+#include "src/transform/transform.h"
+
+namespace tint {
+namespace transform {
+
+/// This transforms replaces assignment to dynamically-indexed fixed-size arrays
+/// in structs on shader-local variables with code that copies the arrays to a
+/// temporary local variable, assigns to the local variable, and copies the
+/// array back. This is to work around FXC's compilation failure for these cases
+/// (see crbug.com/tint/1206).
+class LocalizeStructArrayAssignment
+    : public Castable<LocalizeStructArrayAssignment, Transform> {
+ public:
+  /// Constructor
+  LocalizeStructArrayAssignment();
+
+  /// Destructor
+  ~LocalizeStructArrayAssignment() override;
+
+ protected:
+  /// Runs the transform using the CloneContext built for transforming a
+  /// program. Run() is responsible for calling Clone() on the CloneContext.
+  /// @param ctx the CloneContext primed with the input program and
+  /// ProgramBuilder
+  /// @param inputs optional extra transform-specific input data
+  /// @param outputs optional extra transform-specific output data
+  void Run(CloneContext& ctx, const DataMap& inputs, DataMap& outputs) override;
+
+ private:
+  class State;
+};
+
+}  // namespace transform
+}  // namespace tint
+
+#endif  // SRC_TRANSFORM_LOCALIZE_STRUCT_ARRAY_ASSIGNMENT_H_
diff --git a/src/transform/localize_struct_array_assignment_test.cc b/src/transform/localize_struct_array_assignment_test.cc
new file mode 100644
index 0000000..197aa02
--- /dev/null
+++ b/src/transform/localize_struct_array_assignment_test.cc
@@ -0,0 +1,620 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "src/transform/localize_struct_array_assignment.h"
+#include "src/transform/simplify_pointers.h"
+#include "src/transform/unshadow.h"
+
+#include "src/transform/test_helper.h"
+
+namespace tint {
+namespace transform {
+namespace {
+
+using LocalizeStructArrayAssignmentTest = TransformTest;
+
+TEST_F(LocalizeStructArrayAssignmentTest, MissingSimplifyPointers) {
+  auto* src = R"()";
+  auto* expect =
+      "error: tint::transform::LocalizeStructArrayAssignment depends on "
+      "tint::transform::SimplifyPointers but the dependency was not run";
+
+  auto got = Run<LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, EmptyModule) {
+  auto* src = R"()";
+  auto* expect = src;
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, StructArray) {
+  auto* src = R"(
+[[block]] struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.a1[uniforms.i] = v;
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  {
+    let tint_symbol = &(s1.a1);
+    var tint_symbol_1 = *(tint_symbol);
+    tint_symbol_1[uniforms.i] = v;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, StructStructArray) {
+  auto* src = R"(
+[[block]] struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a : array<InnerS, 8>;
+};
+
+struct OuterS {
+  s2 : S1;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.s2.a[uniforms.i] = v;
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a : array<InnerS, 8>;
+};
+
+struct OuterS {
+  s2 : S1;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  {
+    let tint_symbol = &(s1.s2.a);
+    var tint_symbol_1 = *(tint_symbol);
+    tint_symbol_1[uniforms.i] = v;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, StructArrayArray) {
+  auto* src = R"(
+[[block]] struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<array<InnerS, 8>, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.a1[uniforms.i][uniforms.j] = v;
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<array<InnerS, 8>, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  {
+    let tint_symbol = &(s1.a1);
+    var tint_symbol_1 = *(tint_symbol);
+    tint_symbol_1[uniforms.i][uniforms.j] = v;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, StructArrayStruct) {
+  auto* src = R"(
+[[block]] struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  s2 : InnerS;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.a1[uniforms.i].s2 = v;
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  s2 : InnerS;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  {
+    let tint_symbol = &(s1.a1);
+    var tint_symbol_1 = *(tint_symbol);
+    tint_symbol_1[uniforms.i].s2 = v;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, StructArrayStructArray) {
+  auto* src = R"(
+[[block]] struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a2 : array<InnerS, 8>;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s : OuterS;
+  s.a1[uniforms.i].a2[uniforms.j] = v;
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a2 : array<InnerS, 8>;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s : OuterS;
+  {
+    let tint_symbol = &(s.a1);
+    var tint_symbol_1 = *(tint_symbol);
+    let tint_symbol_2 = &(tint_symbol_1[uniforms.i].a2);
+    var tint_symbol_3 = *(tint_symbol_2);
+    tint_symbol_3[uniforms.j] = v;
+    *(tint_symbol_2) = tint_symbol_3;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, IndexingWithSideEffectFunc) {
+  auto* src = R"(
+[[block]] struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a2 : array<InnerS, 8>;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+var<private> nextIndex : u32;
+fn getNextIndex() -> u32 {
+  nextIndex = nextIndex + 1u;
+  return nextIndex;
+}
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s : OuterS;
+  s.a1[getNextIndex()].a2[uniforms.j] = v;
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a2 : array<InnerS, 8>;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+var<private> nextIndex : u32;
+
+fn getNextIndex() -> u32 {
+  nextIndex = (nextIndex + 1u);
+  return nextIndex;
+}
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s : OuterS;
+  {
+    let tint_symbol = &(s.a1);
+    var tint_symbol_1 = *(tint_symbol);
+    let tint_symbol_2 = &(tint_symbol_1[getNextIndex()].a2);
+    var tint_symbol_3 = *(tint_symbol_2);
+    tint_symbol_3[uniforms.j] = v;
+    *(tint_symbol_2) = tint_symbol_3;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, ViaPointerArg) {
+  auto* src = R"(
+[[block]] struct Uniforms {
+  i : u32;
+};
+struct InnerS {
+  v : i32;
+};
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+fn f(p : ptr<function, OuterS>) {
+  var v : InnerS;
+  (*p).a1[uniforms.i] = v;
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var s1 : OuterS;
+  f(&s1);
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+fn f(p : ptr<function, OuterS>) {
+  var v : InnerS;
+  {
+    let tint_symbol = &((*(p)).a1);
+    var tint_symbol_1 = *(tint_symbol);
+    tint_symbol_1[uniforms.i] = v;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var s1 : OuterS;
+  f(&(s1));
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, ViaPointerVar) {
+  auto* src = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+fn f(p : ptr<function, InnerS>, v : InnerS) {
+  *(p) = v;
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  let p = &(s1.a1[uniforms.i]);
+  *(p) = v;
+}
+)";
+
+  auto* expect = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+fn f(p : ptr<function, InnerS>, v : InnerS) {
+  *(p) = v;
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  let p_save = uniforms.i;
+  {
+    let tint_symbol = &(s1.a1);
+    var tint_symbol_1 = *(tint_symbol);
+    tint_symbol_1[p_save] = v;
+    *(tint_symbol) = tint_symbol_1;
+  }
+}
+)";
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(LocalizeStructArrayAssignmentTest, VectorAssignment) {
+  auto* src = R"(
+[[block]]
+struct Uniforms {
+  i : u32;
+};
+
+[[block]]
+struct OuterS {
+  a1 : array<u32, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+fn f(i : u32) -> u32 {
+  return (i + 1u);
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var s1 : OuterS;
+  var v : vec3<f32>;
+  v[s1.a1[uniforms.i]] = 1.0;
+  v[f(s1.a1[uniforms.i])] = 1.0;
+}
+)";
+
+  // Transform does nothing here as we're not actually assigning to the array in
+  // the struct.
+  auto* expect = src;
+
+  auto got =
+      Run<Unshadow, SimplifyPointers, LocalizeStructArrayAssignment>(src);
+  EXPECT_EQ(expect, str(got));
+}
+
+}  // namespace
+}  // namespace transform
+}  // namespace tint
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index c66278f..82c36cb 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -51,6 +51,7 @@
 #include "src/transform/decompose_memory_access.h"
 #include "src/transform/external_texture_transform.h"
 #include "src/transform/fold_trivial_single_use_lets.h"
+#include "src/transform/localize_struct_array_assignment.h"
 #include "src/transform/loop_to_for_loop.h"
 #include "src/transform/manager.h"
 #include "src/transform/num_workgroups_from_uniform.h"
@@ -145,6 +146,15 @@
 
   manager.Add<transform::Unshadow>();
 
+  // LocalizeStructArrayAssignment must come after:
+  // * SimplifyPointers, because it assumes assignment to arrays in structs are
+  // done directly, not indirectly.
+  // TODO(crbug.com/tint/1340): See if we can get rid of the duplicate
+  // SimplifyPointers transform. Can't do it right now because
+  // LocalizeStructArrayAssignment introduces pointers.
+  manager.Add<transform::SimplifyPointers>();
+  manager.Add<transform::LocalizeStructArrayAssignment>();
+
   // Attempt to convert `loop`s into for-loops. This is to try and massage the
   // output into something that will not cause FXC to choke or misbehave.
   manager.Add<transform::FoldTrivialSingleUseLets>();
diff --git a/test/BUILD.gn b/test/BUILD.gn
index cf1c258..4403a24 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -314,6 +314,7 @@
     "../src/transform/fold_constants_test.cc",
     "../src/transform/fold_trivial_single_use_lets_test.cc",
     "../src/transform/for_loop_to_loop_test.cc",
+    "../src/transform/localize_struct_array_assignment_test.cc",
     "../src/transform/loop_to_for_loop_test.cc",
     "../src/transform/module_scope_var_to_entry_point_param_test.cc",
     "../src/transform/multiplanar_external_texture_test.cc",
diff --git a/test/bug/fxc/dyn_array_idx/write/function.wgsl.expected.hlsl b/test/bug/fxc/dyn_array_idx/write/function.wgsl.expected.hlsl
deleted file mode 100644
index 04d50a1..0000000
--- a/test/bug/fxc/dyn_array_idx/write/function.wgsl.expected.hlsl
+++ /dev/null
@@ -1,21 +0,0 @@
-SKIP: FAILED
-
-cbuffer cbuffer_ubo : register(b0, space0) {
-  uint4 ubo[1];
-};
-
-struct S {
-  int data[64];
-};
-
-RWByteAddressBuffer result : register(u1, space0);
-
-[numthreads(1, 1, 1)]
-void f() {
-  S s = (S)0;
-  s.data[asint(ubo[0].x)] = 1;
-  result.Store(0u, asuint(s.data[3]));
-  return;
-}
-C:\src\tint\test\Shader@0x000002C587F87250(14,3-25): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.hlsl b/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.hlsl
deleted file mode 100644
index 59669b3..0000000
--- a/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-SKIP: FAILED
-
-cbuffer cbuffer_ubo : register(b0, space0) {
-  uint4 ubo[1];
-};
-
-struct S {
-  int data[64];
-};
-
-RWByteAddressBuffer result : register(u1, space0);
-
-void x(inout S p) {
-  p.data[asint(ubo[0].x)] = 1;
-}
-
-[numthreads(1, 1, 1)]
-void f() {
-  S s = (S)0;
-  x(s);
-  result.Store(0u, asuint(s.data[3]));
-  return;
-}
-C:\src\tint\test\Shader@0x000002338E919910(12,3-25): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/bug/fxc/dyn_array_idx/write/private.wgsl.expected.hlsl b/test/bug/fxc/dyn_array_idx/write/private.wgsl.expected.hlsl
deleted file mode 100644
index 1ef5a38..0000000
--- a/test/bug/fxc/dyn_array_idx/write/private.wgsl.expected.hlsl
+++ /dev/null
@@ -1,21 +0,0 @@
-SKIP: FAILED
-
-cbuffer cbuffer_ubo : register(b0, space0) {
-  uint4 ubo[1];
-};
-
-struct S {
-  int data[64];
-};
-
-RWByteAddressBuffer result : register(u1, space0);
-static S s = (S)0;
-
-[numthreads(1, 1, 1)]
-void f() {
-  s.data[asint(ubo[0].x)] = 1;
-  result.Store(0u, asuint(s.data[3]));
-  return;
-}
-C:\src\tint\test\Shader@0x000001D94063C630(14,3-25): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.hlsl b/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.hlsl
deleted file mode 100644
index ed009a4..0000000
--- a/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-SKIP: FAILED
-
-cbuffer cbuffer_ubo : register(b0, space0) {
-  uint4 ubo[1];
-};
-
-struct S {
-  int data[64];
-};
-
-RWByteAddressBuffer result : register(u1, space0);
-static S s = (S)0;
-
-void x(inout S p) {
-  p.data[asint(ubo[0].x)] = 1;
-}
-
-[numthreads(1, 1, 1)]
-void f() {
-  x(s);
-  result.Store(0u, asuint(s.data[3]));
-  return;
-}
-C:\src\tint\test\Shader@0x0000018B80081AA0(13,3-25): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl
new file mode 100644
index 0000000..df48e4c
--- /dev/null
+++ b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl
@@ -0,0 +1,23 @@
+struct Simulation {
+  i : u32;
+};
+
+struct Particle {
+  position : array<vec3<f32>, 8>;
+  lifetime : f32;
+  color    : vec4<f32>;
+  velocity : vec3<f32>;
+};
+
+struct Particles {
+  p : array<Particle>;
+};
+
+[[group(1), binding(3)]] var<storage, read> particles : Particles;
+[[group(1), binding(4)]] var<uniform> sim : Simulation;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var particle = particles.p[0];
+  particle.position[sim.i] = particle.position[sim.i];
+}
diff --git a/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.hlsl b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.hlsl
new file mode 100644
index 0000000..e130294
--- /dev/null
+++ b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+struct Particle {
+  float3 position[8];
+  float lifetime;
+  float4 color;
+  float3 velocity;
+};
+
+ByteAddressBuffer particles : register(t3, space1);
+cbuffer cbuffer_sim : register(b4, space1) {
+  uint4 sim[1];
+};
+
+typedef float3 tint_symbol_3_ret[8];
+tint_symbol_3_ret tint_symbol_3(ByteAddressBuffer buffer, uint offset) {
+  float3 arr[8] = (float3[8])0;
+  {
+    [loop] for(uint i_1 = 0u; (i_1 < 8u); i_1 = (i_1 + 1u)) {
+      arr[i_1] = asfloat(buffer.Load3((offset + (i_1 * 16u))));
+    }
+  }
+  return arr;
+}
+
+Particle tint_symbol_2(ByteAddressBuffer buffer, uint offset) {
+  const Particle tint_symbol_8 = {tint_symbol_3(buffer, (offset + 0u)), asfloat(buffer.Load((offset + 128u))), asfloat(buffer.Load4((offset + 144u))), asfloat(buffer.Load3((offset + 160u)))};
+  return tint_symbol_8;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  Particle particle = tint_symbol_2(particles, (176u * uint(0)));
+  {
+    float3 tint_symbol_1[8] = particle.position;
+    tint_symbol_1[sim[0].x] = particle.position[sim[0].x];
+    particle.position = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/bug/tint/749.spvasm.expected.hlsl b/test/bug/tint/749.spvasm.expected.hlsl
deleted file mode 100644
index 48ad9ae..0000000
--- a/test/bug/tint/749.spvasm.expected.hlsl
+++ /dev/null
@@ -1,1566 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_188 : register(b0, space0) {
-  uint4 x_188[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_932 = temp;
-  temp = 0;
-  temp = x_932;
-  const float3 x_523 = float3(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).z);
-  const int x_933 = i;
-  i = 0;
-  i = x_933;
-  const int x_28 = i;
-  const int x_934 = j;
-  j = 0;
-  j = x_934;
-  const float3 x_524 = float3(x_523.y, x_523.x, x_523.y);
-  const int x_935 = temp;
-  temp = 0;
-  temp = x_935;
-  const int x_30_save = x_28;
-  const int x_936 = obj.numbers[x_30_save];
-  obj.numbers[x_30_save] = 0;
-  obj.numbers[x_30_save] = x_936;
-  const int x_31 = obj.numbers[x_30_save];
-  const int x_937 = temp;
-  temp = 0;
-  temp = x_937;
-  temp = x_31;
-  const int x_938 = j;
-  j = 0;
-  j = x_938;
-  const float3 x_525 = float3(x_523.z, float3(1.0f, 2.0f, 3.0f).x, x_523.y);
-  const int x_939 = i;
-  i = 0;
-  i = x_939;
-  const int x_32 = i;
-  const int x_940 = obj.numbers[x_30_save];
-  obj.numbers[x_30_save] = 0;
-  obj.numbers[x_30_save] = x_940;
-  const int x_33 = j;
-  const int x_941 = i;
-  i = 0;
-  i = x_941;
-  const float3 x_526 = float3(x_525.x, x_525.z, x_525.z);
-  const int x_942 = obj.numbers[x_30_save];
-  obj.numbers[x_30_save] = 0;
-  obj.numbers[x_30_save] = x_942;
-  const int x_34_save = x_33;
-  const int x_35 = obj.numbers[x_34_save];
-  const QuicksortObject x_943 = obj;
-  const int tint_symbol_4[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_5 = {tint_symbol_4};
-  obj = tint_symbol_5;
-  obj = x_943;
-  const float2 x_527 = float2(x_526.x, x_526.x);
-  const int x_36_save = x_32;
-  const float3 x_528 = float3(x_524.x, x_524.z, x_524.x);
-  obj.numbers[x_36_save] = x_35;
-  const QuicksortObject x_944 = obj;
-  const int tint_symbol_6[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_7 = {tint_symbol_6};
-  obj = tint_symbol_7;
-  obj = x_944;
-  const float3 x_529 = float3(x_526.y, x_526.z, x_526.x);
-  const int x_945 = i;
-  i = 0;
-  i = x_945;
-  const int x_37 = j;
-  const int x_946 = temp;
-  temp = 0;
-  temp = x_946;
-  const float2 x_530 = float2(x_529.z, x_529.y);
-  const int x_947 = obj.numbers[x_34_save];
-  obj.numbers[x_34_save] = 0;
-  obj.numbers[x_34_save] = x_947;
-  const int x_38 = temp;
-  const int x_948 = j;
-  j = 0;
-  j = x_948;
-  const float3 x_531 = float3(x_527.x, x_526.y, x_526.x);
-  const int x_949 = obj.numbers[x_36_save];
-  obj.numbers[x_36_save] = 0;
-  obj.numbers[x_36_save] = x_949;
-  const QuicksortObject x_950 = obj;
-  const int tint_symbol_8[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_9 = {tint_symbol_8};
-  obj = tint_symbol_9;
-  obj = x_950;
-  const float3 x_532 = float3(x_528.x, x_528.y, x_528.x);
-  const int x_951 = obj.numbers[x_34_save];
-  obj.numbers[x_34_save] = 0;
-  obj.numbers[x_34_save] = x_951;
-  obj.numbers[x_37] = x_38;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int param_3 = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param_2 = 0;
-  int param_1 = 0;
-  int param = 0;
-  int pivot = 0;
-  float2 x_537 = float2(0.0f, 0.0f);
-  float3 x_538 = float3(0.0f, 0.0f, 0.0f);
-  const int x_952 = h;
-  h = 0;
-  h = x_952;
-  const int x_41 = h;
-  const int x_953 = l;
-  l = 0;
-  l = x_953;
-  const int x_42_save = x_41;
-  const int x_954 = obj.numbers[x_42_save];
-  obj.numbers[x_42_save] = 0;
-  obj.numbers[x_42_save] = x_954;
-  const int x_43 = obj.numbers[x_42_save];
-  const int x_955 = param_3;
-  param_3 = 0;
-  param_3 = x_955;
-  const float3 x_534 = float3(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).z);
-  const int x_956 = param_1;
-  param_1 = 0;
-  param_1 = x_956;
-  pivot = x_43;
-  const int x_45 = l;
-  const int x_957 = h;
-  h = 0;
-  h = x_957;
-  const int x_958 = j_1;
-  j_1 = 0;
-  j_1 = x_958;
-  const float3 x_535 = float3(x_534.y, x_534.z, x_534.y);
-  const int x_959 = l;
-  l = 0;
-  l = x_959;
-  i_1 = (x_45 - asint(1u));
-  const int x_49 = l;
-  const float3 x_536 = float3(x_534.x, x_534.z, x_535.x);
-  j_1 = 10;
-  const QuicksortObject x_960 = obj;
-  const int tint_symbol_10[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_11 = {tint_symbol_10};
-  obj = tint_symbol_11;
-  obj = x_960;
-  [loop] while (true) {
-    const int x_961 = pivot;
-    pivot = 0;
-    pivot = x_961;
-    const int x_962 = param_1;
-    param_1 = 0;
-    param_1 = x_962;
-    const int x_55 = j_1;
-    const int x_963 = pivot;
-    pivot = 0;
-    pivot = x_963;
-    x_537 = float2(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).z);
-    const QuicksortObject x_964 = obj;
-    const int tint_symbol_12[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_13 = {tint_symbol_12};
-    obj = tint_symbol_13;
-    obj = x_964;
-    const int x_56 = h;
-    const int x_965 = h;
-    h = 0;
-    h = x_965;
-    const int x_966 = param;
-    param = 0;
-    param = x_966;
-    const int x_967 = j_1;
-    j_1 = 0;
-    j_1 = x_967;
-    x_538 = float3(x_534.x, x_537.y, x_534.z);
-    const int x_968 = param;
-    param = 0;
-    param = x_968;
-    if ((x_55 <= (x_56 - asint(1u)))) {
-    } else {
-      break;
-    }
-    const int x_60 = j_1;
-    const int x_969 = obj.numbers[x_42_save];
-    obj.numbers[x_42_save] = 0;
-    obj.numbers[x_42_save] = x_969;
-    const int x_61_save = x_60;
-    const int x_970 = h;
-    h = 0;
-    h = x_970;
-    const float3 x_539 = float3(x_537.x, x_535.z, x_537.x);
-    const int x_971 = param_1;
-    param_1 = 0;
-    param_1 = x_971;
-    const int x_62 = obj.numbers[x_61_save];
-    const QuicksortObject x_972 = obj;
-    const int tint_symbol_14[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_15 = {tint_symbol_14};
-    obj = tint_symbol_15;
-    obj = x_972;
-    const int x_63 = pivot;
-    const float2 x_540 = float2(float3(1.0f, 2.0f, 3.0f).y, x_534.z);
-    const int x_973 = i_1;
-    i_1 = 0;
-    i_1 = x_973;
-    const int x_974 = l;
-    l = 0;
-    l = x_974;
-    const float3 x_541 = float3(x_534.y, x_534.x, x_534.y);
-    const int x_975 = pivot;
-    pivot = 0;
-    pivot = x_975;
-    if ((x_62 <= x_63)) {
-      const float3 x_542 = float3(x_541.z, x_541.x, x_541.x);
-      const int x_976 = param_3;
-      param_3 = 0;
-      param_3 = x_976;
-      const int x_67 = i_1;
-      const int x_977 = pivot;
-      pivot = 0;
-      pivot = x_977;
-      const float2 x_543 = float2(x_539.x, x_541.y);
-      const int x_978 = i_1;
-      i_1 = 0;
-      i_1 = x_978;
-      const int x_979 = param;
-      param = 0;
-      param = x_979;
-      i_1 = (x_67 + asint(1u));
-      const int x_980 = l;
-      l = 0;
-      l = x_980;
-      const float3 x_544 = float3(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).y, x_540.x);
-      const int x_70 = i_1;
-      const float2 x_545 = float2(x_537.y, x_538.x);
-      const int x_981 = param;
-      param = 0;
-      param = x_981;
-      param = x_70;
-      const int x_982 = param;
-      param = 0;
-      param = x_982;
-      const float2 x_546 = float2(x_545.x, x_545.x);
-      const int x_983 = i_1;
-      i_1 = 0;
-      i_1 = x_983;
-      param_1 = j_1;
-      const int x_984 = param_3;
-      param_3 = 0;
-      param_3 = x_984;
-      swap_i1_i1_(param, param_1);
-      const int x_985 = param_1;
-      param_1 = 0;
-      param_1 = x_985;
-    }
-    const QuicksortObject x_986 = obj;
-    const int tint_symbol_16[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_17 = {tint_symbol_16};
-    obj = tint_symbol_17;
-    obj = x_986;
-    {
-      const int x_987 = h;
-      h = 0;
-      h = x_987;
-      const int x_74 = j_1;
-      const int x_988 = h;
-      h = 0;
-      h = x_988;
-      const float3 x_547 = float3(x_539.x, x_541.z, x_541.z);
-      const int x_989 = obj.numbers[x_61_save];
-      obj.numbers[x_61_save] = 0;
-      obj.numbers[x_61_save] = x_989;
-      const int x_990 = param;
-      param = 0;
-      param = x_990;
-      j_1 = (1 + x_74);
-      const int x_991 = param_1;
-      param_1 = 0;
-      param_1 = x_991;
-      const float3 x_548 = float3(x_541.y, x_541.z, x_541.x);
-      const int x_992 = obj.numbers[x_61_save];
-      obj.numbers[x_61_save] = 0;
-      obj.numbers[x_61_save] = x_992;
-    }
-  }
-  const int x_76 = i_1;
-  const int x_993 = obj.numbers[x_42_save];
-  obj.numbers[x_42_save] = 0;
-  obj.numbers[x_42_save] = x_993;
-  const float2 x_549 = float2(x_534.x, x_534.y);
-  const QuicksortObject x_994 = obj;
-  const int tint_symbol_18[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_19 = {tint_symbol_18};
-  obj = tint_symbol_19;
-  obj = x_994;
-  const int x_995 = h;
-  h = 0;
-  h = x_995;
-  i_1 = (1 + x_76);
-  const int x_996 = param_1;
-  param_1 = 0;
-  param_1 = x_996;
-  const int x_79 = i_1;
-  const int x_997 = j_1;
-  j_1 = 0;
-  j_1 = x_997;
-  const float2 x_550 = float2(x_534.x, x_534.x);
-  const int x_998 = param_1;
-  param_1 = 0;
-  param_1 = x_998;
-  param_2 = x_79;
-  const float2 x_551 = float2(x_534.y, x_536.x);
-  const int x_999 = pivot;
-  pivot = 0;
-  pivot = x_999;
-  const int x_81 = h;
-  const float2 x_552 = float2(x_550.x, x_549.y);
-  const int x_1000 = h;
-  h = 0;
-  h = x_1000;
-  param_3 = x_81;
-  const int x_1001 = i_1;
-  i_1 = 0;
-  i_1 = x_1001;
-  const float2 x_553 = float2(x_549.y, x_552.x);
-  const int x_1002 = h;
-  h = 0;
-  h = x_1002;
-  swap_i1_i1_(param_2, param_3);
-  const int x_1003 = l;
-  l = 0;
-  l = x_1003;
-  const float2 x_554 = float2(x_536.z, float3(1.0f, 2.0f, 3.0f).y);
-  const int x_1004 = param_1;
-  param_1 = 0;
-  param_1 = x_1004;
-  const int x_83 = i_1;
-  const int x_1005 = param;
-  param = 0;
-  param = x_1005;
-  const float2 x_555 = float2(x_534.y, x_534.x);
-  const int x_1006 = j_1;
-  j_1 = 0;
-  j_1 = x_1006;
-  return x_83;
-}
-
-void quicksort_() {
-  int param_4 = 0;
-  int h_1 = 0;
-  int p = 0;
-  int l_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int param_5 = 0;
-  l_1 = 0;
-  const int x_1007 = param_5;
-  param_5 = 0;
-  param_5 = x_1007;
-  h_1 = 9;
-  const int x_1008[10] = stack;
-  const int tint_symbol_20[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  stack = tint_symbol_20;
-  stack = x_1008;
-  const float2 x_556 = float2(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).y);
-  const int x_1009 = param_5;
-  param_5 = 0;
-  param_5 = x_1009;
-  top = -1;
-  const int x_1010 = p;
-  p = 0;
-  p = x_1010;
-  const int x_93 = top;
-  const float2 x_557 = float2(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).x);
-  const int x_1011 = p;
-  p = 0;
-  p = x_1011;
-  const int x_94 = (x_93 + asint(1u));
-  const int x_1012 = top;
-  top = 0;
-  top = x_1012;
-  const float2 x_558 = float2(x_556.y, x_557.y);
-  const int x_1013 = param_4;
-  param_4 = 0;
-  param_4 = x_1013;
-  top = x_94;
-  const int x_1014 = h_1;
-  h_1 = 0;
-  h_1 = x_1014;
-  const float3 x_559 = float3(x_557.y, x_557.x, x_557.x);
-  const int x_1015 = param_4;
-  param_4 = 0;
-  param_4 = x_1015;
-  const int x_95 = l_1;
-  const QuicksortObject x_1016 = obj;
-  const int tint_symbol_21[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_22 = {tint_symbol_21};
-  obj = tint_symbol_22;
-  obj = x_1016;
-  const float3 x_560 = float3(x_559.y, x_559.x, x_557.x);
-  const int x_96_save = x_94;
-  const int x_1017[10] = stack;
-  const int tint_symbol_23[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  stack = tint_symbol_23;
-  stack = x_1017;
-  const float3 x_561 = float3(x_556.y, x_556.y, x_556.y);
-  const int x_1018 = l_1;
-  l_1 = 0;
-  l_1 = 0;
-  stack[x_96_save] = x_95;
-  const int x_1019 = param_5;
-  param_5 = 0;
-  param_5 = x_1019;
-  const int x_97 = top;
-  const int x_1020 = param_4;
-  param_4 = 0;
-  param_4 = x_1020;
-  const float3 x_562 = float3(float3(1.0f, 2.0f, 3.0f).z, x_558.y, float3(1.0f, 2.0f, 3.0f).y);
-  const int x_1021 = stack[x_96_save];
-  stack[x_96_save] = 0;
-  stack[x_96_save] = x_1021;
-  const int x_98 = (x_97 + 1);
-  const int x_1022 = stack[x_96_save];
-  stack[x_96_save] = 0;
-  stack[x_96_save] = x_1022;
-  const float3 x_563 = float3(x_559.x, x_559.z, x_556.y);
-  top = x_98;
-  const int x_1023 = param_4;
-  param_4 = 0;
-  param_4 = x_1023;
-  const int x_99 = h_1;
-  const int x_1024 = param_4;
-  param_4 = 0;
-  param_4 = x_1024;
-  const float3 x_564 = float3(x_558.x, x_561.x, x_558.y);
-  const int x_1025 = l_1;
-  l_1 = 0;
-  l_1 = x_1025;
-  const int x_100_save = x_98;
-  const int x_1026 = param_5;
-  param_5 = 0;
-  param_5 = x_1026;
-  const float2 x_565 = float2(x_564.z, x_564.z);
-  const int x_1027 = p;
-  p = 0;
-  p = x_1027;
-  stack[x_100_save] = x_99;
-  [loop] while (true) {
-    const float3 x_566 = float3(x_563.x, x_563.x, x_563.x);
-    const int x_1028 = h_1;
-    h_1 = 0;
-    h_1 = x_1028;
-    const int x_1029[10] = stack;
-    const int tint_symbol_24[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    stack = tint_symbol_24;
-    stack = x_1029;
-    const int x_106 = top;
-    const int x_1030[10] = stack;
-    const int tint_symbol_25[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    stack = tint_symbol_25;
-    stack = x_1030;
-    const float2 x_567 = float2(x_558.x, x_564.z);
-    const int x_1031 = param_4;
-    param_4 = 0;
-    param_4 = x_1031;
-    if ((x_106 >= asint(0u))) {
-    } else {
-      break;
-    }
-    const QuicksortObject x_1032 = obj;
-    const int tint_symbol_26[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_27 = {tint_symbol_26};
-    obj = tint_symbol_27;
-    obj = x_1032;
-    const float3 x_568 = float3(x_559.y, x_559.x, x_563.y);
-    const int x_1033 = param_4;
-    param_4 = 0;
-    param_4 = x_1033;
-    const int x_108 = top;
-    const float3 x_569 = float3(x_565.x, x_567.y, x_565.x);
-    const int x_1034 = h_1;
-    h_1 = 0;
-    h_1 = x_1034;
-    const float2 x_570 = float2(x_556.x, x_556.x);
-    const int x_1035 = p;
-    p = 0;
-    p = x_1035;
-    top = (x_108 - asint(1u));
-    const int x_1036 = p;
-    p = 0;
-    p = x_1036;
-    const int x_110_save = x_108;
-    const int x_1037 = stack[x_96_save];
-    stack[x_96_save] = 0;
-    stack[x_96_save] = x_1037;
-    const int x_111 = stack[x_110_save];
-    const int x_1038[10] = stack;
-    const int tint_symbol_28[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    stack = tint_symbol_28;
-    stack = x_1038;
-    const float3 x_571 = float3(x_559.y, x_559.x, x_564.y);
-    const int x_1039 = l_1;
-    l_1 = 0;
-    l_1 = x_1039;
-    h_1 = x_111;
-    const int x_1040[10] = stack;
-    const int tint_symbol_29[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    stack = tint_symbol_29;
-    stack = x_1040;
-    const float2 x_572 = float2(x_562.y, x_561.y);
-    const int x_1041 = p;
-    p = 0;
-    p = x_1041;
-    const int x_112 = top;
-    const int x_1042 = param_4;
-    param_4 = 0;
-    param_4 = x_1042;
-    const int x_1043 = stack[x_100_save];
-    stack[x_100_save] = 0;
-    stack[x_100_save] = x_1043;
-    const float2 x_573 = float2(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).z);
-    top = (x_112 - 1);
-    const int x_1044 = param_5;
-    param_5 = 0;
-    param_5 = x_1044;
-    const float3 x_574 = float3(x_570.y, x_565.x, x_570.y);
-    const int x_1045 = h_1;
-    h_1 = 0;
-    h_1 = x_1045;
-    const int x_114_save = x_112;
-    const float2 x_575 = float2(x_564.y, x_564.z);
-    const int x_1046 = stack[x_100_save];
-    stack[x_100_save] = 0;
-    stack[x_100_save] = x_1046;
-    const int x_115 = stack[x_114_save];
-    const int x_1047 = p;
-    p = 0;
-    p = x_1047;
-    const float3 x_576 = float3(x_573.y, x_573.y, x_565.x);
-    const int x_1048 = param_5;
-    param_5 = 0;
-    param_5 = x_1048;
-    l_1 = x_115;
-    const int x_1049 = top;
-    top = 0;
-    top = x_1049;
-    param_4 = l_1;
-    const int x_1050 = stack[x_110_save];
-    stack[x_110_save] = 0;
-    stack[x_110_save] = x_1050;
-    const float2 x_577 = float2(x_569.y, x_569.z);
-    const int x_120 = h_1;
-    const float2 x_578 = float2(x_558.x, float3(1.0f, 2.0f, 3.0f).y);
-    param_5 = x_120;
-    const int x_1051 = stack[x_100_save];
-    stack[x_100_save] = 0;
-    stack[x_100_save] = x_1051;
-    const int x_121 = performPartition_i1_i1_(param_4, param_5);
-    const float2 x_579 = float2(x_567.x, x_568.x);
-    const int x_1052 = param_5;
-    param_5 = 0;
-    param_5 = x_1052;
-    p = x_121;
-    const int x_1053 = param_4;
-    param_4 = 0;
-    param_4 = x_1053;
-    const int x_122 = p;
-    const int x_1054 = h_1;
-    h_1 = 0;
-    h_1 = x_1054;
-    const float2 x_580 = float2(x_568.y, x_568.y);
-    const int x_1055 = l_1;
-    l_1 = 0;
-    l_1 = x_1055;
-    const int x_1056 = h_1;
-    h_1 = 0;
-    h_1 = x_1056;
-    const int x_124 = l_1;
-    const int x_1057 = stack[x_110_save];
-    stack[x_110_save] = 0;
-    stack[x_110_save] = x_1057;
-    const int x_1058 = h_1;
-    h_1 = 0;
-    h_1 = x_1058;
-    const float2 x_582 = float2(x_567.y, x_573.x);
-    const int x_1059 = stack[x_100_save];
-    stack[x_100_save] = 0;
-    stack[x_100_save] = x_1059;
-    if (((x_122 - asint(1u)) > x_124)) {
-      const int x_1060 = param_4;
-      param_4 = 0;
-      param_4 = x_1060;
-      const int x_128 = top;
-      const float2 x_583 = float2(x_571.y, x_556.y);
-      const int x_1061 = stack[x_100_save];
-      stack[x_100_save] = 0;
-      stack[x_100_save] = x_1061;
-      const int x_1062[10] = stack;
-      const int tint_symbol_30[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-      stack = tint_symbol_30;
-      stack = x_1062;
-      const float2 x_584 = float2(x_569.z, x_569.y);
-      const float3 x_585 = float3(x_580.y, x_577.x, x_577.x);
-      const int x_130 = l_1;
-      const int x_1063 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1063;
-      const float2 x_586 = float2(x_564.x, x_585.x);
-      const int x_1064 = param_5;
-      param_5 = 0;
-      param_5 = x_1064;
-      const int x_131_save = (1 + x_128);
-      const int x_1065 = stack[x_110_save];
-      stack[x_110_save] = 0;
-      stack[x_110_save] = x_1065;
-      const float3 x_587 = float3(x_566.y, x_566.y, x_563.x);
-      const int x_1066 = param_5;
-      param_5 = 0;
-      param_5 = x_1066;
-      stack[x_131_save] = x_130;
-      const int x_132 = top;
-      const int x_1067 = stack[x_100_save];
-      stack[x_100_save] = 0;
-      stack[x_100_save] = x_1067;
-      const float2 x_588 = float2(x_575.y, x_575.x);
-      const int x_1068 = stack[x_131_save];
-      stack[x_131_save] = 0;
-      stack[x_131_save] = x_1068;
-      const int x_133 = asint((1u + asuint(x_132)));
-      const int x_1069 = stack[x_100_save];
-      stack[x_100_save] = 0;
-      stack[x_100_save] = x_1069;
-      const float3 x_589 = float3(x_576.z, x_588.y, x_576.z);
-      const int x_1070 = h_1;
-      h_1 = 0;
-      h_1 = x_1070;
-      top = x_133;
-      const int x_1071[10] = stack;
-      const int tint_symbol_31[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-      stack = tint_symbol_31;
-      stack = x_1071;
-      const int x_134 = p;
-      const float2 x_590 = float2(x_576.x, x_573.y);
-      const int x_1072 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1072;
-      const int x_136_save = x_133;
-      const int x_1073 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1073;
-      stack[x_136_save] = (x_134 - asint(1u));
-      const int x_1074 = stack[x_96_save];
-      stack[x_96_save] = 0;
-      stack[x_96_save] = x_1074;
-      const float2 x_591 = float2(x_569.z, x_569.y);
-      const int x_1075 = stack[x_136_save];
-      stack[x_136_save] = 0;
-      stack[x_136_save] = x_1075;
-    }
-    const int x_1076 = stack[x_96_save];
-    stack[x_96_save] = 0;
-    stack[x_96_save] = x_1076;
-    const float2 x_592 = float2(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).y);
-    const QuicksortObject x_1077 = obj;
-    const int tint_symbol_32[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_33 = {tint_symbol_32};
-    obj = tint_symbol_33;
-    obj = x_1077;
-    const int x_137 = p;
-    const int x_1078 = stack[x_114_save];
-    stack[x_114_save] = 0;
-    stack[x_114_save] = x_1078;
-    const float3 x_593 = float3(x_571.z, x_556.x, x_556.y);
-    const int x_1079 = p;
-    p = 0;
-    p = x_1079;
-    const float3 x_594 = float3(x_563.z, x_563.x, x_575.x);
-    const int x_1080 = stack[x_114_save];
-    stack[x_114_save] = 0;
-    stack[x_114_save] = x_1080;
-    const int x_139 = h_1;
-    const int x_1081 = top;
-    top = 0;
-    top = x_1081;
-    const float3 x_595 = float3(x_560.z, x_568.x, x_560.x);
-    const int x_1082 = stack[x_100_save];
-    stack[x_100_save] = 0;
-    stack[x_100_save] = x_1082;
-    const int x_1083 = p;
-    p = 0;
-    p = x_1083;
-    if ((asint((1u + asuint(x_137))) < x_139)) {
-      const int x_1084 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1084;
-      const float2 x_596 = float2(x_592.y, x_582.x);
-      const int x_1085 = l_1;
-      l_1 = 0;
-      l_1 = x_1085;
-      const int x_143 = top;
-      const int x_1086 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1086;
-      const float3 x_597 = float3(x_562.y, x_560.y, x_560.y);
-      const int x_144 = (x_143 + 1);
-      const int x_1087 = param_5;
-      param_5 = 0;
-      param_5 = x_1087;
-      top = x_144;
-      const int x_1088 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1088;
-      const int x_145 = p;
-      const int x_1089 = param_5;
-      param_5 = 0;
-      param_5 = x_1089;
-      const float3 x_599 = float3(x_560.z, x_560.x, x_568.x);
-      const int x_1090 = p;
-      p = 0;
-      p = x_1090;
-      const float3 x_600 = float3(x_556.x, x_580.x, x_580.x);
-      const int x_1091 = stack[x_100_save];
-      stack[x_100_save] = 0;
-      stack[x_100_save] = x_1091;
-      const int x_147_save = x_144;
-      const int x_1092 = stack[x_110_save];
-      stack[x_110_save] = 0;
-      stack[x_110_save] = x_1092;
-      const float2 x_601 = float2(x_563.x, x_563.y);
-      stack[x_147_save] = asint((1u + asuint(x_145)));
-      const int x_1093[10] = stack;
-      const int tint_symbol_34[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-      stack = tint_symbol_34;
-      stack = x_1093;
-      const int x_148 = top;
-      const int x_1094 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1094;
-      const float2 x_602 = float2(x_565.y, x_599.y);
-      const int x_1095[10] = stack;
-      const int tint_symbol_35[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-      stack = tint_symbol_35;
-      stack = x_1095;
-      const int x_149 = (x_148 + asint(1u));
-      const int x_1096 = stack[x_147_save];
-      stack[x_147_save] = 0;
-      stack[x_147_save] = x_1096;
-      top = x_149;
-      const int x_1097 = param_4;
-      param_4 = 0;
-      param_4 = x_1097;
-      const int x_150 = h_1;
-      const int x_1098 = stack[x_100_save];
-      stack[x_100_save] = 0;
-      stack[x_100_save] = x_1098;
-      const int x_1099 = stack[x_96_save];
-      stack[x_96_save] = 0;
-      stack[x_96_save] = x_1099;
-      stack[x_149] = x_150;
-      const int x_1100 = stack[x_114_save];
-      stack[x_114_save] = 0;
-      stack[x_114_save] = x_1100;
-      const float3 x_603 = float3(x_568.y, x_564.x, x_564.x);
-      const int x_1101 = l_1;
-      l_1 = 0;
-      l_1 = x_1101;
-    }
-    const int x_1102 = stack[x_100_save];
-    stack[x_100_save] = 0;
-    stack[x_100_save] = x_1102;
-    {
-      const int x_1103 = l_1;
-      l_1 = 0;
-      l_1 = x_1103;
-      const float2 x_604 = float2(x_563.z, x_564.x);
-      const QuicksortObject x_1104 = obj;
-      const int tint_symbol_36[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-      const QuicksortObject tint_symbol_37 = {tint_symbol_36};
-      obj = tint_symbol_37;
-      obj = x_1104;
-    }
-  }
-  const int x_1105 = h_1;
-  h_1 = 0;
-  h_1 = x_1105;
-  return;
-}
-
-void main_1() {
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  const float2 x_717 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_717;
-  i_2 = 0;
-  const QuicksortObject x_721 = obj;
-  const int tint_symbol_38[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_39 = {tint_symbol_38};
-  obj = tint_symbol_39;
-  obj = x_721;
-  if (true) {
-    const QuicksortObject x_722 = obj;
-    const int tint_symbol_40[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_41 = {tint_symbol_40};
-    obj = tint_symbol_41;
-    obj = x_722;
-    const float2 x_431 = float2(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).x);
-    const int x_158 = i_2;
-    const float2 x_723 = uv;
-    uv = float2(0.0f, 0.0f);
-    uv = x_723;
-    const float3 x_725 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_725;
-    const float2 x_432 = float2(x_431.y, x_431.y);
-    const QuicksortObject x_726 = obj;
-    const int tint_symbol_42[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_43 = {tint_symbol_42};
-    obj = tint_symbol_43;
-    obj = x_726;
-  }
-  const QuicksortObject x_756 = obj;
-  const int tint_symbol_44[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_45 = {tint_symbol_44};
-  obj = tint_symbol_45;
-  obj = x_756;
-  const float2 x_446 = float2(float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).x);
-  const int x_757 = i_2;
-  i_2 = 0;
-  i_2 = x_757;
-  quicksort_();
-  const QuicksortObject x_758 = obj;
-  const int tint_symbol_46[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_47 = {tint_symbol_46};
-  obj = tint_symbol_47;
-  obj = x_758;
-  const float4 x_184 = gl_FragCoord;
-  const float2 x_759 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_759;
-  const float2 x_447 = float2(float2(0.0f, 0.0f).y, float2(0.0f, 0.0f).y);
-  const float2 x_760 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_760;
-  const float2 x_185 = float2(x_184.x, x_184.y);
-  const float3 x_448 = float3(x_185.y, x_446.y, x_446.y);
-  const QuicksortObject x_761 = obj;
-  const int tint_symbol_48[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_49 = {tint_symbol_48};
-  obj = tint_symbol_49;
-  obj = x_761;
-  const float2 x_762 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_762;
-  const float2 x_191 = asfloat(x_188[0].xy);
-  const QuicksortObject x_763 = obj;
-  const int tint_symbol_50[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_51 = {tint_symbol_50};
-  obj = tint_symbol_51;
-  obj = x_763;
-  const float3 x_449 = float3(x_184.y, float3(1.0f, 2.0f, 3.0f).z, x_184.w);
-  const float3 x_764 = color;
-  color = float3(0.0f, 0.0f, 0.0f);
-  color = x_764;
-  const float2 x_192 = (x_185 / x_191);
-  const QuicksortObject x_765 = obj;
-  const int tint_symbol_52[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_53 = {tint_symbol_52};
-  obj = tint_symbol_53;
-  obj = x_765;
-  const float2 x_450 = float2(x_447.x, x_185.y);
-  const float3 x_766 = color;
-  color = float3(0.0f, 0.0f, 0.0f);
-  const float3 x_767 = color;
-  color = float3(0.0f, 0.0f, 0.0f);
-  color = x_767;
-  color = x_766;
-  uv = x_192;
-  color = float3(1.0f, 2.0f, 3.0f);
-  const float3 x_768 = color;
-  color = float3(0.0f, 0.0f, 0.0f);
-  color = x_768;
-  const float3 x_451 = float3(x_185.x, x_185.y, x_446.y);
-  const QuicksortObject x_769 = obj;
-  const int tint_symbol_54[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_55 = {tint_symbol_54};
-  obj = tint_symbol_55;
-  obj = x_769;
-  const int x_770 = obj.numbers[0u];
-  obj.numbers[0u] = 0;
-  obj.numbers[0u] = x_770;
-  const int x_201 = obj.numbers[0u];
-  const QuicksortObject x_771 = obj;
-  const int tint_symbol_56[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_57 = {tint_symbol_56};
-  obj = tint_symbol_57;
-  obj = x_771;
-  const int x_772 = obj.numbers[0u];
-  obj.numbers[0u] = 0;
-  obj.numbers[0u] = x_772;
-  const float x_206 = color.x;
-  const float x_773 = color.x;
-  color.x = 0.0f;
-  color.x = x_773;
-  const float2 x_452 = float2(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).y);
-  const int x_774 = i_2;
-  i_2 = 0;
-  i_2 = x_774;
-  const QuicksortObject x_775 = obj;
-  const int tint_symbol_58[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_59 = {tint_symbol_58};
-  obj = tint_symbol_59;
-  obj = x_775;
-  const float3 x_453 = float3(x_451.x, x_450.x, x_450.y);
-  color.x = (x_206 + float(x_201));
-  const float2 x_776 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_776;
-  const float2 x_777 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_777;
-  const float2 x_454 = float2(x_184.y, x_184.y);
-  const float x_210 = uv.x;
-  const float2 x_455 = float2(x_192.y, x_192.x);
-  const float x_778 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_778;
-  const QuicksortObject x_779 = obj;
-  const int tint_symbol_60[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_61 = {tint_symbol_60};
-  obj = tint_symbol_61;
-  obj = x_779;
-  if ((x_210 > 0.25f)) {
-    const int x_780 = i_2;
-    i_2 = 0;
-    i_2 = x_780;
-    const int x_781 = obj.numbers[0u];
-    obj.numbers[0u] = 0;
-    obj.numbers[0u] = x_781;
-    const float3 x_456 = float3(float2(0.0f, 0.0f).y, x_448.y, x_448.y);
-    const float x_782 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_782;
-    const int x_216 = obj.numbers[1];
-    const QuicksortObject x_783 = obj;
-    const int tint_symbol_62[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_63 = {tint_symbol_62};
-    obj = tint_symbol_63;
-    obj = x_783;
-    const float2 x_457 = float2(x_454.x, x_454.x);
-    const float2 x_784 = uv;
-    uv = float2(0.0f, 0.0f);
-    uv = x_784;
-    const QuicksortObject x_785 = obj;
-    const int tint_symbol_64[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_65 = {tint_symbol_64};
-    obj = tint_symbol_65;
-    obj = x_785;
-    const float2 x_458 = float2(float3(1.0f, 2.0f, 3.0f).z, float2(0.0f, 0.0f).y);
-    const int x_786 = i_2;
-    i_2 = 0;
-    i_2 = x_786;
-    const float x_219 = color[0];
-    const float x_787 = color[0];
-    color[0] = 0.0f;
-    color[0] = x_787;
-    const float3 x_788 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_788;
-    const float3 x_789 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_789;
-    const float3 x_459 = float3(x_454.y, x_454.y, x_447.y);
-    const float x_790 = color[0];
-    color[0] = 0.0f;
-    color[0] = x_790;
-    color.x = (float(x_216) + x_219);
-    const int x_791 = obj.numbers[0u];
-    obj.numbers[0u] = 0;
-    obj.numbers[0u] = x_791;
-  }
-  const float x_792 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_792;
-  const float x_793 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_793;
-  const float x_223 = uv.x;
-  const float x_794 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_794;
-  const float3 x_460 = float3(x_453.z, x_453.y, x_453.y);
-  const float2 x_795 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_795;
-  const float x_796 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_796;
-  const float2 x_461 = float2(float2(0.0f, 0.0f).y, float2(0.0f, 0.0f).y);
-  const float x_797 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_797;
-  if ((x_223 > 0.5f)) {
-    const float x_798 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_798;
-    const float2 x_462 = float2(x_446.x, x_446.x);
-    const float x_799 = color.x;
-    color.x = 0.0f;
-    color.x = x_799;
-    const float x_800 = color.x;
-    color.x = 0.0f;
-    color.x = x_800;
-    const float3 x_463 = float3(x_453.x, x_453.z, x_461.y);
-    const float x_801 = color.x;
-    color.x = 0.0f;
-    color.x = x_801;
-    const int x_230 = obj.numbers[2u];
-    const float x_802 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_802;
-    const float x_803 = color.x;
-    color.x = 0.0f;
-    color.x = x_803;
-    const int x_804 = obj.numbers[2u];
-    obj.numbers[2u] = 0;
-    obj.numbers[2u] = x_804;
-    const float2 x_464 = float2(x_450.y, x_191.x);
-    const float x_805 = color.y;
-    color.y = 0.0f;
-    color.y = x_805;
-    const float x_234 = color.y;
-    const int x_806 = obj.numbers[2u];
-    obj.numbers[2u] = 0;
-    obj.numbers[2u] = x_806;
-    const float2 x_465 = float2(x_463.x, x_185.x);
-    const float x_807 = color.x;
-    color.x = 0.0f;
-    color.x = x_807;
-    const int x_808 = i_2;
-    i_2 = 0;
-    i_2 = x_808;
-    const float2 x_466 = float2(x_455.y, float2(0.0f, 0.0f).y);
-    const int x_809 = i_2;
-    i_2 = 0;
-    i_2 = x_809;
-    color.y = (float(x_230) + x_234);
-    const float x_810 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_810;
-  }
-  const int x_811 = i_2;
-  i_2 = 0;
-  i_2 = x_811;
-  const float2 x_467 = float2(x_191.x, x_191.x);
-  const float x_812 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_812;
-  const float x_238 = uv[0];
-  const float3 x_813 = color;
-  color = float3(0.0f, 0.0f, 0.0f);
-  color = x_813;
-  const float x_814 = color.x;
-  color.x = 0.0f;
-  color.x = x_814;
-  if ((x_238 > 0.75f)) {
-    const float x_815 = color.x;
-    color.x = 0.0f;
-    color.x = x_815;
-    const int x_245 = obj.numbers[3];
-    const float x_816 = color.x;
-    color.x = 0.0f;
-    color.x = x_816;
-    const QuicksortObject x_817 = obj;
-    const int tint_symbol_66[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_67 = {tint_symbol_66};
-    obj = tint_symbol_67;
-    obj = x_817;
-    const float3 x_468 = float3(x_467.x, x_467.x, x_467.x);
-    const float x_818 = uv[0];
-    uv[0] = 0.0f;
-    uv[0] = x_818;
-    const float x_819 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_819;
-    const float x_249 = color.z;
-    const float3 x_820 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_820;
-    const float3 x_469 = float3(x_467.x, x_191.y, x_467.y);
-    const float x_821 = color.z;
-    color.z = 0.0f;
-    color.z = x_821;
-    const int x_822 = obj.numbers[0u];
-    obj.numbers[0u] = 0;
-    obj.numbers[0u] = x_822;
-    const float2 x_470 = float2(float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).y);
-    const float x_823 = color.z;
-    color.z = 0.0f;
-    color.z = x_823;
-    color.z = (x_249 + float(x_245));
-    const float2 x_824 = uv;
-    uv = float2(0.0f, 0.0f);
-    uv = x_824;
-    const float2 x_471 = float2(x_470.y, x_470.y);
-  }
-  const float x_825 = uv[0];
-  uv[0] = 0.0f;
-  uv[0] = x_825;
-  const float3 x_472 = float3(x_454.x, x_454.y, x_454.y);
-  const int x_254 = obj.numbers[4];
-  const float x_826 = uv[0];
-  uv[0] = 0.0f;
-  uv[0] = x_826;
-  const float3 x_827 = color;
-  color = float3(0.0f, 0.0f, 0.0f);
-  color = x_827;
-  const float3 x_473 = float3(x_446.y, x_453.x, x_453.x);
-  const int x_828 = obj.numbers[4];
-  obj.numbers[4] = 0;
-  obj.numbers[4] = x_828;
-  const float2 x_474 = float2(x_191.x, x_184.z);
-  const float x_829 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_829;
-  const float x_257 = color.y;
-  const float x_830 = color.y;
-  color.y = 0.0f;
-  color.y = x_830;
-  const float2 x_475 = float2(x_467.x, x_450.x);
-  const float x_831 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_831;
-  const float x_832 = color.x;
-  color.x = 0.0f;
-  color.x = x_832;
-  const float2 x_476 = float2(x_451.z, x_460.y);
-  color.y = (x_257 + float(x_254));
-  const float3 x_477 = float3(float2(0.0f, 0.0f).x, x_472.x, float2(0.0f, 0.0f).y);
-  const float x_833 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_833;
-  const float x_834 = color.x;
-  color.x = 0.0f;
-  color.x = x_834;
-  const float2 x_478 = float2(x_472.x, x_472.y);
-  const float x_835 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_835;
-  const float x_261 = uv.y;
-  const int x_836 = i_2;
-  i_2 = 0;
-  i_2 = x_836;
-  const float3 x_479 = float3(float2(0.0f, 0.0f).y, x_454.y, float2(0.0f, 0.0f).x);
-  const int x_837 = obj.numbers[0u];
-  obj.numbers[0u] = 0;
-  obj.numbers[0u] = x_837;
-  const float x_838 = color.y;
-  color.y = 0.0f;
-  color.y = x_838;
-  const float3 x_480 = float3(x_446.x, x_446.x, float2(0.0f, 0.0f).y);
-  const float x_839 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_839;
-  if ((x_261 > 0.25f)) {
-    const float2 x_481 = float2(x_447.x, x_480.z);
-    const float3 x_840 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_840;
-    const int x_267 = obj.numbers[5u];
-    const float x_841 = color.x;
-    color.x = 0.0f;
-    color.x = x_841;
-    const int x_842 = i_2;
-    i_2 = 0;
-    i_2 = x_842;
-    const int x_843 = i_2;
-    i_2 = 0;
-    i_2 = x_843;
-    const float x_270 = color.x;
-    const float x_844 = uv[0];
-    uv[0] = 0.0f;
-    uv[0] = x_844;
-    const float3 x_482 = float3(x_455.x, x_475.y, x_455.y);
-    const QuicksortObject x_845 = obj;
-    const int tint_symbol_68[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_69 = {tint_symbol_68};
-    obj = tint_symbol_69;
-    obj = x_845;
-    const float x_846 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_846;
-    const int x_847 = i_2;
-    i_2 = 0;
-    i_2 = x_847;
-    const float3 x_483 = float3(x_184.w, x_184.w, x_192.x);
-    const float x_848 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_848;
-    color.x = (float(x_267) + x_270);
-    const float3 x_484 = float3(x_454.y, x_450.x, x_454.y);
-    const float x_849 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_849;
-  }
-  const float x_850 = color.x;
-  color.x = 0.0f;
-  color.x = x_850;
-  const float3 x_485 = float3(x_467.x, x_450.y, x_450.x);
-  const float x_851 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_851;
-  const int x_852 = obj.numbers[4];
-  obj.numbers[4] = 0;
-  obj.numbers[4] = x_852;
-  const float x_274 = uv.y;
-  const int x_853 = obj.numbers[0u];
-  obj.numbers[0u] = 0;
-  obj.numbers[0u] = x_853;
-  if ((x_274 > 0.5f)) {
-    const float x_854 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_854;
-    const float2 x_486 = float2(x_480.y, x_455.y);
-    const float x_855 = color.y;
-    color.y = 0.0f;
-    color.y = x_855;
-    const float2 x_487 = float2(x_449.z, x_449.y);
-    const float x_856 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_856;
-    const int x_280 = obj.numbers[6u];
-    const float x_857 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_857;
-    const int x_858 = i_2;
-    i_2 = 0;
-    i_2 = x_858;
-    const int x_859 = obj.numbers[4];
-    obj.numbers[4] = 0;
-    obj.numbers[4] = x_859;
-    const float2 x_488 = float2(x_473.z, x_473.y);
-    const float x_283 = color.y;
-    const float2 x_860 = uv;
-    uv = float2(0.0f, 0.0f);
-    uv = x_860;
-    const float x_861 = color.x;
-    color.x = 0.0f;
-    color.x = x_861;
-    const float2 x_489 = float2(x_475.y, x_475.x);
-    const int x_862 = obj.numbers[6u];
-    obj.numbers[6u] = 0;
-    obj.numbers[6u] = x_862;
-    const int x_863 = obj.numbers[6u];
-    obj.numbers[6u] = 0;
-    obj.numbers[6u] = x_863;
-    const float2 x_490 = float2(x_480.z, x_480.z);
-    const QuicksortObject x_864 = obj;
-    const int tint_symbol_70[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_71 = {tint_symbol_70};
-    obj = tint_symbol_71;
-    obj = x_864;
-    color.y = (float(x_280) + x_283);
-    const float x_865 = color.x;
-    color.x = 0.0f;
-    color.x = x_865;
-    const float2 x_491 = float2(float3(1.0f, 2.0f, 3.0f).y, x_454.x);
-    const float x_866 = color.y;
-    color.y = 0.0f;
-    color.y = x_866;
-  }
-  const float2 x_492 = float2(x_455.y, x_455.y);
-  const float x_867 = color.x;
-  color.x = 0.0f;
-  color.x = x_867;
-  const float x_287 = uv.y;
-  const QuicksortObject x_868 = obj;
-  const int tint_symbol_72[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_73 = {tint_symbol_72};
-  obj = tint_symbol_73;
-  obj = x_868;
-  const float2 x_493 = float2(x_475.x, x_475.y);
-  const float x_869 = uv[0];
-  uv[0] = 0.0f;
-  uv[0] = x_869;
-  const float x_870 = color.y;
-  color.y = 0.0f;
-  color.y = x_870;
-  const float3 x_494 = float3(x_191.x, x_191.y, x_191.y);
-  const int x_871 = obj.numbers[4];
-  obj.numbers[4] = 0;
-  obj.numbers[4] = x_871;
-  if ((x_287 > 0.75f)) {
-    const float3 x_872 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_872;
-    const float x_873 = color.x;
-    color.x = 0.0f;
-    color.x = x_873;
-    const float3 x_495 = float3(x_192.y, x_192.x, x_192.y);
-    const float3 x_874 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_874;
-    const int x_293 = obj.numbers[7];
-    const float x_875 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_875;
-    const float3 x_496 = float3(x_475.x, x_467.y, x_467.x);
-    const float x_876 = color.y;
-    color.y = 0.0f;
-    color.y = x_876;
-    const float2 x_497 = float2(x_477.x, x_461.y);
-    const int x_877 = obj.numbers[0u];
-    obj.numbers[0u] = 0;
-    obj.numbers[0u] = x_877;
-    const float x_878 = color.y;
-    color.y = 0.0f;
-    color.y = x_878;
-    const float3 x_498 = float3(x_478.x, x_478.y, x_478.x);
-    const float x_879 = color.x;
-    color.x = 0.0f;
-    color.x = x_879;
-    const float x_296 = color.z;
-    const float x_880 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_880;
-    const float2 x_499 = float2(x_184.x, x_184.y);
-    const float x_881 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_881;
-    const float x_882 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_882;
-    const float x_883 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_883;
-    const float3 x_500 = float3(x_499.y, x_499.y, x_494.z);
-    const float x_884 = color.z;
-    color.z = 0.0f;
-    color.z = x_884;
-    color.z = (float(x_293) + x_296);
-    const float x_885 = color.y;
-    color.y = 0.0f;
-    color.y = x_885;
-    const float2 x_501 = float2(x_453.x, x_453.z);
-    const float x_886 = color.x;
-    color.x = 0.0f;
-    color.x = x_886;
-  }
-  const int x_887 = i_2;
-  i_2 = 0;
-  i_2 = x_887;
-  const float2 x_502 = float2(x_451.y, x_192.y);
-  const float2 x_888 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_888;
-  const int x_301 = obj.numbers[8];
-  const int x_889 = i_2;
-  i_2 = 0;
-  i_2 = x_889;
-  const float2 x_503 = float2(x_185.x, x_451.z);
-  const int x_890 = obj.numbers[8];
-  obj.numbers[8] = 0;
-  obj.numbers[8] = x_890;
-  const float x_891 = color.y;
-  color.y = 0.0f;
-  color.y = x_891;
-  const float2 x_504 = float2(x_453.y, float2(0.0f, 0.0f).x);
-  const float x_892 = color.x;
-  color.x = 0.0f;
-  color.x = x_892;
-  const float3 x_505 = float3(x_504.x, x_504.y, x_504.x);
-  const float x_893 = color.z;
-  color.z = 0.0f;
-  color.z = x_893;
-  const float x_304 = color.z;
-  const float x_894 = color.x;
-  color.x = 0.0f;
-  color.x = x_894;
-  const float2 x_506 = float2(x_493.x, x_492.x);
-  const int x_895 = obj.numbers[4];
-  obj.numbers[4] = 0;
-  obj.numbers[4] = x_895;
-  const float x_896 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_896;
-  const float2 x_507 = float2(x_461.x, x_447.x);
-  const float x_897 = color.y;
-  color.y = 0.0f;
-  color.y = x_897;
-  color.z = (x_304 + float(x_301));
-  const float2 x_898 = uv;
-  uv = float2(0.0f, 0.0f);
-  uv = x_898;
-  const float x_899 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_899;
-  const float3 x_508 = float3(x_461.y, x_461.x, x_506.y);
-  const float x_900 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_900;
-  const float x_308 = uv.x;
-  const float x_901 = color.y;
-  color.y = 0.0f;
-  color.y = x_901;
-  const float3 x_509 = float3(x_503.y, x_503.x, x_448.z);
-  const float x_902 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_902;
-  const float x_310 = uv.y;
-  const float x_903 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_903;
-  const float x_904 = color.z;
-  color.z = 0.0f;
-  color.z = x_904;
-  const float3 x_510 = float3(float3(1.0f, 2.0f, 3.0f).y, x_485.y, x_485.z);
-  const float x_905 = color.z;
-  color.z = 0.0f;
-  color.z = x_905;
-  const int x_906 = i_2;
-  i_2 = 0;
-  i_2 = x_906;
-  const float2 x_511 = float2(x_485.z, x_485.y);
-  const float3 x_907 = color;
-  color = float3(0.0f, 0.0f, 0.0f);
-  color = x_907;
-  const float x_908 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_908;
-  const float3 x_512 = float3(x_455.y, x_455.y, x_455.y);
-  const int x_909 = obj.numbers[4];
-  obj.numbers[4] = 0;
-  obj.numbers[4] = x_909;
-  if ((abs((x_308 - x_310)) < 0.25f)) {
-    const float x_910 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_910;
-    const QuicksortObject x_911 = obj;
-    const int tint_symbol_74[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    const QuicksortObject tint_symbol_75 = {tint_symbol_74};
-    obj = tint_symbol_75;
-    obj = x_911;
-    const float3 x_513 = float3(x_505.z, x_505.x, x_448.x);
-    const int x_912 = obj.numbers[8];
-    obj.numbers[8] = 0;
-    obj.numbers[8] = x_912;
-    const int x_317 = obj.numbers[9u];
-    const float3 x_514 = float3(x_474.y, x_474.y, x_474.y);
-    const float x_913 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_913;
-    const float x_320 = color.x;
-    const float x_914 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_914;
-    const float2 x_515 = float2(x_502.x, x_502.y);
-    const float x_915 = color.x;
-    color.x = 0.0f;
-    color.x = x_915;
-    const float3 x_916 = color;
-    color = float3(0.0f, 0.0f, 0.0f);
-    color = x_916;
-    const float2 x_516 = float2(x_452.x, x_452.x);
-    const float2 x_917 = uv;
-    uv = float2(0.0f, 0.0f);
-    uv = x_917;
-    const float x_918 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_918;
-    const float3 x_517 = float3(float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).y);
-    color.x = (float(x_317) + x_320);
-    const float x_919 = color.x;
-    color.x = 0.0f;
-    color.x = x_919;
-    const float3 x_518 = float3(x_480.y, x_508.x, x_480.x);
-    const float x_920 = color.x;
-    color.x = 0.0f;
-    color.x = x_920;
-  }
-  const float x_921 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_921;
-  const float3 x_325 = color;
-  const float x_922 = uv[0];
-  uv[0] = 0.0f;
-  uv[0] = x_922;
-  const float3 x_519 = float3(x_447.x, x_446.x, x_446.y);
-  const float3 x_326 = normalize(x_325);
-  const float x_923 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_923;
-  const QuicksortObject x_924 = obj;
-  const int tint_symbol_76[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_77 = {tint_symbol_76};
-  obj = tint_symbol_77;
-  obj = x_924;
-  const QuicksortObject x_925 = obj;
-  const int tint_symbol_78[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_79 = {tint_symbol_78};
-  obj = tint_symbol_79;
-  obj = x_925;
-  const float x_926 = color.y;
-  color.y = 0.0f;
-  color.y = x_926;
-  const float2 x_520 = float2(x_506.y, x_519.y);
-  const float x_927 = color.y;
-  color.y = 0.0f;
-  color.y = x_927;
-  const float4 x_330 = float4(x_326.x, x_326.y, x_326.z, 1.0f);
-  const float x_928 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_928;
-  const float3 x_521 = float3(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).y, x_520.y);
-  const float x_929 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_929;
-  x_GLF_color = x_330;
-  const QuicksortObject x_930 = obj;
-  const int tint_symbol_80[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-  const QuicksortObject tint_symbol_81 = {tint_symbol_80};
-  obj = tint_symbol_81;
-  obj = x_930;
-  const float3 x_522 = float3(x_330.w, x_330.y, x_493.x);
-  const float x_931 = color.x;
-  color.x = 0.0f;
-  color.x = x_931;
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
-  float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  const main_out tint_symbol_82 = {x_GLF_color};
-  return tint_symbol_82;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001EB41548320(156,10-21): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/bug/tint/998.wgsl.expected.hlsl b/test/bug/tint/998.wgsl.expected.hlsl
deleted file mode 100644
index 30eb1a0..0000000
--- a/test/bug/tint/998.wgsl.expected.hlsl
+++ /dev/null
@@ -1,21 +0,0 @@
-SKIP: FAILED
-
-cbuffer cbuffer_constants : register(b0, space1) {
-  uint4 constants[1];
-};
-
-RWByteAddressBuffer result : register(u1, space1);
-
-struct S {
-  uint data[3];
-};
-
-static S s = (S)0;
-
-[numthreads(1, 1, 1)]
-void main() {
-  s.data[constants[0].x] = 0u;
-  return;
-}
-C:\src\tint\test\Shader@0x00000150124FBBE0(15,3-24): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl
new file mode 100644
index 0000000..379856e
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl
@@ -0,0 +1,22 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  for (var i: i32 = 0; i < 4; i = i + 1) {
+    s1.a1[uniforms.i] = v;
+  }
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.hlsl
new file mode 100644
index 0000000..f82b13f
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  {
+    [loop] for(int i = 0; (i < 4); i = (i + 1)) {
+      {
+        InnerS tint_symbol_1[8] = s1.a1;
+        tint_symbol_1[uniforms[0].x] = v;
+        s1.a1 = tint_symbol_1;
+      }
+    }
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl
new file mode 100644
index 0000000..5ca5836
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl
@@ -0,0 +1,22 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  for (var i: i32 = 0; i < 4; s1.a1[uniforms.i] = v) {
+    i = i + 1;
+  }
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.hlsl
new file mode 100644
index 0000000..382880a
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.hlsl
@@ -0,0 +1,29 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  {
+    int i = 0;
+    [loop] while (true) {
+      if (!((i < 4))) { break; }
+      i = (i + 1);
+      {
+        InnerS tint_symbol_1[8] = s1.a1;
+        tint_symbol_1[uniforms[0].x] = v;
+        s1.a1 = tint_symbol_1;
+      }
+    }
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl
new file mode 100644
index 0000000..d9dd6b2
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl
@@ -0,0 +1,22 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  var i: i32 = 0;
+  for (s1.a1[uniforms.i] = v; i < 4; i = i + 1) {
+  }
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.hlsl
new file mode 100644
index 0000000..78f5452
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.hlsl
@@ -0,0 +1,27 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  int i = 0;
+  {
+    {
+      InnerS tint_symbol_1[8] = s1.a1;
+      tint_symbol_1[uniforms[0].x] = v;
+      s1.a1 = tint_symbol_1;
+    }
+    [loop] for(; (i < 4); i = (i + 1)) {
+    }
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl
new file mode 100644
index 0000000..9d569e3
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl
@@ -0,0 +1,31 @@
+struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a2 : array<InnerS, 8>;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+var<private> nextIndex : u32;
+fn getNextIndex() -> u32 {
+  nextIndex = nextIndex + 1u;
+  return nextIndex;
+}
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s : OuterS;
+  s.a1[getNextIndex()].a2[uniforms.j] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.hlsl
new file mode 100644
index 0000000..eff5fb2
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct InnerS {
+  int v;
+};
+struct S1 {
+  InnerS a2[8];
+};
+struct OuterS {
+  S1 a1[8];
+};
+
+static uint nextIndex = 0u;
+
+uint getNextIndex() {
+  nextIndex = (nextIndex + 1u);
+  return nextIndex;
+}
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s = (OuterS)0;
+  {
+    S1 tint_symbol_1[8] = s.a1;
+    const uint tint_symbol_2_save = getNextIndex();
+    InnerS tint_symbol_3[8] = tint_symbol_1[tint_symbol_2_save].a2;
+    tint_symbol_3[uniforms[0].y] = v;
+    tint_symbol_1[tint_symbol_2_save].a2 = tint_symbol_3;
+    s.a1 = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl
new file mode 100644
index 0000000..2268109
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl
@@ -0,0 +1,21 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.a1[uniforms.i] = v;
+  //s1.a1[0] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.hlsl
new file mode 100644
index 0000000..15ddcb2
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.hlsl
@@ -0,0 +1,22 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  {
+    InnerS tint_symbol_1[8] = s1.a1;
+    tint_symbol_1[uniforms[0].x] = v;
+    s1.a1 = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl
new file mode 100644
index 0000000..2f0e920
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl
@@ -0,0 +1,21 @@
+struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<array<InnerS, 8>, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.a1[uniforms.i][uniforms.j] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.hlsl
new file mode 100644
index 0000000..6ebca2e
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.hlsl
@@ -0,0 +1,22 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8][8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  {
+    InnerS tint_symbol_1[8][8] = s1.a1;
+    tint_symbol_1[uniforms[0].x][uniforms[0].y] = v;
+    s1.a1 = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl
new file mode 100644
index 0000000..2dfdfc8
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl
@@ -0,0 +1,24 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  s2 : InnerS;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.a1[uniforms.i].s2 = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.hlsl
new file mode 100644
index 0000000..24cee3d
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.hlsl
@@ -0,0 +1,25 @@
+struct InnerS {
+  int v;
+};
+struct S1 {
+  InnerS s2;
+};
+struct OuterS {
+  S1 a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  {
+    S1 tint_symbol_1[8] = s1.a1;
+    tint_symbol_1[uniforms[0].x].s2 = v;
+    s1.a1 = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl
new file mode 100644
index 0000000..c8d97e5
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl
@@ -0,0 +1,25 @@
+struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a2 : array<InnerS, 8>;
+};
+
+struct OuterS {
+  a1 : array<S1, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s : OuterS;
+  s.a1[uniforms.i].a2[uniforms.j] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.hlsl
new file mode 100644
index 0000000..f411372
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+struct InnerS {
+  int v;
+};
+struct S1 {
+  InnerS a2[8];
+};
+struct OuterS {
+  S1 a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s = (OuterS)0;
+  {
+    S1 tint_symbol_1[8] = s.a1;
+    const uint tint_symbol_2_save = uniforms[0].x;
+    InnerS tint_symbol_3[8] = tint_symbol_1[tint_symbol_2_save].a2;
+    tint_symbol_3[uniforms[0].y] = v;
+    tint_symbol_1[tint_symbol_2_save].a2 = tint_symbol_3;
+    s.a1 = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl
new file mode 100644
index 0000000..99ad0f0
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl
@@ -0,0 +1,20 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+[[binding(0), group(0)]] var<storage, read_write> s1 : OuterS;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  s1.a1[uniforms.i] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.hlsl
new file mode 100644
index 0000000..4ae0605
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.hlsl
@@ -0,0 +1,19 @@
+struct InnerS {
+  int v;
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+RWByteAddressBuffer s1 : register(u0, space0);
+
+void tint_symbol_1(RWByteAddressBuffer buffer, uint offset, InnerS value) {
+  buffer.Store((offset + 0u), asuint(value.v));
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  tint_symbol_1(s1, (4u * uniforms[0].x), v);
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl
new file mode 100644
index 0000000..0d40e81
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl
@@ -0,0 +1,25 @@
+struct Uniforms {
+  i : u32;
+  j : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a2 : array<InnerS, 8>;
+};
+
+struct OuterS {
+  a1 : array<S1>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+[[binding(0), group(0)]] var<storage, read_write> s : OuterS;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  s.a1[uniforms.i].a2[uniforms.j] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.hlsl
new file mode 100644
index 0000000..222fd91
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.hlsl
@@ -0,0 +1,19 @@
+struct InnerS {
+  int v;
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+RWByteAddressBuffer s : register(u0, space0);
+
+void tint_symbol_1(RWByteAddressBuffer buffer, uint offset, InnerS value) {
+  buffer.Store((offset + 0u), asuint(value.v));
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  tint_symbol_1(s, ((32u * uniforms[0].x) + (4u * uniforms[0].y)), v);
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl
new file mode 100644
index 0000000..3c67742
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl
@@ -0,0 +1,16 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct OuterS {
+  m1 : mat2x4<f32>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var s1 : OuterS;
+  s1.m1[uniforms.i] = vec4<f32>(1.0);
+  s1.m1[uniforms.i][uniforms.i] = 1.0;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.hlsl
new file mode 100644
index 0000000..819665d
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+void set_vector_float2x4(inout float2x4 mat, int col, float4 val) {
+  switch (col) {
+    case 0: mat[0] = val; break;
+    case 1: mat[1] = val; break;
+  }
+}
+
+void set_scalar_float2x4(inout float2x4 mat, int col, int row, float val) {
+  switch (col) {
+    case 0:
+      mat[0] = (row.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : mat[0];
+      break;
+    case 1:
+      mat[1] = (row.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : mat[1];
+      break;
+  }
+}
+
+struct OuterS {
+  float2x4 m1;
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  OuterS s1 = (OuterS)0;
+  set_vector_float2x4(s1.m1, uniforms[0].x, float4((1.0f).xxxx));
+  set_scalar_float2x4(s1.m1, uniforms[0].x, uniforms[0].x, 1.0f);
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl
new file mode 100644
index 0000000..1fcd397
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl
@@ -0,0 +1,22 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+  a2 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.a1[uniforms.i] = v;
+  s1.a2[uniforms.i] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.hlsl
new file mode 100644
index 0000000..aa6d6bc
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8];
+  InnerS a2[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  {
+    InnerS tint_symbol_1[8] = s1.a1;
+    tint_symbol_1[uniforms[0].x] = v;
+    s1.a1 = tint_symbol_1;
+  }
+  {
+    InnerS tint_symbol_3[8] = s1.a2;
+    tint_symbol_3[uniforms[0].x] = v;
+    s1.a2 = tint_symbol_3;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl
new file mode 100644
index 0000000..bff1418
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl
@@ -0,0 +1,24 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct S1 {
+  a : array<InnerS, 8>;
+};
+
+struct OuterS {
+  s2 : S1;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  s1.s2.a[uniforms.i] = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.hlsl
new file mode 100644
index 0000000..47f844c
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.hlsl
@@ -0,0 +1,25 @@
+struct InnerS {
+  int v;
+};
+struct S1 {
+  InnerS a[8];
+};
+struct OuterS {
+  S1 s2;
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  {
+    InnerS tint_symbol_1[8] = s1.s2.a;
+    tint_symbol_1[uniforms[0].x] = v;
+    s1.s2.a = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl
new file mode 100644
index 0000000..578124f
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl
@@ -0,0 +1,15 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct OuterS {
+  v1 : vec3<f32>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var s1 : OuterS;
+  s1.v1[uniforms.i] = 1.0;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.hlsl
new file mode 100644
index 0000000..dc3f415
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.hlsl
@@ -0,0 +1,18 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+struct OuterS {
+  float3 v1;
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  OuterS s1 = (OuterS)0;
+  set_float3(s1.v1, uniforms[0].x, 1.0f);
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl
new file mode 100644
index 0000000..c8b46c5
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl
@@ -0,0 +1,21 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct OuterS {
+  a1 : array<u32, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+fn f(i: u32) -> u32 {
+  return i + 1u;
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var s1 : OuterS;
+  var v : vec3<f32>;
+  v[s1.a1[uniforms.i]] = 1.0;
+  v[f(s1.a1[uniforms.i])] = 1.0;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.hlsl
new file mode 100644
index 0000000..a3509f9
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+struct OuterS {
+  uint a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+uint f(uint i) {
+  return (i + 1u);
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  OuterS s1 = (OuterS)0;
+  float3 v = float3(0.0f, 0.0f, 0.0f);
+  set_float3(v, s1.a1[uniforms[0].x], 1.0f);
+  set_float3(v, f(s1.a1[uniforms[0].x]), 1.0f);
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl
new file mode 100644
index 0000000..b44dcfa
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl
@@ -0,0 +1,21 @@
+struct Uniforms {
+  i : u32;
+};
+
+struct InnerS {
+  v : i32;
+};
+
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var v : InnerS;
+  var s1 : OuterS;
+  let p = &(s1.a1[uniforms.i]);
+  *p = v;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.hlsl
new file mode 100644
index 0000000..8cedd87
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.hlsl
@@ -0,0 +1,23 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+[numthreads(1, 1, 1)]
+void main() {
+  InnerS v = (InnerS)0;
+  OuterS s1 = (OuterS)0;
+  const uint p_save = uniforms[0].x;
+  {
+    InnerS tint_symbol_1[8] = s1.a1;
+    tint_symbol_1[p_save] = v;
+    s1.a1 = tint_symbol_1;
+  }
+  return;
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl
new file mode 100644
index 0000000..2391e14
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl
@@ -0,0 +1,21 @@
+struct Uniforms {
+  i : u32;
+};
+struct InnerS {
+  v : i32;
+};
+struct OuterS {
+  a1 : array<InnerS, 8>;
+};
+[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+
+fn f(p : ptr<function, OuterS>) {
+  var v : InnerS;
+  (*p).a1[uniforms.i] = v;
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn main() {
+  var s1 : OuterS;
+  f(&s1);
+}
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.hlsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.hlsl
new file mode 100644
index 0000000..bdaae4d
--- /dev/null
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+struct InnerS {
+  int v;
+};
+struct OuterS {
+  InnerS a1[8];
+};
+
+cbuffer cbuffer_uniforms : register(b4, space1) {
+  uint4 uniforms[1];
+};
+
+void f(inout OuterS p) {
+  InnerS v = (InnerS)0;
+  {
+    InnerS tint_symbol_1[8] = p.a1;
+    tint_symbol_1[uniforms[0].x] = v;
+    p.a1 = tint_symbol_1;
+  }
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  OuterS s1 = (OuterS)0;
+  f(s1);
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.hlsl
deleted file mode 100644
index ff5204b..0000000
--- a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.hlsl
+++ /dev/null
@@ -1,165 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_30 : register(b0, space0) {
-  uint4 x_30[1];
-};
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_92 = i;
-  const int x_94 = obj.numbers[x_92];
-  temp = x_94;
-  const int x_95 = i;
-  const int x_96 = j;
-  const int x_98 = obj.numbers[x_96];
-  obj.numbers[x_95] = x_98;
-  const int x_100 = j;
-  obj.numbers[x_100] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_104 = h;
-  const int x_106 = obj.numbers[x_104];
-  pivot = x_106;
-  const int x_107 = l;
-  i_1 = (x_107 - 1);
-  const int x_109 = l;
-  j_1 = x_109;
-  [loop] while (true) {
-    const int x_114 = j_1;
-    const int x_115 = h;
-    if ((x_114 <= (x_115 - 1))) {
-    } else {
-      break;
-    }
-    const int x_121 = obj.numbers[j_1];
-    if ((x_121 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_135 = h;
-  param_3 = x_135;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_141 = (top + 1);
-  top = x_141;
-  stack[x_141] = l_1;
-  const int x_145 = (top + 1);
-  top = x_145;
-  stack[x_145] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_155 = top;
-    top = (x_155 - 1);
-    const int x_158 = stack[x_155];
-    h_1 = x_158;
-    const int x_159 = top;
-    top = (x_159 - 1);
-    const int x_162 = stack[x_159];
-    l_1 = x_162;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_165 = performPartition_i1_i1_(param_4, param_5);
-    p = x_165;
-    if (((p - 1) > l_1)) {
-      const int x_173 = (top + 1);
-      top = x_173;
-      stack[x_173] = l_1;
-      const int x_177 = (top + 1);
-      top = x_177;
-      stack[x_177] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_188 = (top + 1);
-      top = x_188;
-      stack[x_188] = (p + 1);
-      const int x_193 = (top + 1);
-      top = x_193;
-      stack[x_193] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_71 = i_2;
-      const int x_74 = obj.numbers[i_2];
-      const int x_77 = obj.numbers[i_2];
-      obj.numbers[x_71] = (x_74 * x_77);
-    }
-  }
-  quicksort_();
-  const int x_84 = obj.numbers[0];
-  const int x_86 = obj.numbers[4];
-  if ((x_84 < x_86)) {
-    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = float4(0.0f, 1.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_1 = {x_GLF_color};
-  return tint_symbol_1;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x00000246B5D89100(124,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x00000246B5D89100(123,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.hlsl
deleted file mode 100644
index e0e6c28..0000000
--- a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.hlsl
+++ /dev/null
@@ -1,165 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_30 : register(b0, space0) {
-  uint4 x_30[1];
-};
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_92 = i;
-  const int x_94 = obj.numbers[x_92];
-  temp = x_94;
-  const int x_95 = i;
-  const int x_96 = j;
-  const int x_98 = obj.numbers[x_96];
-  obj.numbers[x_95] = x_98;
-  const int x_100 = j;
-  obj.numbers[x_100] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_104 = h;
-  const int x_106 = obj.numbers[x_104];
-  pivot = x_106;
-  const int x_107 = l;
-  i_1 = (x_107 - 1);
-  const int x_109 = l;
-  j_1 = x_109;
-  [loop] while (true) {
-    const int x_114 = j_1;
-    const int x_115 = h;
-    if ((x_114 <= (x_115 - 1))) {
-    } else {
-      break;
-    }
-    const int x_121 = obj.numbers[j_1];
-    if ((x_121 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_135 = h;
-  param_3 = x_135;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_141 = (top + 1);
-  top = x_141;
-  stack[x_141] = l_1;
-  const int x_145 = (top + 1);
-  top = x_145;
-  stack[x_145] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_155 = top;
-    top = (x_155 - 1);
-    const int x_158 = stack[x_155];
-    h_1 = x_158;
-    const int x_159 = top;
-    top = (x_159 - 1);
-    const int x_162 = stack[x_159];
-    l_1 = x_162;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_165 = performPartition_i1_i1_(param_4, param_5);
-    p = x_165;
-    if (((p - 1) > l_1)) {
-      const int x_173 = (top + 1);
-      top = x_173;
-      stack[x_173] = l_1;
-      const int x_177 = (top + 1);
-      top = x_177;
-      stack[x_177] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_188 = (top + 1);
-      top = x_188;
-      stack[x_188] = (p + 1);
-      const int x_193 = (top + 1);
-      top = x_193;
-      stack[x_193] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_71 = i_2;
-      const int x_74 = obj.numbers[i_2];
-      const int x_77 = obj.numbers[i_2];
-      obj.numbers[x_71] = (x_74 * x_77);
-    }
-  }
-  quicksort_();
-  const int x_84 = obj.numbers[0];
-  const int x_86 = obj.numbers[4];
-  if ((x_84 < x_86)) {
-    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = float4(0.0f, 1.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_1 = {x_GLF_color};
-  return tint_symbol_1;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001BEDA24CD50(124,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001BEDA24CD50(123,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.hlsl
index 206ce4b..9de3ba3 100755
--- a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.hlsl
index cc278fa..139e7dc 100755
--- a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.hlsl
deleted file mode 100644
index be9d33f..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-SKIP: FAILED
-
-struct Array {
-  int values[2];
-};
-
-cbuffer cbuffer_x_7 : register(b0, space0) {
-  uint4 x_7[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
-  Array a = (Array)0;
-  Array b = (Array)0;
-  float one = 0.0f;
-  const int x_10 = asint(x_7[0].x);
-  a.values[x_10] = 1;
-  b = a;
-  one = 0.0f;
-  const int x_11 = asint(x_7[0].x);
-  const int x_12 = b.values[x_11];
-  if ((x_12 == 1)) {
-    one = 1.0f;
-  }
-  x_GLF_color = float4(one, 0.0f, 0.0f, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_2 = {x_GLF_color};
-  return tint_symbol_2;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x0000026DA3D26220(15,3-16): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.hlsl
deleted file mode 100644
index db056c7..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-SKIP: FAILED
-
-struct Array {
-  int values[2];
-};
-
-cbuffer cbuffer_x_7 : register(b0, space0) {
-  uint4 x_7[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
-  Array a = (Array)0;
-  Array b = (Array)0;
-  float one = 0.0f;
-  const int x_10 = asint(x_7[0].x);
-  a.values[x_10] = 1;
-  b = a;
-  one = 0.0f;
-  const int x_11 = asint(x_7[0].x);
-  const int x_12 = b.values[x_11];
-  if ((x_12 == 1)) {
-    one = 1.0f;
-  }
-  x_GLF_color = float4(one, 0.0f, 0.0f, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_2 = {x_GLF_color};
-  return tint_symbol_2;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x0000024C52B7BDB0(15,3-16): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.hlsl
index 281f92d..fbd491a 100755
--- a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.hlsl
index a4a3eae..8eaa7c8 100755
--- a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.hlsl
deleted file mode 100644
index f9ef66b..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.hlsl
+++ /dev/null
@@ -1,94 +0,0 @@
-SKIP: FAILED
-
-struct S {
-  float numbers[3];
-};
-
-cbuffer cbuffer_x_7 : register(b1, space0) {
-  uint4 x_7[5];
-};
-cbuffer cbuffer_x_9 : register(b2, space0) {
-  uint4 x_9[1];
-};
-cbuffer cbuffer_x_12 : register(b3, space0) {
-  uint4 x_12[1];
-};
-cbuffer cbuffer_x_15 : register(b0, space0) {
-  uint4 x_15[2];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
-  S obj = (S)0;
-  float a = 0.0f;
-  float2 x_49 = float2(0.0f, 0.0f);
-  float b = 0.0f;
-  const float x_51 = asfloat(x_7[3].x);
-  const float x_53 = asfloat(x_7[2].x);
-  const float x_55 = asfloat(x_7[4].x);
-  const float tint_symbol_6[3] = {x_51, x_53, x_55};
-  const S tint_symbol_7 = {tint_symbol_6};
-  obj = tint_symbol_7;
-  const float x_59 = asfloat(x_9[0].x);
-  const uint scalar_offset = ((16u * uint(0))) / 4;
-  const float x_62 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
-  obj.numbers[int(x_59)] = x_62;
-  const float x_65 = asfloat(x_9[0].x);
-  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
-  const float x_67 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
-  if ((x_65 > x_67)) {
-    const float2 x_73 = asfloat(x_9[0].xy);
-    x_49 = x_73;
-  } else {
-    const float2 x_75 = asfloat(x_12[0].xy);
-    x_49 = x_75;
-  }
-  const float x_77 = x_49.y;
-  a = x_77;
-  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
-  const float x_79 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
-  const float x_80 = a;
-  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
-  const int x_82 = asint(x_15[scalar_offset_3 / 4][scalar_offset_3 % 4]);
-  const float x_84 = obj.numbers[x_82];
-  b = lerp(x_79, x_80, x_84);
-  const float x_86 = b;
-  const float x_88 = asfloat(x_7[2].x);
-  const float x_91 = asfloat(x_7[1].x);
-  if ((distance(x_86, x_88) < x_91)) {
-    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
-    const int x_97 = asint(x_15[scalar_offset_4 / 4][scalar_offset_4 % 4]);
-    const int x_100 = asint(x_15[1].x);
-    const int x_103 = asint(x_15[1].x);
-    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
-    const int x_106 = asint(x_15[scalar_offset_5 / 4][scalar_offset_5 % 4]);
-    x_GLF_color = float4(float(x_97), float(x_100), float(x_103), float(x_106));
-  } else {
-    const int x_110 = asint(x_15[1].x);
-    const float x_111 = float(x_110);
-    x_GLF_color = float4(x_111, x_111, x_111, x_111);
-  }
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_8 = {x_GLF_color};
-  return tint_symbol_8;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x0000018BDF85D170(33,3-24): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.hlsl
deleted file mode 100644
index 1457ead..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.hlsl
+++ /dev/null
@@ -1,94 +0,0 @@
-SKIP: FAILED
-
-struct S {
-  float numbers[3];
-};
-
-cbuffer cbuffer_x_7 : register(b1, space0) {
-  uint4 x_7[5];
-};
-cbuffer cbuffer_x_9 : register(b2, space0) {
-  uint4 x_9[1];
-};
-cbuffer cbuffer_x_12 : register(b3, space0) {
-  uint4 x_12[1];
-};
-cbuffer cbuffer_x_15 : register(b0, space0) {
-  uint4 x_15[2];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
-  S obj = (S)0;
-  float a = 0.0f;
-  float2 x_49 = float2(0.0f, 0.0f);
-  float b = 0.0f;
-  const float x_51 = asfloat(x_7[3].x);
-  const float x_53 = asfloat(x_7[2].x);
-  const float x_55 = asfloat(x_7[4].x);
-  const float tint_symbol_6[3] = {x_51, x_53, x_55};
-  const S tint_symbol_7 = {tint_symbol_6};
-  obj = tint_symbol_7;
-  const float x_59 = asfloat(x_9[0].x);
-  const uint scalar_offset = ((16u * uint(0))) / 4;
-  const float x_62 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
-  obj.numbers[int(x_59)] = x_62;
-  const float x_65 = asfloat(x_9[0].x);
-  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
-  const float x_67 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
-  if ((x_65 > x_67)) {
-    const float2 x_73 = asfloat(x_9[0].xy);
-    x_49 = x_73;
-  } else {
-    const float2 x_75 = asfloat(x_12[0].xy);
-    x_49 = x_75;
-  }
-  const float x_77 = x_49.y;
-  a = x_77;
-  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
-  const float x_79 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
-  const float x_80 = a;
-  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
-  const int x_82 = asint(x_15[scalar_offset_3 / 4][scalar_offset_3 % 4]);
-  const float x_84 = obj.numbers[x_82];
-  b = lerp(x_79, x_80, x_84);
-  const float x_86 = b;
-  const float x_88 = asfloat(x_7[2].x);
-  const float x_91 = asfloat(x_7[1].x);
-  if ((distance(x_86, x_88) < x_91)) {
-    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
-    const int x_97 = asint(x_15[scalar_offset_4 / 4][scalar_offset_4 % 4]);
-    const int x_100 = asint(x_15[1].x);
-    const int x_103 = asint(x_15[1].x);
-    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
-    const int x_106 = asint(x_15[scalar_offset_5 / 4][scalar_offset_5 % 4]);
-    x_GLF_color = float4(float(x_97), float(x_100), float(x_103), float(x_106));
-  } else {
-    const int x_110 = asint(x_15[1].x);
-    const float x_111 = float(x_110);
-    x_GLF_color = float4(x_111, x_111, x_111, x_111);
-  }
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_8 = {x_GLF_color};
-  return tint_symbol_8;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x00000172CC1515F0(33,3-24): error X3500: array reference cannot be used as an l-value; not natively addressable
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.hlsl
index 7d32166..4317cbe 100755
--- a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.hlsl
index c6eed98..4f9ecd6 100755
--- a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.hlsl
index d1579f5..232826e 100755
--- a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.hlsl
index e99e9c1..52d72d6 100755
--- a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.hlsl
deleted file mode 100644
index 3b9109c..0000000
--- a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-SKIP: FAILED
-
-struct BinarySearchObject {
-  int prime_numbers[10];
-};
-
-cbuffer cbuffer_x_8 : register(b0, space0) {
-  uint4 x_8[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-int binarySearch_struct_BinarySearchObject_i1_10_1_(inout BinarySearchObject obj) {
-  int m = 0;
-  [loop] while (true) {
-    const float x_91 = asfloat(x_8[0].x);
-    if ((x_91 > 1.0f)) {
-    } else {
-      break;
-    }
-    const float x_95 = asfloat(x_8[0].x);
-    m = int(x_95);
-    const int x_15 = obj.prime_numbers[m];
-    if ((x_15 == 1)) {
-      return 1;
-    }
-  }
-  return 1;
-}
-
-void main_1() {
-  int i = 0;
-  BinarySearchObject obj_1 = (BinarySearchObject)0;
-  BinarySearchObject param = (BinarySearchObject)0;
-  i = 0;
-  {
-    [loop] for(; (i < 10); i = (i + 1)) {
-      if ((i != 3)) {
-        const int x_18 = i;
-        const float x_67 = asfloat(x_8[0].x);
-        if (((x_18 - int(x_67)) == 4)) {
-          obj_1.prime_numbers[i] = 11;
-        } else {
-          if ((i == 6)) {
-            obj_1.prime_numbers[i] = 17;
-          }
-          continue;
-        }
-      }
-      [loop] while (true) {
-        {
-          const float x_82 = asfloat(x_8[0].y);
-          if ((0.0f > x_82)) {
-          } else {
-            break;
-          }
-        }
-      }
-    }
-  }
-  param = obj_1;
-  const int x_26 = binarySearch_struct_BinarySearchObject_i1_10_1_(param);
-  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_2 = {x_GLF_color};
-  return tint_symbol_2;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x0000016C5E617FA0(47,14-25): warning X3557: loop doesn't seem to do anything, consider removing [loop]
-C:\src\tint\test\Shader@0x0000016C5E617FA0(47,14-25): warning X3551: infinite loop detected - loop writes no values
-C:\src\tint\test\Shader@0x0000016C5E617FA0(47,14-25): warning X3557: loop doesn't seem to do anything, consider removing [loop]
-C:\src\tint\test\Shader@0x0000016C5E617FA0(47,14-25): warning X3551: infinite loop detected - loop writes no values
-C:\src\tint\test\Shader@0x0000016C5E617FA0(47,14-25): warning X3557: loop doesn't seem to do anything, consider removing [loop]
-C:\src\tint\test\Shader@0x0000016C5E617FA0(47,14-25): warning X3551: infinite loop detected - loop writes no values
-C:\src\tint\test\Shader@0x0000016C5E617FA0(39,11-32): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x0000016C5E617FA0(34,12-39): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.hlsl
deleted file mode 100644
index 3c9719c..0000000
--- a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-SKIP: FAILED
-
-struct BinarySearchObject {
-  int prime_numbers[10];
-};
-
-cbuffer cbuffer_x_8 : register(b0, space0) {
-  uint4 x_8[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-int binarySearch_struct_BinarySearchObject_i1_10_1_(inout BinarySearchObject obj) {
-  int m = 0;
-  [loop] while (true) {
-    const float x_91 = asfloat(x_8[0].x);
-    if ((x_91 > 1.0f)) {
-    } else {
-      break;
-    }
-    const float x_95 = asfloat(x_8[0].x);
-    m = int(x_95);
-    const int x_15 = obj.prime_numbers[m];
-    if ((x_15 == 1)) {
-      return 1;
-    }
-  }
-  return 1;
-}
-
-void main_1() {
-  int i = 0;
-  BinarySearchObject obj_1 = (BinarySearchObject)0;
-  BinarySearchObject param = (BinarySearchObject)0;
-  i = 0;
-  {
-    [loop] for(; (i < 10); i = (i + 1)) {
-      if ((i != 3)) {
-        const int x_18 = i;
-        const float x_67 = asfloat(x_8[0].x);
-        if (((x_18 - int(x_67)) == 4)) {
-          obj_1.prime_numbers[i] = 11;
-        } else {
-          if ((i == 6)) {
-            obj_1.prime_numbers[i] = 17;
-          }
-          continue;
-        }
-      }
-      [loop] while (true) {
-        {
-          const float x_82 = asfloat(x_8[0].y);
-          if ((0.0f > x_82)) {
-          } else {
-            break;
-          }
-        }
-      }
-    }
-  }
-  param = obj_1;
-  const int x_26 = binarySearch_struct_BinarySearchObject_i1_10_1_(param);
-  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner() {
-  main_1();
-  const main_out tint_symbol_2 = {x_GLF_color};
-  return tint_symbol_2;
-}
-
-tint_symbol main() {
-  const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x0000022E4AE186A0(47,14-25): warning X3557: loop doesn't seem to do anything, consider removing [loop]
-C:\src\tint\test\Shader@0x0000022E4AE186A0(47,14-25): warning X3551: infinite loop detected - loop writes no values
-C:\src\tint\test\Shader@0x0000022E4AE186A0(47,14-25): warning X3557: loop doesn't seem to do anything, consider removing [loop]
-C:\src\tint\test\Shader@0x0000022E4AE186A0(47,14-25): warning X3551: infinite loop detected - loop writes no values
-C:\src\tint\test\Shader@0x0000022E4AE186A0(47,14-25): warning X3557: loop doesn't seem to do anything, consider removing [loop]
-C:\src\tint\test\Shader@0x0000022E4AE186A0(47,14-25): warning X3551: infinite loop detected - loop writes no values
-C:\src\tint\test\Shader@0x0000022E4AE186A0(39,11-32): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x0000022E4AE186A0(34,12-39): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.hlsl
index 9c26cbb..7dc5ef7 100755
--- a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.hlsl
@@ -115,3 +115,5 @@
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
+Internal compiler error: access violation. Attempted to read from address 0x0000000000000048
+
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.hlsl
index 9c26cbb..7dc5ef7 100755
--- a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.hlsl
@@ -115,3 +115,5 @@
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
+Internal compiler error: access violation. Attempted to read from address 0x0000000000000048
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.hlsl
deleted file mode 100644
index cd7206e..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.hlsl
+++ /dev/null
@@ -1,224 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_32 : register(b0, space0) {
-  uint4 x_32[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_225 = i;
-  const int x_227 = obj.numbers[x_225];
-  temp = x_227;
-  const int x_228 = i;
-  const int x_229 = j;
-  const int x_231 = obj.numbers[x_229];
-  obj.numbers[x_228] = x_231;
-  const int x_233 = j;
-  obj.numbers[x_233] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_237 = h;
-  const int x_239 = obj.numbers[x_237];
-  pivot = x_239;
-  const int x_240 = l;
-  i_1 = (x_240 - 1);
-  const int x_242 = l;
-  j_1 = x_242;
-  [loop] while (true) {
-    const int x_247 = j_1;
-    const int x_248 = h;
-    if ((x_247 <= (x_248 - 1))) {
-    } else {
-      break;
-    }
-    const int x_254 = obj.numbers[j_1];
-    if ((x_254 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  i_1 = (i_1 + 1);
-  param_2 = i_1;
-  const int x_269 = h;
-  param_3 = x_269;
-  swap_i1_i1_(param_2, param_3);
-  return i_1;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_274 = (top + 1);
-  top = x_274;
-  stack[x_274] = l_1;
-  const int x_278 = (top + 1);
-  top = x_278;
-  stack[x_278] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_288 = top;
-    top = (x_288 - 1);
-    const int x_291 = stack[x_288];
-    h_1 = x_291;
-    const int x_292 = top;
-    top = (x_292 - 1);
-    const int x_295 = stack[x_292];
-    l_1 = x_295;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_298 = performPartition_i1_i1_(param_4, param_5);
-    p = x_298;
-    if (((p - 1) > l_1)) {
-      const int x_306 = (top + 1);
-      top = x_306;
-      stack[x_306] = l_1;
-      const int x_310 = (top + 1);
-      top = x_310;
-      stack[x_310] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_321 = (top + 1);
-      top = x_321;
-      stack[x_321] = (p + 1);
-      const int x_326 = (top + 1);
-      top = x_326;
-      stack[x_326] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_92 = i_2;
-      const int x_95 = obj.numbers[i_2];
-      const int x_98 = obj.numbers[i_2];
-      obj.numbers[x_92] = (x_95 * x_98);
-    }
-  }
-  quicksort_();
-  const float4 x_104 = gl_FragCoord;
-  const float2 x_107 = asfloat(x_32[0].xy);
-  uv = (float2(x_104.x, x_104.y) / x_107);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_110 = obj.numbers[0];
-  const float x_113 = color.x;
-  color.x = (x_113 + float(x_110));
-  const float x_117 = uv.x;
-  if ((x_117 > 0.25f)) {
-    const int x_122 = obj.numbers[1];
-    const float x_125 = color.x;
-    color.x = (x_125 + float(x_122));
-  }
-  const float x_129 = uv.x;
-  if ((x_129 > 0.5f)) {
-    const int x_134 = obj.numbers[2];
-    const float x_137 = color.y;
-    color.y = (x_137 + float(x_134));
-  }
-  const float x_141 = uv.x;
-  if ((x_141 > 0.75f)) {
-    const int x_146 = obj.numbers[3];
-    const float x_149 = color.z;
-    color.z = (x_149 + float(x_146));
-  }
-  const int x_153 = obj.numbers[4];
-  const float x_156 = color.y;
-  color.y = (x_156 + float(x_153));
-  const float x_160 = uv.y;
-  if ((x_160 > 0.25f)) {
-    const int x_165 = obj.numbers[5];
-    const float x_168 = color.x;
-    color.x = (x_168 + float(x_165));
-  }
-  const float x_172 = uv.y;
-  if ((x_172 > 0.5f)) {
-    const int x_177 = obj.numbers[6];
-    const float x_180 = color.y;
-    color.y = (x_180 + float(x_177));
-  }
-  const float x_184 = uv.y;
-  if ((x_184 > 0.75f)) {
-    const int x_189 = obj.numbers[7];
-    const float x_192 = color.z;
-    color.z = (x_192 + float(x_189));
-  }
-  const int x_196 = obj.numbers[8];
-  const float x_199 = color.z;
-  color.z = (x_199 + float(x_196));
-  const float x_203 = uv.x;
-  const float x_205 = uv.y;
-  if ((abs((x_203 - x_205)) < 0.25f)) {
-    const int x_212 = obj.numbers[9];
-    const float x_215 = color.x;
-    color.x = (x_215 + float(x_212));
-  }
-  const float3 x_219 = normalize(color);
-  x_GLF_color = float4(x_219.x, x_219.y, x_219.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
-  float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001609F0E92A0(128,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001609F0E92A0(127,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.hlsl
deleted file mode 100644
index 0f29d11..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.hlsl
+++ /dev/null
@@ -1,224 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_32 : register(b0, space0) {
-  uint4 x_32[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_225 = i;
-  const int x_227 = obj.numbers[x_225];
-  temp = x_227;
-  const int x_228 = i;
-  const int x_229 = j;
-  const int x_231 = obj.numbers[x_229];
-  obj.numbers[x_228] = x_231;
-  const int x_233 = j;
-  obj.numbers[x_233] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_237 = h;
-  const int x_239 = obj.numbers[x_237];
-  pivot = x_239;
-  const int x_240 = l;
-  i_1 = (x_240 - 1);
-  const int x_242 = l;
-  j_1 = x_242;
-  [loop] while (true) {
-    const int x_247 = j_1;
-    const int x_248 = h;
-    if ((x_247 <= (x_248 - 1))) {
-    } else {
-      break;
-    }
-    const int x_254 = obj.numbers[j_1];
-    if ((x_254 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  i_1 = (i_1 + 1);
-  param_2 = i_1;
-  const int x_269 = h;
-  param_3 = x_269;
-  swap_i1_i1_(param_2, param_3);
-  return i_1;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_274 = (top + 1);
-  top = x_274;
-  stack[x_274] = l_1;
-  const int x_278 = (top + 1);
-  top = x_278;
-  stack[x_278] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_288 = top;
-    top = (x_288 - 1);
-    const int x_291 = stack[x_288];
-    h_1 = x_291;
-    const int x_292 = top;
-    top = (x_292 - 1);
-    const int x_295 = stack[x_292];
-    l_1 = x_295;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_298 = performPartition_i1_i1_(param_4, param_5);
-    p = x_298;
-    if (((p - 1) > l_1)) {
-      const int x_306 = (top + 1);
-      top = x_306;
-      stack[x_306] = l_1;
-      const int x_310 = (top + 1);
-      top = x_310;
-      stack[x_310] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_321 = (top + 1);
-      top = x_321;
-      stack[x_321] = (p + 1);
-      const int x_326 = (top + 1);
-      top = x_326;
-      stack[x_326] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_92 = i_2;
-      const int x_95 = obj.numbers[i_2];
-      const int x_98 = obj.numbers[i_2];
-      obj.numbers[x_92] = (x_95 * x_98);
-    }
-  }
-  quicksort_();
-  const float4 x_104 = gl_FragCoord;
-  const float2 x_107 = asfloat(x_32[0].xy);
-  uv = (float2(x_104.x, x_104.y) / x_107);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_110 = obj.numbers[0];
-  const float x_113 = color.x;
-  color.x = (x_113 + float(x_110));
-  const float x_117 = uv.x;
-  if ((x_117 > 0.25f)) {
-    const int x_122 = obj.numbers[1];
-    const float x_125 = color.x;
-    color.x = (x_125 + float(x_122));
-  }
-  const float x_129 = uv.x;
-  if ((x_129 > 0.5f)) {
-    const int x_134 = obj.numbers[2];
-    const float x_137 = color.y;
-    color.y = (x_137 + float(x_134));
-  }
-  const float x_141 = uv.x;
-  if ((x_141 > 0.75f)) {
-    const int x_146 = obj.numbers[3];
-    const float x_149 = color.z;
-    color.z = (x_149 + float(x_146));
-  }
-  const int x_153 = obj.numbers[4];
-  const float x_156 = color.y;
-  color.y = (x_156 + float(x_153));
-  const float x_160 = uv.y;
-  if ((x_160 > 0.25f)) {
-    const int x_165 = obj.numbers[5];
-    const float x_168 = color.x;
-    color.x = (x_168 + float(x_165));
-  }
-  const float x_172 = uv.y;
-  if ((x_172 > 0.5f)) {
-    const int x_177 = obj.numbers[6];
-    const float x_180 = color.y;
-    color.y = (x_180 + float(x_177));
-  }
-  const float x_184 = uv.y;
-  if ((x_184 > 0.75f)) {
-    const int x_189 = obj.numbers[7];
-    const float x_192 = color.z;
-    color.z = (x_192 + float(x_189));
-  }
-  const int x_196 = obj.numbers[8];
-  const float x_199 = color.z;
-  color.z = (x_199 + float(x_196));
-  const float x_203 = uv.x;
-  const float x_205 = uv.y;
-  if ((abs((x_203 - x_205)) < 0.25f)) {
-    const int x_212 = obj.numbers[9];
-    const float x_215 = color.x;
-    color.x = (x_215 + float(x_212));
-  }
-  const float3 x_219 = normalize(color);
-  x_GLF_color = float4(x_219.x, x_219.y, x_219.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
-  float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x00000219A1C1C120(128,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x00000219A1C1C120(127,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.hlsl
deleted file mode 100644
index fb3266e..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.hlsl
+++ /dev/null
@@ -1,224 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_32 : register(b0, space0) {
-  uint4 x_32[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j, float3x3 x_228) {
-  int temp = 0;
-  const int x_230 = i;
-  const int x_232 = obj.numbers[x_230];
-  temp = x_232;
-  const int x_233 = i;
-  const int x_234 = j;
-  const int x_236 = obj.numbers[x_234];
-  obj.numbers[x_233] = x_236;
-  const int x_238 = j;
-  obj.numbers[x_238] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_242 = h;
-  const int x_244 = obj.numbers[x_242];
-  pivot = x_244;
-  const int x_245 = l;
-  i_1 = (x_245 - 1);
-  const int x_247 = l;
-  j_1 = x_247;
-  [loop] while (true) {
-    const int x_252 = j_1;
-    const int x_253 = h;
-    if ((x_252 <= (x_253 - 1))) {
-    } else {
-      break;
-    }
-    const int x_259 = obj.numbers[j_1];
-    if ((x_259 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1, float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f)));
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  i_1 = (i_1 + 1);
-  param_2 = i_1;
-  const int x_274 = h;
-  param_3 = x_274;
-  swap_i1_i1_(param_2, param_3, float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f)));
-  return i_1;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_279 = (top + 1);
-  top = x_279;
-  stack[x_279] = l_1;
-  const int x_283 = (top + 1);
-  top = x_283;
-  stack[x_283] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_293 = top;
-    top = (x_293 - 1);
-    const int x_296 = stack[x_293];
-    h_1 = x_296;
-    const int x_297 = top;
-    top = (x_297 - 1);
-    const int x_300 = stack[x_297];
-    l_1 = x_300;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_303 = performPartition_i1_i1_(param_4, param_5);
-    p = x_303;
-    if (((p - 1) > l_1)) {
-      const int x_311 = (top + 1);
-      top = x_311;
-      stack[x_311] = l_1;
-      const int x_315 = (top + 1);
-      top = x_315;
-      stack[x_315] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_326 = (top + 1);
-      top = x_326;
-      stack[x_326] = (p + 1);
-      const int x_331 = (top + 1);
-      top = x_331;
-      stack[x_331] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_96 = i_2;
-      const int x_99 = obj.numbers[i_2];
-      const int x_102 = obj.numbers[i_2];
-      obj.numbers[x_96] = (x_99 * x_102);
-    }
-  }
-  quicksort_();
-  const float4 x_108 = gl_FragCoord;
-  const float2 x_111 = asfloat(x_32[0].xy);
-  uv = (float2(x_108.x, x_108.y) / x_111);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_114 = obj.numbers[0];
-  const float x_117 = color.x;
-  color.x = (x_117 + float(x_114));
-  const float x_121 = uv.x;
-  if ((x_121 > 0.25f)) {
-    const int x_126 = obj.numbers[1];
-    const float x_129 = color.x;
-    color.x = (x_129 + float(x_126));
-  }
-  const float x_133 = uv.x;
-  if ((x_133 > 0.5f)) {
-    const int x_138 = obj.numbers[2];
-    const float x_141 = color.y;
-    color.y = (x_141 + float(x_138));
-  }
-  const float x_145 = uv.x;
-  if ((x_145 > 0.75f)) {
-    const int x_150 = obj.numbers[3];
-    const float x_153 = color.z;
-    color.z = (x_153 + float(x_150));
-  }
-  const int x_157 = obj.numbers[4];
-  const float x_160 = color.y;
-  color.y = (x_160 + float(x_157));
-  const float x_164 = uv.y;
-  if ((x_164 > 0.25f)) {
-    const int x_169 = obj.numbers[5];
-    const float x_172 = color.x;
-    color.x = (x_172 + float(x_169));
-  }
-  const float x_176 = uv.y;
-  if ((x_176 > 0.5f)) {
-    const int x_181 = obj.numbers[6];
-    const float x_184 = color.y;
-    color.y = (x_184 + float(x_181));
-  }
-  const float x_188 = uv.y;
-  if ((x_188 > 0.75f)) {
-    const int x_193 = obj.numbers[7];
-    const float x_196 = color.z;
-    color.z = (x_196 + float(x_193));
-  }
-  const int x_200 = obj.numbers[8];
-  const float x_203 = color.z;
-  color.z = (x_203 + float(x_200));
-  const float x_207 = uv.x;
-  const float x_209 = uv.y;
-  if ((abs((x_207 - x_209)) < 0.25f)) {
-    const int x_216 = obj.numbers[9];
-    const float x_219 = color.x;
-    color.x = (x_219 + float(x_216));
-  }
-  const float3 x_223 = normalize(color);
-  x_GLF_color = float4(x_223.x, x_223.y, x_223.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
-  float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x0000029339D00EC0(128,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x0000029339D00EC0(127,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.hlsl
deleted file mode 100644
index f785669..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.hlsl
+++ /dev/null
@@ -1,224 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_32 : register(b0, space0) {
-  uint4 x_32[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j, float3x3 x_228) {
-  int temp = 0;
-  const int x_230 = i;
-  const int x_232 = obj.numbers[x_230];
-  temp = x_232;
-  const int x_233 = i;
-  const int x_234 = j;
-  const int x_236 = obj.numbers[x_234];
-  obj.numbers[x_233] = x_236;
-  const int x_238 = j;
-  obj.numbers[x_238] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_242 = h;
-  const int x_244 = obj.numbers[x_242];
-  pivot = x_244;
-  const int x_245 = l;
-  i_1 = (x_245 - 1);
-  const int x_247 = l;
-  j_1 = x_247;
-  [loop] while (true) {
-    const int x_252 = j_1;
-    const int x_253 = h;
-    if ((x_252 <= (x_253 - 1))) {
-    } else {
-      break;
-    }
-    const int x_259 = obj.numbers[j_1];
-    if ((x_259 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1, float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f)));
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  i_1 = (i_1 + 1);
-  param_2 = i_1;
-  const int x_274 = h;
-  param_3 = x_274;
-  swap_i1_i1_(param_2, param_3, float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f)));
-  return i_1;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_279 = (top + 1);
-  top = x_279;
-  stack[x_279] = l_1;
-  const int x_283 = (top + 1);
-  top = x_283;
-  stack[x_283] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_293 = top;
-    top = (x_293 - 1);
-    const int x_296 = stack[x_293];
-    h_1 = x_296;
-    const int x_297 = top;
-    top = (x_297 - 1);
-    const int x_300 = stack[x_297];
-    l_1 = x_300;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_303 = performPartition_i1_i1_(param_4, param_5);
-    p = x_303;
-    if (((p - 1) > l_1)) {
-      const int x_311 = (top + 1);
-      top = x_311;
-      stack[x_311] = l_1;
-      const int x_315 = (top + 1);
-      top = x_315;
-      stack[x_315] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_326 = (top + 1);
-      top = x_326;
-      stack[x_326] = (p + 1);
-      const int x_331 = (top + 1);
-      top = x_331;
-      stack[x_331] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_96 = i_2;
-      const int x_99 = obj.numbers[i_2];
-      const int x_102 = obj.numbers[i_2];
-      obj.numbers[x_96] = (x_99 * x_102);
-    }
-  }
-  quicksort_();
-  const float4 x_108 = gl_FragCoord;
-  const float2 x_111 = asfloat(x_32[0].xy);
-  uv = (float2(x_108.x, x_108.y) / x_111);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_114 = obj.numbers[0];
-  const float x_117 = color.x;
-  color.x = (x_117 + float(x_114));
-  const float x_121 = uv.x;
-  if ((x_121 > 0.25f)) {
-    const int x_126 = obj.numbers[1];
-    const float x_129 = color.x;
-    color.x = (x_129 + float(x_126));
-  }
-  const float x_133 = uv.x;
-  if ((x_133 > 0.5f)) {
-    const int x_138 = obj.numbers[2];
-    const float x_141 = color.y;
-    color.y = (x_141 + float(x_138));
-  }
-  const float x_145 = uv.x;
-  if ((x_145 > 0.75f)) {
-    const int x_150 = obj.numbers[3];
-    const float x_153 = color.z;
-    color.z = (x_153 + float(x_150));
-  }
-  const int x_157 = obj.numbers[4];
-  const float x_160 = color.y;
-  color.y = (x_160 + float(x_157));
-  const float x_164 = uv.y;
-  if ((x_164 > 0.25f)) {
-    const int x_169 = obj.numbers[5];
-    const float x_172 = color.x;
-    color.x = (x_172 + float(x_169));
-  }
-  const float x_176 = uv.y;
-  if ((x_176 > 0.5f)) {
-    const int x_181 = obj.numbers[6];
-    const float x_184 = color.y;
-    color.y = (x_184 + float(x_181));
-  }
-  const float x_188 = uv.y;
-  if ((x_188 > 0.75f)) {
-    const int x_193 = obj.numbers[7];
-    const float x_196 = color.z;
-    color.z = (x_196 + float(x_193));
-  }
-  const int x_200 = obj.numbers[8];
-  const float x_203 = color.z;
-  color.z = (x_203 + float(x_200));
-  const float x_207 = uv.x;
-  const float x_209 = uv.y;
-  if ((abs((x_207 - x_209)) < 0.25f)) {
-    const int x_216 = obj.numbers[9];
-    const float x_219 = color.x;
-    color.x = (x_219 + float(x_216));
-  }
-  const float3 x_223 = normalize(color);
-  x_GLF_color = float4(x_223.x, x_223.y, x_223.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
-  float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001F0DC256BE0(128,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001F0DC256BE0(127,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.hlsl
index 4a7eed3..1626926 100755
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.hlsl
index 0b0dee9..711e15f 100755
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.hlsl
index f2edc08..b1c2176 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.hlsl
@@ -92,7 +92,11 @@
 int identity_i1_(inout int a) {
   const int x_202 = a;
   const int x_203 = a;
-  obj.numbers[x_202] = x_203;
+  {
+    int tint_symbol_1[10] = obj.numbers;
+    tint_symbol_1[x_202] = x_203;
+    obj.numbers = tint_symbol_1;
+  }
   const int x_206 = obj.numbers[2];
   return x_206;
 }
@@ -264,22 +268,22 @@
 struct main_out {
   float4 x_GLF_color_1;
 };
-struct tint_symbol {
+struct tint_symbol_2 {
   float4 x_GLF_color_1 : SV_Target0;
 };
 
 main_out main_inner() {
   main_1();
-  const main_out tint_symbol_2 = {x_GLF_color};
-  return tint_symbol_2;
+  const main_out tint_symbol_4 = {x_GLF_color};
+  return tint_symbol_4;
 }
 
-tint_symbol main() {
+tint_symbol_2 main() {
   const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
+  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
-C:\src\tint\test\Shader@0x000002117DDC0DA0(32,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
-C:\src\tint\test\Shader@0x000002117DDC0DA0(203,12-42): error X3531: can't unroll loops marked with loop attribute
+C:\src\tint\test\Shader@0x0000019568397DE0(32,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
+internal error: compilation aborted unexpectedly
 
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.hlsl
index cb24484..b75d352 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.hlsl
@@ -1,14 +1,14 @@
 SKIP: FAILED
 
-vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl:71:7 warning: code is unreachable
+vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl:70:7 warning: code is unreachable
       return;
       ^^^^^^
 
-vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl:94:7 warning: code is unreachable
+vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl:93:7 warning: code is unreachable
       return;
       ^^^^^^
 
-vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl:96:5 warning: code is unreachable
+vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl:95:5 warning: code is unreachable
     return;
     ^^^^^^
 
@@ -101,7 +101,11 @@
 int identity_i1_(inout int a) {
   const int x_202 = a;
   const int x_203 = a;
-  obj.numbers[x_202] = x_203;
+  {
+    int tint_symbol_1[10] = obj.numbers;
+    tint_symbol_1[x_202] = x_203;
+    obj.numbers = tint_symbol_1;
+  }
   const int x_206 = obj.numbers[2];
   return x_206;
 }
@@ -273,22 +277,22 @@
 struct main_out {
   float4 x_GLF_color_1;
 };
-struct tint_symbol {
+struct tint_symbol_2 {
   float4 x_GLF_color_1 : SV_Target0;
 };
 
 main_out main_inner() {
   main_1();
-  const main_out tint_symbol_2 = {x_GLF_color};
-  return tint_symbol_2;
+  const main_out tint_symbol_4 = {x_GLF_color};
+  return tint_symbol_4;
 }
 
-tint_symbol main() {
+tint_symbol_2 main() {
   const main_out inner_result = main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
+  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
-C:\src\tint\test\Shader@0x00000219E1FE81C0(32,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
-C:\src\tint\test\Shader@0x00000219E1FE81C0(203,12-42): error X3531: can't unroll loops marked with loop attribute
+C:\src\tint\test\Shader@0x0000016D6EA06C40(32,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
+internal error: compilation aborted unexpectedly
 
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.hlsl
deleted file mode 100644
index 49e137d..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.hlsl
+++ /dev/null
@@ -1,242 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_230 = i;
-  const int x_232 = obj.numbers[x_230];
-  temp = x_232;
-  const int x_233 = i;
-  const int x_234 = j;
-  const int x_236 = obj.numbers[x_234];
-  obj.numbers[x_233] = x_236;
-  const int x_238 = j;
-  obj.numbers[x_238] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_242 = h;
-  const int x_244 = obj.numbers[x_242];
-  pivot = x_244;
-  const int x_245 = l;
-  i_1 = (x_245 - 1);
-  const int x_247 = l;
-  j_1 = x_247;
-  [loop] while (true) {
-    const int x_252 = j_1;
-    const int x_253 = h;
-    if ((x_252 <= (x_253 - 1))) {
-    } else {
-      break;
-    }
-    const int x_259 = obj.numbers[j_1];
-    if ((x_259 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  i_1 = (i_1 + 1);
-  param_2 = i_1;
-  const int x_274 = h;
-  param_3 = x_274;
-  swap_i1_i1_(param_2, param_3);
-  return i_1;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int int_a = 0;
-  int x_278 = 0;
-  int x_279 = 0;
-  int clamp_a = 0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_281 = (top + 1);
-  top = x_281;
-  stack[x_281] = l_1;
-  const float x_285 = gl_FragCoord.y;
-  if ((x_285 >= 0.0f)) {
-    const int x_290 = h_1;
-    if (false) {
-      x_279 = 1;
-    } else {
-      x_279 = (h_1 << asuint(0));
-    }
-    x_278 = (x_290 | x_279);
-  } else {
-    x_278 = 1;
-  }
-  int_a = x_278;
-  clamp_a = clamp(h_1, h_1, int_a);
-  const int x_304 = (top + 1);
-  top = x_304;
-  stack[x_304] = (clamp_a / 1);
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_315 = top;
-    top = (x_315 - 1);
-    const int x_318 = stack[x_315];
-    h_1 = x_318;
-    const int x_319 = top;
-    top = (x_319 - 1);
-    const int x_322 = stack[x_319];
-    l_1 = x_322;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_325 = performPartition_i1_i1_(param_4, param_5);
-    p = x_325;
-    if (((p - 1) > l_1)) {
-      const int x_333 = (top + 1);
-      top = x_333;
-      stack[x_333] = l_1;
-      const int x_337 = (top + 1);
-      top = x_337;
-      stack[x_337] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_348 = (top + 1);
-      top = x_348;
-      stack[x_348] = (p + 1);
-      const int x_353 = (top + 1);
-      top = x_353;
-      stack[x_353] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_97 = i_2;
-      const int x_100 = obj.numbers[i_2];
-      const int x_103 = obj.numbers[i_2];
-      obj.numbers[x_97] = (x_100 * x_103);
-    }
-  }
-  quicksort_();
-  const float4 x_109 = gl_FragCoord;
-  const float2 x_112 = asfloat(x_34[0].xy);
-  uv = (float2(x_109.x, x_109.y) / x_112);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_115 = obj.numbers[0];
-  const float x_118 = color.x;
-  color.x = (x_118 + float(x_115));
-  const float x_122 = uv.x;
-  if ((x_122 > 0.25f)) {
-    const int x_127 = obj.numbers[1];
-    const float x_130 = color.x;
-    color.x = (x_130 + float(x_127));
-  }
-  const float x_134 = uv.x;
-  if ((x_134 > 0.5f)) {
-    const int x_139 = obj.numbers[2];
-    const float x_142 = color.y;
-    color.y = (x_142 + float(x_139));
-  }
-  const float x_146 = uv.x;
-  if ((x_146 > 0.75f)) {
-    const int x_151 = obj.numbers[3];
-    const float x_154 = color.z;
-    color.z = (x_154 + float(x_151));
-  }
-  const int x_158 = obj.numbers[4];
-  const float x_161 = color.y;
-  color.y = (x_161 + float(x_158));
-  const float x_165 = uv.y;
-  if ((x_165 > 0.25f)) {
-    const int x_170 = obj.numbers[5];
-    const float x_173 = color.x;
-    color.x = (x_173 + float(x_170));
-  }
-  const float x_177 = uv.y;
-  if ((x_177 > 0.5f)) {
-    const int x_182 = obj.numbers[6];
-    const float x_185 = color.y;
-    color.y = (x_185 + float(x_182));
-  }
-  const float x_189 = uv.y;
-  if ((x_189 > 0.75f)) {
-    const int x_194 = obj.numbers[7];
-    const float x_197 = color.z;
-    color.z = (x_197 + float(x_194));
-  }
-  const int x_201 = obj.numbers[8];
-  const float x_204 = color.z;
-  color.z = (x_204 + float(x_201));
-  const float x_208 = uv.x;
-  const float x_210 = uv.y;
-  if ((abs((x_208 - x_210)) < 0.25f)) {
-    const int x_217 = obj.numbers[9];
-    const float x_220 = color.x;
-    color.x = (x_220 + float(x_217));
-  }
-  const float3 x_224 = normalize(color);
-  x_GLF_color = float4(x_224.x, x_224.y, x_224.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
-  float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x00000240D57880E0(146,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x00000240D57880E0(145,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.hlsl
deleted file mode 100644
index 013dea4..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.hlsl
+++ /dev/null
@@ -1,242 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_230 = i;
-  const int x_232 = obj.numbers[x_230];
-  temp = x_232;
-  const int x_233 = i;
-  const int x_234 = j;
-  const int x_236 = obj.numbers[x_234];
-  obj.numbers[x_233] = x_236;
-  const int x_238 = j;
-  obj.numbers[x_238] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_242 = h;
-  const int x_244 = obj.numbers[x_242];
-  pivot = x_244;
-  const int x_245 = l;
-  i_1 = (x_245 - 1);
-  const int x_247 = l;
-  j_1 = x_247;
-  [loop] while (true) {
-    const int x_252 = j_1;
-    const int x_253 = h;
-    if ((x_252 <= (x_253 - 1))) {
-    } else {
-      break;
-    }
-    const int x_259 = obj.numbers[j_1];
-    if ((x_259 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  i_1 = (i_1 + 1);
-  param_2 = i_1;
-  const int x_274 = h;
-  param_3 = x_274;
-  swap_i1_i1_(param_2, param_3);
-  return i_1;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int int_a = 0;
-  int x_278 = 0;
-  int x_279 = 0;
-  int clamp_a = 0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_281 = (top + 1);
-  top = x_281;
-  stack[x_281] = l_1;
-  const float x_285 = gl_FragCoord.y;
-  if ((x_285 >= 0.0f)) {
-    const int x_290 = h_1;
-    if (false) {
-      x_279 = 1;
-    } else {
-      x_279 = (h_1 << asuint(0));
-    }
-    x_278 = (x_290 | x_279);
-  } else {
-    x_278 = 1;
-  }
-  int_a = x_278;
-  clamp_a = clamp(h_1, h_1, int_a);
-  const int x_304 = (top + 1);
-  top = x_304;
-  stack[x_304] = (clamp_a / 1);
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_315 = top;
-    top = (x_315 - 1);
-    const int x_318 = stack[x_315];
-    h_1 = x_318;
-    const int x_319 = top;
-    top = (x_319 - 1);
-    const int x_322 = stack[x_319];
-    l_1 = x_322;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_325 = performPartition_i1_i1_(param_4, param_5);
-    p = x_325;
-    if (((p - 1) > l_1)) {
-      const int x_333 = (top + 1);
-      top = x_333;
-      stack[x_333] = l_1;
-      const int x_337 = (top + 1);
-      top = x_337;
-      stack[x_337] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_348 = (top + 1);
-      top = x_348;
-      stack[x_348] = (p + 1);
-      const int x_353 = (top + 1);
-      top = x_353;
-      stack[x_353] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_97 = i_2;
-      const int x_100 = obj.numbers[i_2];
-      const int x_103 = obj.numbers[i_2];
-      obj.numbers[x_97] = (x_100 * x_103);
-    }
-  }
-  quicksort_();
-  const float4 x_109 = gl_FragCoord;
-  const float2 x_112 = asfloat(x_34[0].xy);
-  uv = (float2(x_109.x, x_109.y) / x_112);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_115 = obj.numbers[0];
-  const float x_118 = color.x;
-  color.x = (x_118 + float(x_115));
-  const float x_122 = uv.x;
-  if ((x_122 > 0.25f)) {
-    const int x_127 = obj.numbers[1];
-    const float x_130 = color.x;
-    color.x = (x_130 + float(x_127));
-  }
-  const float x_134 = uv.x;
-  if ((x_134 > 0.5f)) {
-    const int x_139 = obj.numbers[2];
-    const float x_142 = color.y;
-    color.y = (x_142 + float(x_139));
-  }
-  const float x_146 = uv.x;
-  if ((x_146 > 0.75f)) {
-    const int x_151 = obj.numbers[3];
-    const float x_154 = color.z;
-    color.z = (x_154 + float(x_151));
-  }
-  const int x_158 = obj.numbers[4];
-  const float x_161 = color.y;
-  color.y = (x_161 + float(x_158));
-  const float x_165 = uv.y;
-  if ((x_165 > 0.25f)) {
-    const int x_170 = obj.numbers[5];
-    const float x_173 = color.x;
-    color.x = (x_173 + float(x_170));
-  }
-  const float x_177 = uv.y;
-  if ((x_177 > 0.5f)) {
-    const int x_182 = obj.numbers[6];
-    const float x_185 = color.y;
-    color.y = (x_185 + float(x_182));
-  }
-  const float x_189 = uv.y;
-  if ((x_189 > 0.75f)) {
-    const int x_194 = obj.numbers[7];
-    const float x_197 = color.z;
-    color.z = (x_197 + float(x_194));
-  }
-  const int x_201 = obj.numbers[8];
-  const float x_204 = color.z;
-  color.z = (x_204 + float(x_201));
-  const float x_208 = uv.x;
-  const float x_210 = uv.y;
-  if ((abs((x_208 - x_210)) < 0.25f)) {
-    const int x_217 = obj.numbers[9];
-    const float x_220 = color.x;
-    color.x = (x_220 + float(x_217));
-  }
-  const float3 x_224 = normalize(color);
-  x_GLF_color = float4(x_224.x, x_224.y, x_224.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
-  float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
-  float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
-  gl_FragCoord = gl_FragCoord_param;
-  main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001EE8601E080(146,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001EE8601E080(145,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.hlsl
deleted file mode 100644
index 68cfc73..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.hlsl
+++ /dev/null
@@ -1,230 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_239 = i;
-  const int x_241 = obj.numbers[x_239];
-  temp = x_241;
-  const int x_242 = i;
-  const int x_243 = j;
-  const int x_245 = obj.numbers[x_243];
-  obj.numbers[x_242] = x_245;
-  const int x_247 = j;
-  obj.numbers[x_247] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_251 = h;
-  const int x_253 = obj.numbers[x_251];
-  pivot = x_253;
-  const int x_254 = l;
-  i_1 = (x_254 - 1);
-  const int x_256 = l;
-  j_1 = x_256;
-  [loop] while (true) {
-    const int x_261 = j_1;
-    const int x_262 = h;
-    if ((x_261 <= (x_262 - 1))) {
-    } else {
-      break;
-    }
-    const int x_268 = obj.numbers[j_1];
-    if ((x_268 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_282 = h;
-  param_3 = x_282;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_288 = (top + 1);
-  top = x_288;
-  stack[x_288] = l_1;
-  const int x_292 = (top + 1);
-  top = x_292;
-  stack[x_292] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_302 = top;
-    top = (x_302 - 1);
-    const int x_305 = stack[x_302];
-    h_1 = x_305;
-    const int x_306 = top;
-    top = (x_306 - 1);
-    const int x_309 = stack[x_306];
-    l_1 = x_309;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_312 = performPartition_i1_i1_(param_4, param_5);
-    p = x_312;
-    if (((p - 1) > l_1)) {
-      const int x_320 = (top + 1);
-      top = x_320;
-      stack[x_320] = l_1;
-      const int x_324 = (top + 1);
-      top = x_324;
-      stack[x_324] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_335 = (top + 1);
-      top = x_335;
-      stack[x_335] = (p + 1);
-      const int x_340 = (top + 1);
-      top = x_340;
-      stack[x_340] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_104 = i_2;
-      const int x_107 = obj.numbers[i_2];
-      const int x_110 = obj.numbers[i_2];
-      obj.numbers[x_104] = (x_107 * x_110);
-    }
-  }
-  quicksort_();
-  const float4 x_116 = x_GLF_FragCoord;
-  const float2 x_119 = asfloat(x_34[0].xy);
-  uv = (float2(x_116.x, x_116.y) / x_119);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_122 = obj.numbers[0];
-  const float x_125 = color.x;
-  color.x = (x_125 + float(x_122));
-  const float x_129 = uv.x;
-  if ((x_129 > 0.25f)) {
-    const int x_134 = obj.numbers[1];
-    const float x_137 = color.x;
-    color.x = (x_137 + float(x_134));
-  }
-  const float x_141 = uv.x;
-  if ((x_141 > 0.5f)) {
-    const int x_146 = obj.numbers[2];
-    const float x_149 = color.y;
-    color.y = (x_149 + float(x_146));
-  }
-  const float x_153 = uv.x;
-  if ((x_153 > 0.75f)) {
-    const int x_158 = obj.numbers[3];
-    const float x_161 = color.z;
-    color.z = (x_161 + float(x_158));
-  }
-  const int x_165 = obj.numbers[4];
-  const float x_168 = color.y;
-  color.y = (x_168 + float(x_165));
-  const float x_172 = uv.y;
-  if ((x_172 > 0.25f)) {
-    const int x_177 = obj.numbers[5];
-    const float x_180 = color.x;
-    color.x = (x_180 + float(x_177));
-  }
-  const float x_184 = uv.y;
-  if ((x_184 > 0.5f)) {
-    const int x_189 = obj.numbers[6];
-    const float x_192 = color.y;
-    color.y = (x_192 + float(x_189));
-  }
-  const float x_196 = uv.y;
-  if ((x_196 > 0.75f)) {
-    const int x_201 = obj.numbers[7];
-    const float x_204 = color.z;
-    color.z = (x_204 + float(x_201));
-  }
-  const int x_208 = obj.numbers[8];
-  const float x_211 = color.z;
-  color.z = (x_211 + float(x_208));
-  const float x_215 = uv.x;
-  const float x_217 = uv.y;
-  if ((abs((x_215 - x_217)) < 0.25f)) {
-    const int x_224 = obj.numbers[9];
-    const float x_227 = color.x;
-    color.x = (x_227 + float(x_224));
-  }
-  const float3 x_231 = normalize(color);
-  frag_color = float4(x_231.x, x_231.y, x_231.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_4 = {frag_color, gl_Position};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001E481EDD080(130,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001E481EDD080(129,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.hlsl
deleted file mode 100644
index 21d9cc2..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.hlsl
+++ /dev/null
@@ -1,230 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_239 = i;
-  const int x_241 = obj.numbers[x_239];
-  temp = x_241;
-  const int x_242 = i;
-  const int x_243 = j;
-  const int x_245 = obj.numbers[x_243];
-  obj.numbers[x_242] = x_245;
-  const int x_247 = j;
-  obj.numbers[x_247] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_251 = h;
-  const int x_253 = obj.numbers[x_251];
-  pivot = x_253;
-  const int x_254 = l;
-  i_1 = (x_254 - 1);
-  const int x_256 = l;
-  j_1 = x_256;
-  [loop] while (true) {
-    const int x_261 = j_1;
-    const int x_262 = h;
-    if ((x_261 <= (x_262 - 1))) {
-    } else {
-      break;
-    }
-    const int x_268 = obj.numbers[j_1];
-    if ((x_268 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_282 = h;
-  param_3 = x_282;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_288 = (top + 1);
-  top = x_288;
-  stack[x_288] = l_1;
-  const int x_292 = (top + 1);
-  top = x_292;
-  stack[x_292] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_302 = top;
-    top = (x_302 - 1);
-    const int x_305 = stack[x_302];
-    h_1 = x_305;
-    const int x_306 = top;
-    top = (x_306 - 1);
-    const int x_309 = stack[x_306];
-    l_1 = x_309;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_312 = performPartition_i1_i1_(param_4, param_5);
-    p = x_312;
-    if (((p - 1) > l_1)) {
-      const int x_320 = (top + 1);
-      top = x_320;
-      stack[x_320] = l_1;
-      const int x_324 = (top + 1);
-      top = x_324;
-      stack[x_324] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_335 = (top + 1);
-      top = x_335;
-      stack[x_335] = (p + 1);
-      const int x_340 = (top + 1);
-      top = x_340;
-      stack[x_340] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_104 = i_2;
-      const int x_107 = obj.numbers[i_2];
-      const int x_110 = obj.numbers[i_2];
-      obj.numbers[x_104] = (x_107 * x_110);
-    }
-  }
-  quicksort_();
-  const float4 x_116 = x_GLF_FragCoord;
-  const float2 x_119 = asfloat(x_34[0].xy);
-  uv = (float2(x_116.x, x_116.y) / x_119);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_122 = obj.numbers[0];
-  const float x_125 = color.x;
-  color.x = (x_125 + float(x_122));
-  const float x_129 = uv.x;
-  if ((x_129 > 0.25f)) {
-    const int x_134 = obj.numbers[1];
-    const float x_137 = color.x;
-    color.x = (x_137 + float(x_134));
-  }
-  const float x_141 = uv.x;
-  if ((x_141 > 0.5f)) {
-    const int x_146 = obj.numbers[2];
-    const float x_149 = color.y;
-    color.y = (x_149 + float(x_146));
-  }
-  const float x_153 = uv.x;
-  if ((x_153 > 0.75f)) {
-    const int x_158 = obj.numbers[3];
-    const float x_161 = color.z;
-    color.z = (x_161 + float(x_158));
-  }
-  const int x_165 = obj.numbers[4];
-  const float x_168 = color.y;
-  color.y = (x_168 + float(x_165));
-  const float x_172 = uv.y;
-  if ((x_172 > 0.25f)) {
-    const int x_177 = obj.numbers[5];
-    const float x_180 = color.x;
-    color.x = (x_180 + float(x_177));
-  }
-  const float x_184 = uv.y;
-  if ((x_184 > 0.5f)) {
-    const int x_189 = obj.numbers[6];
-    const float x_192 = color.y;
-    color.y = (x_192 + float(x_189));
-  }
-  const float x_196 = uv.y;
-  if ((x_196 > 0.75f)) {
-    const int x_201 = obj.numbers[7];
-    const float x_204 = color.z;
-    color.z = (x_204 + float(x_201));
-  }
-  const int x_208 = obj.numbers[8];
-  const float x_211 = color.z;
-  color.z = (x_211 + float(x_208));
-  const float x_215 = uv.x;
-  const float x_217 = uv.y;
-  if ((abs((x_215 - x_217)) < 0.25f)) {
-    const int x_224 = obj.numbers[9];
-    const float x_227 = color.x;
-    color.x = (x_227 + float(x_224));
-  }
-  const float3 x_231 = normalize(color);
-  frag_color = float4(x_231.x, x_231.y, x_231.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_4 = {frag_color, gl_Position};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001D05546D140(130,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001D05546D140(129,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.hlsl
deleted file mode 100644
index dd02853..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.hlsl
+++ /dev/null
@@ -1,238 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_33 : register(b0, space0) {
-  uint4 x_33[1];
-};
-cbuffer cbuffer_x_36 : register(b1, space0) {
-  uint4 x_36[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_250 = i;
-  const int x_252 = obj.numbers[x_250];
-  temp = x_252;
-  const int x_253 = i;
-  const int x_254 = j;
-  const int x_256 = obj.numbers[x_254];
-  obj.numbers[x_253] = x_256;
-  const int x_258 = j;
-  obj.numbers[x_258] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_262 = h;
-  const int x_264 = obj.numbers[x_262];
-  pivot = x_264;
-  const int x_265 = l;
-  i_1 = (x_265 - 1);
-  const int x_267 = l;
-  j_1 = x_267;
-  [loop] while (true) {
-    const int x_272 = j_1;
-    const int x_273 = h;
-    if ((x_272 <= (x_273 - 1))) {
-    } else {
-      break;
-    }
-    const int x_279 = obj.numbers[j_1];
-    if ((x_279 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_293 = h;
-  param_3 = x_293;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_299 = (top + 1);
-  top = x_299;
-  stack[x_299] = l_1;
-  const int x_303 = (top + 1);
-  top = x_303;
-  stack[x_303] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_313 = top;
-    top = (x_313 - 1);
-    const int x_316 = stack[x_313];
-    h_1 = x_316;
-    const int x_317 = top;
-    top = (x_317 - 1);
-    const int x_320 = stack[x_317];
-    l_1 = x_320;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_323 = performPartition_i1_i1_(param_4, param_5);
-    p = x_323;
-    if (((p - 1) > l_1)) {
-      const int x_331 = (top + 1);
-      top = x_331;
-      stack[x_331] = l_1;
-      const int x_335 = (top + 1);
-      top = x_335;
-      stack[x_335] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_346 = (top + 1);
-      top = x_346;
-      stack[x_346] = (p + 1);
-      const int x_351 = (top + 1);
-      top = x_351;
-      stack[x_351] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const float x_109 = asfloat(x_33[0].x);
-      const float x_111 = asfloat(x_33[0].y);
-      if ((x_109 > x_111)) {
-        break;
-      }
-      const int x_115 = i_2;
-      const int x_118 = obj.numbers[i_2];
-      const int x_121 = obj.numbers[i_2];
-      obj.numbers[x_115] = (x_118 * x_121);
-    }
-  }
-  quicksort_();
-  const float4 x_127 = x_GLF_FragCoord;
-  const float2 x_130 = asfloat(x_36[0].xy);
-  uv = (float2(x_127.x, x_127.y) / x_130);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_133 = obj.numbers[0];
-  const float x_136 = color.x;
-  color.x = (x_136 + float(x_133));
-  const float x_140 = uv.x;
-  if ((x_140 > 0.25f)) {
-    const int x_145 = obj.numbers[1];
-    const float x_148 = color.x;
-    color.x = (x_148 + float(x_145));
-  }
-  const float x_152 = uv.x;
-  if ((x_152 > 0.5f)) {
-    const int x_157 = obj.numbers[2];
-    const float x_160 = color.y;
-    color.y = (x_160 + float(x_157));
-  }
-  const float x_164 = uv.x;
-  if ((x_164 > 0.75f)) {
-    const int x_169 = obj.numbers[3];
-    const float x_172 = color.z;
-    color.z = (x_172 + float(x_169));
-  }
-  const int x_176 = obj.numbers[4];
-  const float x_179 = color.y;
-  color.y = (x_179 + float(x_176));
-  const float x_183 = uv.y;
-  if ((x_183 > 0.25f)) {
-    const int x_188 = obj.numbers[5];
-    const float x_191 = color.x;
-    color.x = (x_191 + float(x_188));
-  }
-  const float x_195 = uv.y;
-  if ((x_195 > 0.5f)) {
-    const int x_200 = obj.numbers[6];
-    const float x_203 = color.y;
-    color.y = (x_203 + float(x_200));
-  }
-  const float x_207 = uv.y;
-  if ((x_207 > 0.75f)) {
-    const int x_212 = obj.numbers[7];
-    const float x_215 = color.z;
-    color.z = (x_215 + float(x_212));
-  }
-  const int x_219 = obj.numbers[8];
-  const float x_222 = color.z;
-  color.z = (x_222 + float(x_219));
-  const float x_226 = uv.x;
-  const float x_228 = uv.y;
-  if ((abs((x_226 - x_228)) < 0.25f)) {
-    const int x_235 = obj.numbers[9];
-    const float x_238 = color.x;
-    color.x = (x_238 + float(x_235));
-  }
-  const float3 x_242 = normalize(color);
-  frag_color = float4(x_242.x, x_242.y, x_242.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_5 = {frag_color, gl_Position};
-  return tint_symbol_5;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x00000277FFA71560(133,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x00000277FFA71560(132,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.hlsl
deleted file mode 100644
index c0c9cf2..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.hlsl
+++ /dev/null
@@ -1,238 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_33 : register(b0, space0) {
-  uint4 x_33[1];
-};
-cbuffer cbuffer_x_36 : register(b1, space0) {
-  uint4 x_36[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_250 = i;
-  const int x_252 = obj.numbers[x_250];
-  temp = x_252;
-  const int x_253 = i;
-  const int x_254 = j;
-  const int x_256 = obj.numbers[x_254];
-  obj.numbers[x_253] = x_256;
-  const int x_258 = j;
-  obj.numbers[x_258] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_262 = h;
-  const int x_264 = obj.numbers[x_262];
-  pivot = x_264;
-  const int x_265 = l;
-  i_1 = (x_265 - 1);
-  const int x_267 = l;
-  j_1 = x_267;
-  [loop] while (true) {
-    const int x_272 = j_1;
-    const int x_273 = h;
-    if ((x_272 <= (x_273 - 1))) {
-    } else {
-      break;
-    }
-    const int x_279 = obj.numbers[j_1];
-    if ((x_279 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_293 = h;
-  param_3 = x_293;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_299 = (top + 1);
-  top = x_299;
-  stack[x_299] = l_1;
-  const int x_303 = (top + 1);
-  top = x_303;
-  stack[x_303] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_313 = top;
-    top = (x_313 - 1);
-    const int x_316 = stack[x_313];
-    h_1 = x_316;
-    const int x_317 = top;
-    top = (x_317 - 1);
-    const int x_320 = stack[x_317];
-    l_1 = x_320;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_323 = performPartition_i1_i1_(param_4, param_5);
-    p = x_323;
-    if (((p - 1) > l_1)) {
-      const int x_331 = (top + 1);
-      top = x_331;
-      stack[x_331] = l_1;
-      const int x_335 = (top + 1);
-      top = x_335;
-      stack[x_335] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_346 = (top + 1);
-      top = x_346;
-      stack[x_346] = (p + 1);
-      const int x_351 = (top + 1);
-      top = x_351;
-      stack[x_351] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const float x_109 = asfloat(x_33[0].x);
-      const float x_111 = asfloat(x_33[0].y);
-      if ((x_109 > x_111)) {
-        break;
-      }
-      const int x_115 = i_2;
-      const int x_118 = obj.numbers[i_2];
-      const int x_121 = obj.numbers[i_2];
-      obj.numbers[x_115] = (x_118 * x_121);
-    }
-  }
-  quicksort_();
-  const float4 x_127 = x_GLF_FragCoord;
-  const float2 x_130 = asfloat(x_36[0].xy);
-  uv = (float2(x_127.x, x_127.y) / x_130);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_133 = obj.numbers[0];
-  const float x_136 = color.x;
-  color.x = (x_136 + float(x_133));
-  const float x_140 = uv.x;
-  if ((x_140 > 0.25f)) {
-    const int x_145 = obj.numbers[1];
-    const float x_148 = color.x;
-    color.x = (x_148 + float(x_145));
-  }
-  const float x_152 = uv.x;
-  if ((x_152 > 0.5f)) {
-    const int x_157 = obj.numbers[2];
-    const float x_160 = color.y;
-    color.y = (x_160 + float(x_157));
-  }
-  const float x_164 = uv.x;
-  if ((x_164 > 0.75f)) {
-    const int x_169 = obj.numbers[3];
-    const float x_172 = color.z;
-    color.z = (x_172 + float(x_169));
-  }
-  const int x_176 = obj.numbers[4];
-  const float x_179 = color.y;
-  color.y = (x_179 + float(x_176));
-  const float x_183 = uv.y;
-  if ((x_183 > 0.25f)) {
-    const int x_188 = obj.numbers[5];
-    const float x_191 = color.x;
-    color.x = (x_191 + float(x_188));
-  }
-  const float x_195 = uv.y;
-  if ((x_195 > 0.5f)) {
-    const int x_200 = obj.numbers[6];
-    const float x_203 = color.y;
-    color.y = (x_203 + float(x_200));
-  }
-  const float x_207 = uv.y;
-  if ((x_207 > 0.75f)) {
-    const int x_212 = obj.numbers[7];
-    const float x_215 = color.z;
-    color.z = (x_215 + float(x_212));
-  }
-  const int x_219 = obj.numbers[8];
-  const float x_222 = color.z;
-  color.z = (x_222 + float(x_219));
-  const float x_226 = uv.x;
-  const float x_228 = uv.y;
-  if ((abs((x_226 - x_228)) < 0.25f)) {
-    const int x_235 = obj.numbers[9];
-    const float x_238 = color.x;
-    color.x = (x_238 + float(x_235));
-  }
-  const float3 x_242 = normalize(color);
-  frag_color = float4(x_242.x, x_242.y, x_242.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_5 = {frag_color, gl_Position};
-  return tint_symbol_5;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x000001A3B2C08520(133,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001A3B2C08520(132,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.hlsl
deleted file mode 100644
index 9867861..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.hlsl
+++ /dev/null
@@ -1,317 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
-  int x_90 = 0;
-  int x_91 = 0;
-  int x_92 = 0;
-  int x_93 = 0;
-  int x_94 = 0;
-  int x_95 = 0;
-  int x_96 = 0;
-  int x_97 = 0;
-  int x_98 = 0;
-  int x_99 = 0;
-  int x_100 = 0;
-  int x_101 = 0;
-  int x_102 = 0;
-  int x_103[10] = (int[10])0;
-  int x_104 = 0;
-  int x_105 = 0;
-  int x_106 = 0;
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_121 = i_2;
-      const int x_124 = obj.numbers[i_2];
-      const int x_127 = obj.numbers[i_2];
-      obj.numbers[x_121] = (x_124 * x_127);
-    }
-  }
-  x_100 = 0;
-  x_101 = 9;
-  x_102 = -1;
-  const int x_133 = (x_102 + 1);
-  x_102 = x_133;
-  x_103[x_133] = x_100;
-  const int x_137 = (x_102 + 1);
-  x_102 = x_137;
-  x_103[x_137] = x_101;
-  [loop] while (true) {
-    if ((x_102 >= 0)) {
-    } else {
-      break;
-    }
-    const int x_147 = x_102;
-    x_102 = (x_147 - 1);
-    const int x_150 = x_103[x_147];
-    x_101 = x_150;
-    const int x_151 = x_102;
-    x_102 = (x_151 - 1);
-    const int x_154 = x_103[x_151];
-    x_100 = x_154;
-    x_105 = x_100;
-    x_106 = x_101;
-    const int x_159 = obj.numbers[x_106];
-    x_92 = x_159;
-    x_93 = (x_105 - 1);
-    x_94 = x_105;
-    {
-      [loop] for(; (x_94 <= (x_106 - 1)); x_94 = (x_94 + 1)) {
-        const int x_174 = obj.numbers[x_94];
-        if ((x_174 <= x_92)) {
-          x_93 = (x_93 + 1);
-          x_95 = x_93;
-          x_96 = x_94;
-          const int x_185 = obj.numbers[x_95];
-          x_91 = x_185;
-          const int x_186 = x_95;
-          const int x_189 = obj.numbers[x_96];
-          obj.numbers[x_186] = x_189;
-          obj.numbers[x_96] = x_91;
-        }
-      }
-    }
-    x_97 = (x_93 + 1);
-    x_98 = x_106;
-    const int x_201 = obj.numbers[x_97];
-    x_90 = x_201;
-    const int x_202 = x_97;
-    const int x_205 = obj.numbers[x_98];
-    obj.numbers[x_202] = x_205;
-    obj.numbers[x_98] = x_90;
-    x_99 = (x_93 + 1);
-    x_104 = x_99;
-    if (((x_104 - 1) > x_100)) {
-      const int x_220 = (x_102 + 1);
-      x_102 = x_220;
-      x_103[x_220] = x_100;
-      const int x_224 = (x_102 + 1);
-      x_102 = x_224;
-      x_103[x_224] = (x_104 - 1);
-    }
-    if (((x_104 + 1) < x_101)) {
-      const int x_235 = (x_102 + 1);
-      x_102 = x_235;
-      x_103[x_235] = (x_104 + 1);
-      const int x_240 = (x_102 + 1);
-      x_102 = x_240;
-      x_103[x_240] = x_101;
-    }
-  }
-  const float4 x_243 = x_GLF_FragCoord;
-  const float2 x_246 = asfloat(x_34[0].xy);
-  uv = (float2(x_243.x, x_243.y) / x_246);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_249 = obj.numbers[0];
-  const float x_252 = color.x;
-  color.x = (x_252 + float(x_249));
-  const float x_256 = uv.x;
-  if ((x_256 > 0.25f)) {
-    const int x_261 = obj.numbers[1];
-    const float x_264 = color.x;
-    color.x = (x_264 + float(x_261));
-  }
-  const float x_268 = uv.x;
-  if ((x_268 > 0.5f)) {
-    const int x_273 = obj.numbers[2];
-    const float x_276 = color.y;
-    color.y = (x_276 + float(x_273));
-  }
-  const float x_280 = uv.x;
-  if ((x_280 > 0.75f)) {
-    const int x_285 = obj.numbers[3];
-    const float x_288 = color.z;
-    color.z = (x_288 + float(x_285));
-  }
-  const int x_292 = obj.numbers[4];
-  const float x_295 = color.y;
-  color.y = (x_295 + float(x_292));
-  const float x_299 = uv.y;
-  if ((x_299 > 0.25f)) {
-    const int x_304 = obj.numbers[5];
-    const float x_307 = color.x;
-    color.x = (x_307 + float(x_304));
-  }
-  const float x_311 = uv.y;
-  if ((x_311 > 0.5f)) {
-    const int x_316 = obj.numbers[6];
-    const float x_319 = color.y;
-    color.y = (x_319 + float(x_316));
-  }
-  const float x_323 = uv.y;
-  if ((x_323 > 0.75f)) {
-    const int x_328 = obj.numbers[7];
-    const float x_331 = color.z;
-    color.z = (x_331 + float(x_328));
-  }
-  const int x_335 = obj.numbers[8];
-  const float x_338 = color.z;
-  color.z = (x_338 + float(x_335));
-  const float x_342 = uv.x;
-  const float x_344 = uv.y;
-  if ((abs((x_342 - x_344)) < 0.25f)) {
-    const int x_351 = obj.numbers[9];
-    const float x_354 = color.x;
-    color.x = (x_354 + float(x_351));
-  }
-  const float3 x_358 = normalize(color);
-  frag_color = float4(x_358.x, x_358.y, x_358.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_4 = {frag_color, gl_Position};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_366 = i;
-  const int x_368 = obj.numbers[x_366];
-  temp = x_368;
-  const int x_369 = i;
-  const int x_370 = j;
-  const int x_372 = obj.numbers[x_370];
-  obj.numbers[x_369] = x_372;
-  const int x_374 = j;
-  obj.numbers[x_374] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_378 = h;
-  const int x_380 = obj.numbers[x_378];
-  pivot = x_380;
-  const int x_381 = l;
-  i_1 = (x_381 - 1);
-  const int x_383 = l;
-  j_1 = x_383;
-  [loop] while (true) {
-    const int x_388 = j_1;
-    const int x_389 = h;
-    if ((x_388 <= (x_389 - 1))) {
-    } else {
-      break;
-    }
-    const int x_395 = obj.numbers[j_1];
-    if ((x_395 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_409 = h;
-  param_3 = x_409;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_415 = (top + 1);
-  top = x_415;
-  stack[x_415] = l_1;
-  const int x_419 = (top + 1);
-  top = x_419;
-  stack[x_419] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_429 = top;
-    top = (x_429 - 1);
-    const int x_432 = stack[x_429];
-    h_1 = x_432;
-    const int x_433 = top;
-    top = (x_433 - 1);
-    const int x_436 = stack[x_433];
-    l_1 = x_436;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_439 = performPartition_i1_i1_(param_4, param_5);
-    p = x_439;
-    if (((p - 1) > l_1)) {
-      const int x_447 = (top + 1);
-      top = x_447;
-      stack[x_447] = l_1;
-      const int x_451 = (top + 1);
-      top = x_451;
-      stack[x_451] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_462 = (top + 1);
-      top = x_462;
-      stack[x_462] = (p + 1);
-      const int x_467 = (top + 1);
-      top = x_467;
-      stack[x_467] = h_1;
-    }
-  }
-  return;
-}
-C:\src\tint\test\Shader@0x0000028832314060(39,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x0000028832314060(38,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.hlsl
deleted file mode 100644
index 0727d5b..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.hlsl
+++ /dev/null
@@ -1,317 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
-  int x_90 = 0;
-  int x_91 = 0;
-  int x_92 = 0;
-  int x_93 = 0;
-  int x_94 = 0;
-  int x_95 = 0;
-  int x_96 = 0;
-  int x_97 = 0;
-  int x_98 = 0;
-  int x_99 = 0;
-  int x_100 = 0;
-  int x_101 = 0;
-  int x_102 = 0;
-  int x_103[10] = (int[10])0;
-  int x_104 = 0;
-  int x_105 = 0;
-  int x_106 = 0;
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_121 = i_2;
-      const int x_124 = obj.numbers[i_2];
-      const int x_127 = obj.numbers[i_2];
-      obj.numbers[x_121] = (x_124 * x_127);
-    }
-  }
-  x_100 = 0;
-  x_101 = 9;
-  x_102 = -1;
-  const int x_133 = (x_102 + 1);
-  x_102 = x_133;
-  x_103[x_133] = x_100;
-  const int x_137 = (x_102 + 1);
-  x_102 = x_137;
-  x_103[x_137] = x_101;
-  [loop] while (true) {
-    if ((x_102 >= 0)) {
-    } else {
-      break;
-    }
-    const int x_147 = x_102;
-    x_102 = (x_147 - 1);
-    const int x_150 = x_103[x_147];
-    x_101 = x_150;
-    const int x_151 = x_102;
-    x_102 = (x_151 - 1);
-    const int x_154 = x_103[x_151];
-    x_100 = x_154;
-    x_105 = x_100;
-    x_106 = x_101;
-    const int x_159 = obj.numbers[x_106];
-    x_92 = x_159;
-    x_93 = (x_105 - 1);
-    x_94 = x_105;
-    {
-      [loop] for(; (x_94 <= (x_106 - 1)); x_94 = (x_94 + 1)) {
-        const int x_174 = obj.numbers[x_94];
-        if ((x_174 <= x_92)) {
-          x_93 = (x_93 + 1);
-          x_95 = x_93;
-          x_96 = x_94;
-          const int x_185 = obj.numbers[x_95];
-          x_91 = x_185;
-          const int x_186 = x_95;
-          const int x_189 = obj.numbers[x_96];
-          obj.numbers[x_186] = x_189;
-          obj.numbers[x_96] = x_91;
-        }
-      }
-    }
-    x_97 = (x_93 + 1);
-    x_98 = x_106;
-    const int x_201 = obj.numbers[x_97];
-    x_90 = x_201;
-    const int x_202 = x_97;
-    const int x_205 = obj.numbers[x_98];
-    obj.numbers[x_202] = x_205;
-    obj.numbers[x_98] = x_90;
-    x_99 = (x_93 + 1);
-    x_104 = x_99;
-    if (((x_104 - 1) > x_100)) {
-      const int x_220 = (x_102 + 1);
-      x_102 = x_220;
-      x_103[x_220] = x_100;
-      const int x_224 = (x_102 + 1);
-      x_102 = x_224;
-      x_103[x_224] = (x_104 - 1);
-    }
-    if (((x_104 + 1) < x_101)) {
-      const int x_235 = (x_102 + 1);
-      x_102 = x_235;
-      x_103[x_235] = (x_104 + 1);
-      const int x_240 = (x_102 + 1);
-      x_102 = x_240;
-      x_103[x_240] = x_101;
-    }
-  }
-  const float4 x_243 = x_GLF_FragCoord;
-  const float2 x_246 = asfloat(x_34[0].xy);
-  uv = (float2(x_243.x, x_243.y) / x_246);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_249 = obj.numbers[0];
-  const float x_252 = color.x;
-  color.x = (x_252 + float(x_249));
-  const float x_256 = uv.x;
-  if ((x_256 > 0.25f)) {
-    const int x_261 = obj.numbers[1];
-    const float x_264 = color.x;
-    color.x = (x_264 + float(x_261));
-  }
-  const float x_268 = uv.x;
-  if ((x_268 > 0.5f)) {
-    const int x_273 = obj.numbers[2];
-    const float x_276 = color.y;
-    color.y = (x_276 + float(x_273));
-  }
-  const float x_280 = uv.x;
-  if ((x_280 > 0.75f)) {
-    const int x_285 = obj.numbers[3];
-    const float x_288 = color.z;
-    color.z = (x_288 + float(x_285));
-  }
-  const int x_292 = obj.numbers[4];
-  const float x_295 = color.y;
-  color.y = (x_295 + float(x_292));
-  const float x_299 = uv.y;
-  if ((x_299 > 0.25f)) {
-    const int x_304 = obj.numbers[5];
-    const float x_307 = color.x;
-    color.x = (x_307 + float(x_304));
-  }
-  const float x_311 = uv.y;
-  if ((x_311 > 0.5f)) {
-    const int x_316 = obj.numbers[6];
-    const float x_319 = color.y;
-    color.y = (x_319 + float(x_316));
-  }
-  const float x_323 = uv.y;
-  if ((x_323 > 0.75f)) {
-    const int x_328 = obj.numbers[7];
-    const float x_331 = color.z;
-    color.z = (x_331 + float(x_328));
-  }
-  const int x_335 = obj.numbers[8];
-  const float x_338 = color.z;
-  color.z = (x_338 + float(x_335));
-  const float x_342 = uv.x;
-  const float x_344 = uv.y;
-  if ((abs((x_342 - x_344)) < 0.25f)) {
-    const int x_351 = obj.numbers[9];
-    const float x_354 = color.x;
-    color.x = (x_354 + float(x_351));
-  }
-  const float3 x_358 = normalize(color);
-  frag_color = float4(x_358.x, x_358.y, x_358.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_4 = {frag_color, gl_Position};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_366 = i;
-  const int x_368 = obj.numbers[x_366];
-  temp = x_368;
-  const int x_369 = i;
-  const int x_370 = j;
-  const int x_372 = obj.numbers[x_370];
-  obj.numbers[x_369] = x_372;
-  const int x_374 = j;
-  obj.numbers[x_374] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_378 = h;
-  const int x_380 = obj.numbers[x_378];
-  pivot = x_380;
-  const int x_381 = l;
-  i_1 = (x_381 - 1);
-  const int x_383 = l;
-  j_1 = x_383;
-  [loop] while (true) {
-    const int x_388 = j_1;
-    const int x_389 = h;
-    if ((x_388 <= (x_389 - 1))) {
-    } else {
-      break;
-    }
-    const int x_395 = obj.numbers[j_1];
-    if ((x_395 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_409 = h;
-  param_3 = x_409;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_415 = (top + 1);
-  top = x_415;
-  stack[x_415] = l_1;
-  const int x_419 = (top + 1);
-  top = x_419;
-  stack[x_419] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_429 = top;
-    top = (x_429 - 1);
-    const int x_432 = stack[x_429];
-    h_1 = x_432;
-    const int x_433 = top;
-    top = (x_433 - 1);
-    const int x_436 = stack[x_433];
-    l_1 = x_436;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_439 = performPartition_i1_i1_(param_4, param_5);
-    p = x_439;
-    if (((p - 1) > l_1)) {
-      const int x_447 = (top + 1);
-      top = x_447;
-      stack[x_447] = l_1;
-      const int x_451 = (top + 1);
-      top = x_451;
-      stack[x_451] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_462 = (top + 1);
-      top = x_462;
-      stack[x_462] = (p + 1);
-      const int x_467 = (top + 1);
-      top = x_467;
-      stack[x_467] = h_1;
-    }
-  }
-  return;
-}
-C:\src\tint\test\Shader@0x0000028832C83FA0(39,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x0000028832C83FA0(38,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.hlsl
deleted file mode 100644
index cb5a691..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.hlsl
+++ /dev/null
@@ -1,295 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int x_314 = 0;
-  int x_315 = 0;
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_316 = h;
-  const int x_318 = obj.numbers[x_316];
-  pivot = x_318;
-  const int x_319 = l;
-  i_1 = (x_319 - 1);
-  const int x_321 = l;
-  j_1 = x_321;
-  [loop] while (true) {
-    const int x_326 = j_1;
-    const int x_327 = h;
-    if ((x_326 <= (x_327 - 1))) {
-    } else {
-      break;
-    }
-    const int x_333 = obj.numbers[j_1];
-    if ((x_333 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      const int x_344 = obj.numbers[param];
-      x_315 = x_344;
-      const int x_345 = param;
-      const int x_348 = obj.numbers[param_1];
-      obj.numbers[x_345] = x_348;
-      obj.numbers[param_1] = x_315;
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_357 = h;
-  param_3 = x_357;
-  const int x_360 = obj.numbers[param_2];
-  x_314 = x_360;
-  const int x_361 = param_2;
-  const int x_364 = obj.numbers[param_3];
-  obj.numbers[x_361] = x_364;
-  obj.numbers[param_3] = x_314;
-  if (false) {
-  } else {
-    return (i_1 + 1);
-  }
-  return 0;
-}
-
-void main_1() {
-  int x_91 = 0;
-  int x_92 = 0;
-  int x_93 = 0;
-  int x_94[10] = (int[10])0;
-  int x_95 = 0;
-  int x_96 = 0;
-  int x_97 = 0;
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_112 = i_2;
-      const int x_115 = obj.numbers[i_2];
-      const int x_118 = obj.numbers[i_2];
-      obj.numbers[x_112] = (x_115 * x_118);
-    }
-  }
-  x_91 = 0;
-  x_92 = 9;
-  x_93 = -1;
-  const int x_124 = (x_93 + 1);
-  x_93 = x_124;
-  x_94[x_124] = x_91;
-  const int x_128 = (x_93 + 1);
-  x_93 = x_128;
-  x_94[x_128] = x_92;
-  [loop] while (true) {
-    if ((x_93 >= 0)) {
-    } else {
-      break;
-    }
-    const int x_138 = x_93;
-    x_93 = (x_138 - 1);
-    const int x_141 = x_94[x_138];
-    x_92 = x_141;
-    const int x_142 = x_93;
-    x_93 = (x_142 - 1);
-    const int x_145 = x_94[x_142];
-    x_91 = x_145;
-    x_96 = x_91;
-    x_97 = x_92;
-    const int x_148 = performPartition_i1_i1_(x_96, x_97);
-    x_95 = x_148;
-    if (((x_95 - 1) > x_91)) {
-      const int x_156 = (x_93 + 1);
-      x_93 = x_156;
-      x_94[x_156] = x_91;
-      const int x_160 = (x_93 + 1);
-      x_93 = x_160;
-      x_94[x_160] = (x_95 - 1);
-    }
-    if (((x_95 + 1) < x_92)) {
-      const int x_171 = (x_93 + 1);
-      x_93 = x_171;
-      x_94[x_171] = (x_95 + 1);
-      const int x_176 = (x_93 + 1);
-      x_93 = x_176;
-      x_94[x_176] = x_92;
-    }
-  }
-  const float4 x_179 = x_GLF_FragCoord;
-  const float2 x_182 = asfloat(x_34[0].xy);
-  uv = (float2(x_179.x, x_179.y) / x_182);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_185 = obj.numbers[0];
-  const float x_188 = color.x;
-  color.x = (x_188 + float(x_185));
-  const float x_192 = uv.x;
-  if ((x_192 > 0.25f)) {
-    const int x_197 = obj.numbers[1];
-    const float x_200 = color.x;
-    color.x = (x_200 + float(x_197));
-  }
-  const float x_204 = uv.x;
-  if ((x_204 > 0.5f)) {
-    const int x_209 = obj.numbers[2];
-    const float x_212 = color.y;
-    color.y = (x_212 + float(x_209));
-  }
-  const float x_216 = uv.x;
-  if ((x_216 > 0.75f)) {
-    const int x_221 = obj.numbers[3];
-    const float x_224 = color.z;
-    color.z = (x_224 + float(x_221));
-  }
-  const int x_228 = obj.numbers[4];
-  const float x_231 = color.y;
-  color.y = (x_231 + float(x_228));
-  const float x_235 = uv.y;
-  if ((x_235 > 0.25f)) {
-    const int x_240 = obj.numbers[5];
-    const float x_243 = color.x;
-    color.x = (x_243 + float(x_240));
-  }
-  const float x_247 = uv.y;
-  if ((x_247 > 0.5f)) {
-    const int x_252 = obj.numbers[6];
-    const float x_255 = color.y;
-    color.y = (x_255 + float(x_252));
-  }
-  const float x_259 = uv.y;
-  if ((x_259 > 0.75f)) {
-    const int x_264 = obj.numbers[7];
-    const float x_267 = color.z;
-    color.z = (x_267 + float(x_264));
-  }
-  const int x_271 = obj.numbers[8];
-  const float x_274 = color.z;
-  color.z = (x_274 + float(x_271));
-  const float x_278 = uv.x;
-  const float x_280 = uv.y;
-  if ((abs((x_278 - x_280)) < 0.25f)) {
-    const int x_287 = obj.numbers[9];
-    const float x_290 = color.x;
-    color.x = (x_290 + float(x_287));
-  }
-  const float3 x_294 = normalize(color);
-  frag_color = float4(x_294.x, x_294.y, x_294.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_4 = {frag_color, gl_Position};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_302 = i;
-  const int x_304 = obj.numbers[x_302];
-  temp = x_304;
-  const int x_305 = i;
-  const int x_306 = j;
-  const int x_308 = obj.numbers[x_306];
-  obj.numbers[x_305] = x_308;
-  const int x_310 = j;
-  obj.numbers[x_310] = temp;
-  return;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_377 = (top + 1);
-  top = x_377;
-  stack[x_377] = l_1;
-  const int x_381 = (top + 1);
-  top = x_381;
-  stack[x_381] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_391 = top;
-    top = (x_391 - 1);
-    const int x_394 = stack[x_391];
-    h_1 = x_394;
-    const int x_395 = top;
-    top = (x_395 - 1);
-    const int x_398 = stack[x_395];
-    l_1 = x_398;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_401 = performPartition_i1_i1_(param_4, param_5);
-    p = x_401;
-    if (((p - 1) > l_1)) {
-      const int x_409 = (top + 1);
-      top = x_409;
-      stack[x_409] = l_1;
-      const int x_413 = (top + 1);
-      top = x_413;
-      stack[x_413] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_424 = (top + 1);
-      top = x_424;
-      stack[x_424] = (p + 1);
-      const int x_429 = (top + 1);
-      top = x_429;
-      stack[x_429] = h_1;
-    }
-  }
-  return;
-}
-C:\src\tint\test\Shader@0x000002B401B06060(85,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000002B401B06060(84,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.hlsl
deleted file mode 100644
index d7f564d..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.hlsl
+++ /dev/null
@@ -1,295 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b0, space0) {
-  uint4 x_34[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int x_314 = 0;
-  int x_315 = 0;
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_316 = h;
-  const int x_318 = obj.numbers[x_316];
-  pivot = x_318;
-  const int x_319 = l;
-  i_1 = (x_319 - 1);
-  const int x_321 = l;
-  j_1 = x_321;
-  [loop] while (true) {
-    const int x_326 = j_1;
-    const int x_327 = h;
-    if ((x_326 <= (x_327 - 1))) {
-    } else {
-      break;
-    }
-    const int x_333 = obj.numbers[j_1];
-    if ((x_333 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      const int x_344 = obj.numbers[param];
-      x_315 = x_344;
-      const int x_345 = param;
-      const int x_348 = obj.numbers[param_1];
-      obj.numbers[x_345] = x_348;
-      obj.numbers[param_1] = x_315;
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_357 = h;
-  param_3 = x_357;
-  const int x_360 = obj.numbers[param_2];
-  x_314 = x_360;
-  const int x_361 = param_2;
-  const int x_364 = obj.numbers[param_3];
-  obj.numbers[x_361] = x_364;
-  obj.numbers[param_3] = x_314;
-  if (false) {
-  } else {
-    return (i_1 + 1);
-  }
-  return 0;
-}
-
-void main_1() {
-  int x_91 = 0;
-  int x_92 = 0;
-  int x_93 = 0;
-  int x_94[10] = (int[10])0;
-  int x_95 = 0;
-  int x_96 = 0;
-  int x_97 = 0;
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_112 = i_2;
-      const int x_115 = obj.numbers[i_2];
-      const int x_118 = obj.numbers[i_2];
-      obj.numbers[x_112] = (x_115 * x_118);
-    }
-  }
-  x_91 = 0;
-  x_92 = 9;
-  x_93 = -1;
-  const int x_124 = (x_93 + 1);
-  x_93 = x_124;
-  x_94[x_124] = x_91;
-  const int x_128 = (x_93 + 1);
-  x_93 = x_128;
-  x_94[x_128] = x_92;
-  [loop] while (true) {
-    if ((x_93 >= 0)) {
-    } else {
-      break;
-    }
-    const int x_138 = x_93;
-    x_93 = (x_138 - 1);
-    const int x_141 = x_94[x_138];
-    x_92 = x_141;
-    const int x_142 = x_93;
-    x_93 = (x_142 - 1);
-    const int x_145 = x_94[x_142];
-    x_91 = x_145;
-    x_96 = x_91;
-    x_97 = x_92;
-    const int x_148 = performPartition_i1_i1_(x_96, x_97);
-    x_95 = x_148;
-    if (((x_95 - 1) > x_91)) {
-      const int x_156 = (x_93 + 1);
-      x_93 = x_156;
-      x_94[x_156] = x_91;
-      const int x_160 = (x_93 + 1);
-      x_93 = x_160;
-      x_94[x_160] = (x_95 - 1);
-    }
-    if (((x_95 + 1) < x_92)) {
-      const int x_171 = (x_93 + 1);
-      x_93 = x_171;
-      x_94[x_171] = (x_95 + 1);
-      const int x_176 = (x_93 + 1);
-      x_93 = x_176;
-      x_94[x_176] = x_92;
-    }
-  }
-  const float4 x_179 = x_GLF_FragCoord;
-  const float2 x_182 = asfloat(x_34[0].xy);
-  uv = (float2(x_179.x, x_179.y) / x_182);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_185 = obj.numbers[0];
-  const float x_188 = color.x;
-  color.x = (x_188 + float(x_185));
-  const float x_192 = uv.x;
-  if ((x_192 > 0.25f)) {
-    const int x_197 = obj.numbers[1];
-    const float x_200 = color.x;
-    color.x = (x_200 + float(x_197));
-  }
-  const float x_204 = uv.x;
-  if ((x_204 > 0.5f)) {
-    const int x_209 = obj.numbers[2];
-    const float x_212 = color.y;
-    color.y = (x_212 + float(x_209));
-  }
-  const float x_216 = uv.x;
-  if ((x_216 > 0.75f)) {
-    const int x_221 = obj.numbers[3];
-    const float x_224 = color.z;
-    color.z = (x_224 + float(x_221));
-  }
-  const int x_228 = obj.numbers[4];
-  const float x_231 = color.y;
-  color.y = (x_231 + float(x_228));
-  const float x_235 = uv.y;
-  if ((x_235 > 0.25f)) {
-    const int x_240 = obj.numbers[5];
-    const float x_243 = color.x;
-    color.x = (x_243 + float(x_240));
-  }
-  const float x_247 = uv.y;
-  if ((x_247 > 0.5f)) {
-    const int x_252 = obj.numbers[6];
-    const float x_255 = color.y;
-    color.y = (x_255 + float(x_252));
-  }
-  const float x_259 = uv.y;
-  if ((x_259 > 0.75f)) {
-    const int x_264 = obj.numbers[7];
-    const float x_267 = color.z;
-    color.z = (x_267 + float(x_264));
-  }
-  const int x_271 = obj.numbers[8];
-  const float x_274 = color.z;
-  color.z = (x_274 + float(x_271));
-  const float x_278 = uv.x;
-  const float x_280 = uv.y;
-  if ((abs((x_278 - x_280)) < 0.25f)) {
-    const int x_287 = obj.numbers[9];
-    const float x_290 = color.x;
-    color.x = (x_290 + float(x_287));
-  }
-  const float3 x_294 = normalize(color);
-  frag_color = float4(x_294.x, x_294.y, x_294.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_4 = {frag_color, gl_Position};
-  return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_302 = i;
-  const int x_304 = obj.numbers[x_302];
-  temp = x_304;
-  const int x_305 = i;
-  const int x_306 = j;
-  const int x_308 = obj.numbers[x_306];
-  obj.numbers[x_305] = x_308;
-  const int x_310 = j;
-  obj.numbers[x_310] = temp;
-  return;
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_377 = (top + 1);
-  top = x_377;
-  stack[x_377] = l_1;
-  const int x_381 = (top + 1);
-  top = x_381;
-  stack[x_381] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_391 = top;
-    top = (x_391 - 1);
-    const int x_394 = stack[x_391];
-    h_1 = x_394;
-    const int x_395 = top;
-    top = (x_395 - 1);
-    const int x_398 = stack[x_395];
-    l_1 = x_398;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_401 = performPartition_i1_i1_(param_4, param_5);
-    p = x_401;
-    if (((p - 1) > l_1)) {
-      const int x_409 = (top + 1);
-      top = x_409;
-      stack[x_409] = l_1;
-      const int x_413 = (top + 1);
-      top = x_413;
-      stack[x_413] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_424 = (top + 1);
-      top = x_424;
-      stack[x_424] = (p + 1);
-      const int x_429 = (top + 1);
-      top = x_429;
-      stack[x_429] = h_1;
-    }
-  }
-  return;
-}
-C:\src\tint\test\Shader@0x000001381E0F76E0(85,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001381E0F76E0(84,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.hlsl
deleted file mode 100644
index 8860431..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.hlsl
+++ /dev/null
@@ -1,236 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b1, space0) {
-  uint4 x_34[1];
-};
-cbuffer cbuffer_x_37 : register(b0, space0) {
-  uint4 x_37[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_257 = i;
-  const int x_259 = obj.numbers[x_257];
-  temp = x_259;
-  const int x_260 = i;
-  const int x_261 = j;
-  const int x_263 = obj.numbers[x_261];
-  obj.numbers[x_260] = x_263;
-  const int x_265 = j;
-  obj.numbers[x_265] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_269 = h;
-  const int x_271 = obj.numbers[x_269];
-  pivot = x_271;
-  const int x_272 = l;
-  i_1 = (x_272 - 1);
-  const int x_274 = l;
-  j_1 = x_274;
-  [loop] while (true) {
-    const int x_279 = j_1;
-    const int x_280 = h;
-    if ((x_279 <= (x_280 - 1))) {
-    } else {
-      break;
-    }
-    const int x_286 = obj.numbers[j_1];
-    if ((x_286 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_300 = h;
-  param_3 = x_300;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_306 = (top + 1);
-  top = x_306;
-  stack[x_306] = l_1;
-  const int x_310 = (top + 1);
-  top = x_310;
-  stack[x_310] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_320 = top;
-    top = (x_320 - 1);
-    const int x_323 = stack[x_320];
-    h_1 = x_323;
-    const int x_324 = top;
-    top = (x_324 - 1);
-    const int x_327 = stack[x_324];
-    l_1 = x_327;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_330 = performPartition_i1_i1_(param_4, param_5);
-    p = x_330;
-    if (((p - 1) > l_1)) {
-      const int x_338 = (top + 1);
-      top = x_338;
-      stack[x_338] = l_1;
-      const int x_342 = (top + 1);
-      top = x_342;
-      stack[x_342] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_353 = (top + 1);
-      top = x_353;
-      stack[x_353] = (p + 1);
-      const int x_358 = (top + 1);
-      top = x_358;
-      stack[x_358] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_108 = i_2;
-      const int x_111 = obj.numbers[i_2];
-      const int x_114 = obj.numbers[i_2];
-      obj.numbers[x_108] = (x_111 * x_114);
-    }
-  }
-  quicksort_();
-  const float4 x_120 = x_GLF_FragCoord;
-  const float2 x_123 = asfloat(x_34[0].xy);
-  uv = (float2(x_120.x, x_120.y) / x_123);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_126 = obj.numbers[0];
-  const float x_129 = color.x;
-  color.x = (x_129 + float(x_126));
-  const float x_133 = uv.x;
-  if ((x_133 > 0.25f)) {
-    const int x_138 = obj.numbers[1];
-    const float x_141 = color.x;
-    color.x = (x_141 + float(x_138));
-  }
-  const float x_145 = uv.x;
-  if ((x_145 > 0.5f)) {
-    const float x_150 = asfloat(x_37[0].y);
-    const int x_155 = obj.numbers[max((2 * int(x_150)), 2)];
-    const float x_158 = asfloat(x_37[0].y);
-    const int x_163 = obj.numbers[max((2 * int(x_158)), 2)];
-    const float x_167 = color.y;
-    color.y = (x_167 + max(float(x_155), float(x_163)));
-  }
-  const float x_171 = uv.x;
-  if ((x_171 > 0.75f)) {
-    const int x_176 = obj.numbers[3];
-    const float x_179 = color.z;
-    color.z = (x_179 + float(x_176));
-  }
-  const int x_183 = obj.numbers[4];
-  const float x_186 = color.y;
-  color.y = (x_186 + float(x_183));
-  const float x_190 = uv.y;
-  if ((x_190 > 0.25f)) {
-    const int x_195 = obj.numbers[5];
-    const float x_198 = color.x;
-    color.x = (x_198 + float(x_195));
-  }
-  const float x_202 = uv.y;
-  if ((x_202 > 0.5f)) {
-    const int x_207 = obj.numbers[6];
-    const float x_210 = color.y;
-    color.y = (x_210 + float(x_207));
-  }
-  const float x_214 = uv.y;
-  if ((x_214 > 0.75f)) {
-    const int x_219 = obj.numbers[7];
-    const float x_222 = color.z;
-    color.z = (x_222 + float(x_219));
-  }
-  const int x_226 = obj.numbers[8];
-  const float x_229 = color.z;
-  color.z = (x_229 + float(x_226));
-  const float x_233 = uv.x;
-  const float x_235 = uv.y;
-  if ((abs((x_233 - x_235)) < 0.25f)) {
-    const int x_242 = obj.numbers[9];
-    const float x_245 = color.x;
-    color.x = (x_245 + float(x_242));
-  }
-  const float3 x_249 = normalize(color);
-  frag_color = float4(x_249.x, x_249.y, x_249.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_5 = {frag_color, gl_Position};
-  return tint_symbol_5;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x0000015776479900(133,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x0000015776479900(132,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.hlsl
deleted file mode 100644
index dc4f441..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.hlsl
+++ /dev/null
@@ -1,236 +0,0 @@
-SKIP: FAILED
-
-struct QuicksortObject {
-  int numbers[10];
-};
-
-static QuicksortObject obj = (QuicksortObject)0;
-static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
-cbuffer cbuffer_x_34 : register(b1, space0) {
-  uint4 x_34[1];
-};
-cbuffer cbuffer_x_37 : register(b0, space0) {
-  uint4 x_37[1];
-};
-static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void swap_i1_i1_(inout int i, inout int j) {
-  int temp = 0;
-  const int x_257 = i;
-  const int x_259 = obj.numbers[x_257];
-  temp = x_259;
-  const int x_260 = i;
-  const int x_261 = j;
-  const int x_263 = obj.numbers[x_261];
-  obj.numbers[x_260] = x_263;
-  const int x_265 = j;
-  obj.numbers[x_265] = temp;
-  return;
-}
-
-int performPartition_i1_i1_(inout int l, inout int h) {
-  int pivot = 0;
-  int i_1 = 0;
-  int j_1 = 0;
-  int param = 0;
-  int param_1 = 0;
-  int param_2 = 0;
-  int param_3 = 0;
-  const int x_269 = h;
-  const int x_271 = obj.numbers[x_269];
-  pivot = x_271;
-  const int x_272 = l;
-  i_1 = (x_272 - 1);
-  const int x_274 = l;
-  j_1 = x_274;
-  [loop] while (true) {
-    const int x_279 = j_1;
-    const int x_280 = h;
-    if ((x_279 <= (x_280 - 1))) {
-    } else {
-      break;
-    }
-    const int x_286 = obj.numbers[j_1];
-    if ((x_286 <= pivot)) {
-      i_1 = (i_1 + 1);
-      param = i_1;
-      param_1 = j_1;
-      swap_i1_i1_(param, param_1);
-    }
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  param_2 = (i_1 + 1);
-  const int x_300 = h;
-  param_3 = x_300;
-  swap_i1_i1_(param_2, param_3);
-  return (i_1 + 1);
-}
-
-void quicksort_() {
-  int l_1 = 0;
-  int h_1 = 0;
-  int top = 0;
-  int stack[10] = (int[10])0;
-  int p = 0;
-  int param_4 = 0;
-  int param_5 = 0;
-  l_1 = 0;
-  h_1 = 9;
-  top = -1;
-  const int x_306 = (top + 1);
-  top = x_306;
-  stack[x_306] = l_1;
-  const int x_310 = (top + 1);
-  top = x_310;
-  stack[x_310] = h_1;
-  [loop] while (true) {
-    if ((top >= 0)) {
-    } else {
-      break;
-    }
-    const int x_320 = top;
-    top = (x_320 - 1);
-    const int x_323 = stack[x_320];
-    h_1 = x_323;
-    const int x_324 = top;
-    top = (x_324 - 1);
-    const int x_327 = stack[x_324];
-    l_1 = x_327;
-    param_4 = l_1;
-    param_5 = h_1;
-    const int x_330 = performPartition_i1_i1_(param_4, param_5);
-    p = x_330;
-    if (((p - 1) > l_1)) {
-      const int x_338 = (top + 1);
-      top = x_338;
-      stack[x_338] = l_1;
-      const int x_342 = (top + 1);
-      top = x_342;
-      stack[x_342] = (p - 1);
-    }
-    if (((p + 1) < h_1)) {
-      const int x_353 = (top + 1);
-      top = x_353;
-      stack[x_353] = (p + 1);
-      const int x_358 = (top + 1);
-      top = x_358;
-      stack[x_358] = h_1;
-    }
-  }
-  return;
-}
-
-void main_1() {
-  int i_2 = 0;
-  float2 uv = float2(0.0f, 0.0f);
-  float3 color = float3(0.0f, 0.0f, 0.0f);
-  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
-  i_2 = 0;
-  {
-    [loop] for(; (i_2 < 10); i_2 = (i_2 + 1)) {
-      obj.numbers[i_2] = (10 - i_2);
-      const int x_108 = i_2;
-      const int x_111 = obj.numbers[i_2];
-      const int x_114 = obj.numbers[i_2];
-      obj.numbers[x_108] = (x_111 * x_114);
-    }
-  }
-  quicksort_();
-  const float4 x_120 = x_GLF_FragCoord;
-  const float2 x_123 = asfloat(x_34[0].xy);
-  uv = (float2(x_120.x, x_120.y) / x_123);
-  color = float3(1.0f, 2.0f, 3.0f);
-  const int x_126 = obj.numbers[0];
-  const float x_129 = color.x;
-  color.x = (x_129 + float(x_126));
-  const float x_133 = uv.x;
-  if ((x_133 > 0.25f)) {
-    const int x_138 = obj.numbers[1];
-    const float x_141 = color.x;
-    color.x = (x_141 + float(x_138));
-  }
-  const float x_145 = uv.x;
-  if ((x_145 > 0.5f)) {
-    const float x_150 = asfloat(x_37[0].y);
-    const int x_155 = obj.numbers[max((2 * int(x_150)), 2)];
-    const float x_158 = asfloat(x_37[0].y);
-    const int x_163 = obj.numbers[max((2 * int(x_158)), 2)];
-    const float x_167 = color.y;
-    color.y = (x_167 + max(float(x_155), float(x_163)));
-  }
-  const float x_171 = uv.x;
-  if ((x_171 > 0.75f)) {
-    const int x_176 = obj.numbers[3];
-    const float x_179 = color.z;
-    color.z = (x_179 + float(x_176));
-  }
-  const int x_183 = obj.numbers[4];
-  const float x_186 = color.y;
-  color.y = (x_186 + float(x_183));
-  const float x_190 = uv.y;
-  if ((x_190 > 0.25f)) {
-    const int x_195 = obj.numbers[5];
-    const float x_198 = color.x;
-    color.x = (x_198 + float(x_195));
-  }
-  const float x_202 = uv.y;
-  if ((x_202 > 0.5f)) {
-    const int x_207 = obj.numbers[6];
-    const float x_210 = color.y;
-    color.y = (x_210 + float(x_207));
-  }
-  const float x_214 = uv.y;
-  if ((x_214 > 0.75f)) {
-    const int x_219 = obj.numbers[7];
-    const float x_222 = color.z;
-    color.z = (x_222 + float(x_219));
-  }
-  const int x_226 = obj.numbers[8];
-  const float x_229 = color.z;
-  color.z = (x_229 + float(x_226));
-  const float x_233 = uv.x;
-  const float x_235 = uv.y;
-  if ((abs((x_233 - x_235)) < 0.25f)) {
-    const int x_242 = obj.numbers[9];
-    const float x_245 = color.x;
-    color.x = (x_245 + float(x_242));
-  }
-  const float3 x_249 = normalize(color);
-  frag_color = float4(x_249.x, x_249.y, x_249.z, 1.0f);
-  gl_Position = x_GLF_pos;
-  return;
-}
-
-struct main_out {
-  float4 frag_color_1;
-  float4 gl_Position;
-};
-struct tint_symbol_1 {
-  float4 x_GLF_pos_param : TEXCOORD0;
-};
-struct tint_symbol_2 {
-  float4 frag_color_1 : TEXCOORD0;
-  float4 gl_Position : SV_Position;
-};
-
-main_out main_inner(float4 x_GLF_pos_param) {
-  x_GLF_pos = x_GLF_pos_param;
-  main_1();
-  const main_out tint_symbol_5 = {frag_color, gl_Position};
-  return tint_symbol_5;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
-  wrapper_result.frag_color_1 = inner_result.frag_color_1;
-  wrapper_result.gl_Position = inner_result.gl_Position;
-  return wrapper_result;
-}
-C:\src\tint\test\Shader@0x00000203506D3380(133,7-22): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x00000203506D3380(132,12-45): error X3531: can't unroll loops marked with loop attribute
-
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.hlsl
index b7efb3d..e2ee645 100755
--- a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.hlsl
index 318f425..89d932e 100755
--- a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.hlsl
index 6947f93..0bd5e2f 100755
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.hlsl
index 6c196a4..dea1e99 100755
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.hlsl
index 7aaf54b..88749bc 100755
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.hlsl
@@ -54,3 +54,5 @@
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
+Internal compiler error: access violation. Attempted to read from address 0x0000000000000048
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.hlsl
index 7aaf54b..88749bc 100755
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.hlsl
@@ -54,3 +54,5 @@
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
+Internal compiler error: access violation. Attempted to read from address 0x0000000000000048
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.hlsl
index 4cdacd9..8d28303 100755
--- a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.hlsl
index da48cd9..4498f29 100755
--- a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.hlsl
Binary files differ
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.hlsl
index 2836952..029e057 100644
--- a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.hlsl
@@ -268,8 +268,19 @@
       const int x_145 = GLF_live4index;
       const int x_146 = GLF_live4index;
       const float x_269 = GLF_live4obj.even_numbers[1];
-      GLF_live4obj.even_numbers[(((x_144 >= 0) & (x_145 < 10)) ? x_146 : 0)] = x_269;
-      GLF_live4obj.even_numbers[(((GLF_live4i >= 0) & (GLF_live4i < 10)) ? GLF_live4i : 0)] = 1.0f;
+      {
+        float tint_symbol_1[10] = GLF_live4obj.even_numbers;
+        tint_symbol_1[(((x_144 >= 0) & (x_145 < 10)) ? x_146 : 0)] = x_269;
+        GLF_live4obj.even_numbers = tint_symbol_1;
+      }
+      const int x_147 = GLF_live4i;
+      const int x_148 = GLF_live4i;
+      const int x_149 = GLF_live4i;
+      {
+        float tint_symbol_3[10] = GLF_live4obj.even_numbers;
+        tint_symbol_3[(((x_147 >= 0) & (x_148 < 10)) ? x_149 : 0)] = 1.0f;
+        GLF_live4obj.even_numbers = tint_symbol_3;
+      }
     }
   }
   param_24 = treeIndex_1;
@@ -337,27 +348,27 @@
 struct main_out {
   float4 x_GLF_color_1;
 };
-struct tint_symbol_1 {
+struct tint_symbol_5 {
   float4 gl_FragCoord_param : SV_Position;
 };
-struct tint_symbol_2 {
+struct tint_symbol_6 {
   float4 x_GLF_color_1 : SV_Target0;
 };
 
 main_out main_inner(float4 gl_FragCoord_param) {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
+  const main_out tint_symbol_8 = {x_GLF_color};
+  return tint_symbol_8;
 }
 
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
+tint_symbol_6 main(tint_symbol_5 tint_symbol_4) {
+  const main_out inner_result = main_inner(tint_symbol_4.gl_FragCoord_param);
+  tint_symbol_6 wrapper_result = (tint_symbol_6)0;
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
-C:\src\tint\test\Shader@0x0000028F1D72B060(35,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
-C:\src\tint\test\Shader@0x0000028F1D72B060(270,7-91): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x0000028F1D72B060(259,12-53): error X3531: can't unroll loops marked with loop attribute
+C:\src\tint\test\Shader@0x000001F7677BB400(35,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
+C:\src\tint\test\Shader@0x000001F7677BB400(145,3): warning X4000: use of potentially uninitialized variable (makeFrame_f1_)
+internal error: compilation aborted unexpectedly
 
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.hlsl
index dfa33a6..4c1b604 100644
--- a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.hlsl
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.hlsl
@@ -272,16 +272,27 @@
       const int x_145 = GLF_live4index;
       const int x_146 = GLF_live4index;
       const float x_269 = GLF_live4obj.even_numbers[1];
-      bool tint_tmp_1 = (x_144 >= 0);
-      if (tint_tmp_1) {
-        tint_tmp_1 = (x_145 < 10);
+      {
+        float tint_symbol_1[10] = GLF_live4obj.even_numbers;
+        bool tint_tmp_1 = (x_144 >= 0);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_145 < 10);
+        }
+        tint_symbol_1[((tint_tmp_1) ? x_146 : 0)] = x_269;
+        GLF_live4obj.even_numbers = tint_symbol_1;
       }
-      GLF_live4obj.even_numbers[((tint_tmp_1) ? x_146 : 0)] = x_269;
-      bool tint_tmp_2 = (GLF_live4i >= 0);
-      if (tint_tmp_2) {
-        tint_tmp_2 = (GLF_live4i < 10);
+      const int x_147 = GLF_live4i;
+      const int x_148 = GLF_live4i;
+      const int x_149 = GLF_live4i;
+      {
+        float tint_symbol_3[10] = GLF_live4obj.even_numbers;
+        bool tint_tmp_2 = (x_147 >= 0);
+        if (tint_tmp_2) {
+          tint_tmp_2 = (x_148 < 10);
+        }
+        tint_symbol_3[((tint_tmp_2) ? x_149 : 0)] = 1.0f;
+        GLF_live4obj.even_numbers = tint_symbol_3;
       }
-      GLF_live4obj.even_numbers[((tint_tmp_2) ? GLF_live4i : 0)] = 1.0f;
     }
   }
   param_24 = treeIndex_1;
@@ -349,27 +360,27 @@
 struct main_out {
   float4 x_GLF_color_1;
 };
-struct tint_symbol_1 {
+struct tint_symbol_5 {
   float4 gl_FragCoord_param : SV_Position;
 };
-struct tint_symbol_2 {
+struct tint_symbol_6 {
   float4 x_GLF_color_1 : SV_Target0;
 };
 
 main_out main_inner(float4 gl_FragCoord_param) {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
-  const main_out tint_symbol_4 = {x_GLF_color};
-  return tint_symbol_4;
+  const main_out tint_symbol_8 = {x_GLF_color};
+  return tint_symbol_8;
 }
 
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
-  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
-  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
+tint_symbol_6 main(tint_symbol_5 tint_symbol_4) {
+  const main_out inner_result = main_inner(tint_symbol_4.gl_FragCoord_param);
+  tint_symbol_6 wrapper_result = (tint_symbol_6)0;
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
 }
-C:\src\tint\test\Shader@0x000001C987F87080(35,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
-C:\src\tint\test\Shader@0x000001C987F87080(282,7-64): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll
-C:\src\tint\test\Shader@0x000001C987F87080(263,12-53): error X3531: can't unroll loops marked with loop attribute
+C:\src\tint\test\Shader@0x000001C9889DF080(35,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
+C:\src\tint\test\Shader@0x000001C9889DF080(149,3): warning X4000: use of potentially uninitialized variable (makeFrame_f1_)
+internal error: compilation aborted unexpectedly
 
